Korotkodul

СПБГУ_C_24_балла

Dec 26th, 2021 (edited)
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <string>
  7. #include <stack>
  8. #include <set>
  9. #include <map>
  10. #define pii pair <int,int>
  11. using namespace std;
  12. using ll = long long;
  13. using ld = long double;
  14. /*
  15. Перебор:
  16.  варианты, на каких осях меняем координаты (2^d)
  17. Варианты, чему равен r (очевидно, что r ограничен самой короткой осью – может, это можно как-то применить?)
  18. Варианты, на каких осях (+r), а на каких (-r).
  19. */
  20. void cv(vector <int> &v){
  21.     for (auto x: v) cout<<x<<' ';
  22.     cout<<"\n\n";
  23. }
  24.  
  25. ll d;
  26.  
  27. string two(int x, int sz){
  28.     string r = "";
  29.     while (x > 0){
  30.         r += ((x % 2) + 48);
  31.         x /= 2;
  32.     }
  33.     reverse(r.begin(), r.end());
  34.     while (r.size() < sz){
  35.         r = '0' + r;
  36.     }
  37.     return r;
  38. }
  39. vector <int> idx, now_axe;
  40. vector <int> axe;
  41. vector <int> qn; //queen
  42. vector <int> deep_axe;
  43. ll ans;
  44. ll inf = 998244353;
  45.  
  46.  
  47.  
  48. bool gd(){
  49.     bool r = 1;
  50.     for (int i = 0;i <idx.size();++i){
  51.         if (! (deep_axe[i] > 0 && deep_axe[i] <= axe[idx[i]] ) ){
  52.             r = 0;
  53.             break;
  54.         }
  55.     }
  56.     return r;
  57. }
  58.  
  59. int main()
  60. {
  61.     ios::sync_with_stdio(0);
  62.     cin.tie(0);
  63.     cout.tie(0);
  64.     cin>>d;
  65.     axe.resize(d); for (auto &x: axe) cin>>x;
  66.     qn.resize(d); for (auto &x: qn) cin>>x;
  67.     string ch_axe;
  68.  
  69.     for (int msk = 1; msk < (1 << d) ;++msk ){
  70.         ch_axe = two(msk, d);
  71.         idx.clear();
  72.         now_axe.clear();
  73.         for (int i = 0; i < d;++i){
  74.             if (ch_axe[i] == '1'){
  75.                 idx.push_back(i);
  76.                 now_axe.push_back(axe[i]);
  77.             }
  78.         }
  79.         //до куда двигаем r?
  80.         int till = *min_element(now_axe.begin(), now_axe.end());
  81.         //cout<<"till = "<<till<<"\n";
  82.         deep_axe.resize(idx.size());
  83.         string ch_r_s;
  84.         for (int ch_r = 0; ch_r < (1 << idx.size()); ++ch_r){
  85.             //cout<<two(ch_r, idx.size())<<"\n";
  86.             ch_r_s = two(ch_r, idx.size());
  87.             for (int r = 1; r < till; ++r){
  88.                 for (int i = 0; i < idx.size();++i){
  89.                     if (ch_r_s[i] == '1'){
  90.                         deep_axe[i] = qn[idx[i]] + r;
  91.                     }
  92.                     else{
  93.                         deep_axe[i] = qn[idx[i]] - r;
  94.                     }
  95.                 }
  96.                 if (!gd()) continue;
  97.                 ans++;
  98.                 ans %= inf;
  99.             }
  100.         }
  101.     }
  102.     cout<<ans<<"\n";
  103. }
  104. /*
  105. 4
  106. 2 3 4 5
  107. 2 1 3 4
  108. */
  109.  
Add Comment
Please, Sign In to add comment