Advertisement
Korotkodul

RIVER

Dec 1st, 2021 (edited)
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.62 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <set>
  5. #include <string>
  6. #include <algorithm>
  7. using namespace std;
  8. using ll = long long;
  9. using ld = long double;
  10. void cv(vector <ll> v){
  11.     for (auto x: v) cout<<x<<' ';
  12.     cout<<'\n';
  13. }
  14.  
  15. vector <ll> rv(1);
  16. vector <vector <ll> > rt(1);
  17. int n=1,p=1;
  18.  
  19. vector <ll> S;
  20. ll sz = 1, sq = 1;
  21. void make(){
  22.     cout<<"river\n";
  23.     cv(rv);
  24.     cout<<"making rt\n";
  25.     sz = sqrt(n);
  26.     sq = sqrt(n);
  27.     while (sz * sq < n){
  28.         sz++;
  29.     }
  30.     cout<<"sz= "<<sz<<'\n';
  31.     cout<<"sq= "<<sq<<"\n";
  32.     rt.resize(sz);
  33.     S.resize(sz, 0);
  34.     for (int i=0;i<sz;++i){
  35.         rt[i].resize(sq);
  36.     }
  37.     rt[sz-1].resize(sq - (sz*sq - n));
  38.     cout<<"rt: size = "<<rt.size()<<" "<<rt[0].size()<<"\n";
  39.     for (int i = 0; i < sz; ++i){
  40.         cout<<"i = "<<i<<"\n";
  41.         cout<<"rt[i].size()= "<<rt[i].size()<<"\n";
  42.         for (int j = 0; i * sq + j < n && j < sq; ++j){
  43.             cout<<"j= "<<j<<"\n";
  44.             int id = i * sq + j;
  45.             cout<<"id = "<<id<<"\n";
  46.             rt[i][j] = rv[id];
  47.             cout<<"rt[i][j]= "<<rt[i][j]<<"\n";
  48.             S[i] += rv[id] * rv[id];
  49.         }
  50.     }
  51.     cout<<"rt made\n";
  52.     for (int i = 0;i<rt.size();++i){
  53.         cout<<"i = "<<i<<"\n";
  54.         cout<<"size= "<<rt[i].size()<<"\n";
  55.         for(int j=0;j<rt[i].size();++j){
  56.             cout<<rt[i][j]<<" ";
  57.         }cout<<"\n";
  58.     }cout<<"\n";
  59.     cout<<"S\n";
  60.     cv(S);
  61. }
  62.  
  63. void bnk(int id){
  64.     int prt_id = id / sq;
  65.     int ix  = id - prt_id * sq;
  66.     cout<<"prt_id = "<<prt_id<<"  ix = "<<ix<<"\n";
  67.     ll L = rt[prt_id][ix] / 2;
  68.     ll R = rt[prt_id][ix] - L;
  69.     cout<<"LR= "<<L<<' '<<R<<"\n";
  70.     //предусмотреть случай, когда эта штука пустеет и нужно переходить в следующую
  71.     if (rt[prt_id].size() == 1){
  72.             cout<<"ZERO\n";
  73.         if (prt_id == 0){
  74.             cout<<"Z-one\n";
  75.             rt[prt_id+1][0] += (L + R);
  76.             S[prt_id+1] += L*L + R*R;
  77.         }else if (prt_id == rt.size()-1){
  78.             cout<<"Z-two\n";
  79.             rt[prt_id-1][ rt[prt_id-1].size() - 1 ] += (L + R);
  80.             S[prt_id-1] += L*L + R*R;
  81.         }
  82.         else{
  83.             cout<<"Z-three\n";
  84.             rt[prt_id+1][0] += R;
  85.             S[prt_id+1] += R*R;
  86.             rt[prt_id-1][ rt[prt_id-1].size() - 1 ] += L;
  87.             S[prt_id-1] += L*L;
  88.         }
  89.         rt.erase(rt.begin() + prt_id);
  90.         S.erase(S.begin() + prt_id);
  91.     }
  92.     else if (ix > 0 && ix < rt[prt_id].size()-1){
  93.         cout<<"ONE\n";
  94.         S[prt_id] -= rt[prt_id][ix] * rt[prt_id][ix];
  95.         S[prt_id] -= rt[prt_id][ix-1] * rt[prt_id-1][ix];
  96.         S[prt_id] -= rt[prt_id][ix+1] * rt[prt_id+1][ix];
  97.         rt[prt_id][ix-1] += L;
  98.         S[prt_id] += rt[prt_id][ix-1] * rt[prt_id-1][ix];
  99.         rt[prt_id][ix+1] += R;
  100.         S[prt_id] += rt[prt_id][ix+1] * rt[prt_id+1][ix];
  101.         rt[prt_id].erase(rt[prt_id].begin() + ix);
  102.         cv(rt[prt_id]);
  103.     } else if (ix == 0){
  104.         cout<<"TWO\n";
  105.         S[prt_id] -= rt[prt_id][ix] * rt[prt_id][ix];
  106.         S[prt_id] -= rt[prt_id][ix+1] * rt[prt_id+1][ix];
  107.         rt[prt_id][ix+1] += (R + L);
  108.         S[prt_id] += rt[prt_id][ix+1] * rt[prt_id+1][ix];
  109.         rt[prt_id].erase(rt[prt_id].begin());
  110.         cv(rt[prt_id]);
  111.     } else {
  112.         cout<<"THREE\n";
  113.         S[prt_id] -= rt[prt_id][ix] * rt[prt_id][ix];
  114.         S[prt_id] -= rt[prt_id][ix-1] * rt[prt_id-1][ix];
  115.         rt[prt_id][ix-1] += (R + L);
  116.         S[prt_id] += rt[prt_id][ix-1] * rt[prt_id-1][ix];
  117.         rt[prt_id].erase(rt[prt_id].end()-1);
  118.         cv(rt[prt_id]);
  119.     }
  120.  
  121. }
  122. /*осталось создать методы:
  123. (1) если размер какого-то из векторов в векторе стал больше чем 2*sqrt(n), то поделить вектор на 2 вектора;
  124. (2)dv() - делать один отрезок реки на 2 отрезка и соответствующий пересчёт
  125. Потом надо это протестить, продебажить и получить OK
  126. */
  127. void dv(int id){
  128.  
  129. }
  130.  
  131. /*
  132. 10
  133. 0 1 2 3 4 5 6 7 8 9
  134. */
  135.  
  136. int main()
  137. {
  138.     /*ios::sync_with_stdio(0);
  139.     cin.tie(0);
  140.     cout.tie(0);*/
  141.  
  142.     //cin>>n>>p;
  143.     cin>>n;
  144.     rv.resize(n);
  145.     //for (auto &x: rv) cin>>x;
  146.     for (int i=0;i<n;++i){
  147.         rv[i] = i;
  148.     }
  149.     make();
  150.     int k;
  151.     cin>>k;
  152.     for (int i=0;i<k;++i){
  153.         int e,v;
  154.         cin>>e>>v;
  155.         //v--;
  156.         if (e == 1){
  157.             bnk(v);
  158.         }
  159.         else {
  160.             dv(v);
  161.         }
  162.     }
  163. }
  164.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement