Advertisement
welleyth

CEOI 2022 Day 1. A

Jul 26th, 2022 (edited)
808
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.22 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4.  
  5. //#define int long long
  6. #define mp make_pair
  7. #define pb push_back
  8.  
  9. using namespace std;
  10. using namespace __gnu_pbds;
  11. mt19937 rnd(time(nullptr));
  12.  
  13. constexpr int N = (int)2e6 + 111;
  14.  
  15. int tr[N];
  16. int SUM = 0;
  17. void upd(int r,int x){
  18.     SUM += x;
  19.     for(int i = r; i < N; i |= i+1)
  20.         tr[i] += x;
  21.     return;
  22. }
  23. int get(int r){
  24.     int s = 0;
  25.     for(int i = r; i >= 0; i&=i+1,i--)
  26.         s += tr[i];
  27.     return s;
  28. }
  29. int getSuf(int r){
  30.     return SUM - get(r-1);
  31. }
  32. int a[N];
  33. int t[N],P[N];
  34. int n = 20,q = 20;
  35.  
  36. vector<int> brute(){
  37.     int b[n];
  38.     vector<int> ans;
  39.     int A[n+1][n];
  40.     for(int i = 0; i < n; i++){
  41.         A[0][i] = a[i];
  42.         b[i] = a[i];
  43.     }
  44.     int cnt = 0;
  45.     for(int i = 1;; i++){
  46.         int ptr[2] = {0,n/2};
  47.         int pos = 0;
  48.         while(ptr[0] < n/2 && ptr[1] < n){
  49.             if(A[i-1][ptr[0]] < A[i-1][ptr[1]]){
  50.                 A[i][pos++] = A[i-1][ptr[0]++];
  51.             } else {
  52.                 A[i][pos++] = A[i-1][ptr[1]++];
  53.             }
  54.         }
  55.         while(ptr[0] < n/2) A[i][pos++] = A[i-1][ptr[0]++];
  56.         while(ptr[1] < n) A[i][pos++] = A[i-1][ptr[1]++];
  57.         bool diff = false;
  58.         for(int j = 0; j < n; j++){
  59.             diff |= A[i-1][j] != A[i][j];
  60.         }
  61.         cnt++;
  62. //        for(int j = 0; j < n; j++)
  63. //            cout << A[i][j] << " ";
  64. //        cout << "\n";
  65.         if(!diff)
  66.             break;
  67.     }
  68.     for(int i = 0; i < q; i++){
  69.         t[i] = min(t[i],cnt);
  70.         ans.pb(A[t[i]][P[i]-1]);
  71.     }
  72.     return ans;
  73. }
  74.  
  75. tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> st;
  76. tree<pair<int,int>,null_type,less<pair<int,int>>,rb_tree_tag,tree_order_statistics_node_update> S[N];
  77. int parent[N];
  78. vector<pair<int,pair<int,int>>> Q;
  79. int ans[N];
  80.  
  81. void solve(){
  82.     n = (int)2e5, q = (int)1e6;
  83.     for(int i = 0; i <= n; i++) tr[i] = 0;
  84.     for(int i = 0; i <= n; i++) S[i].clear();
  85.     st.clear();
  86.     SUM = 0;
  87. //    cin >> n >> q;
  88. //    cout << n << " " << q << "\n";
  89.     vector<int> V(n);
  90.     iota(V.begin(),V.end(),1);
  91.     V[0] = 1;
  92.     for(int i = 1;i<=n/2;i+=1){
  93.         V[i] = n/2-i+2;
  94.     }
  95.     for(int i = n/2+1;i<n;i+=1){
  96.         V[i] = i+1;
  97.     }
  98. //    shuffle(V.begin(),V.end(),rnd);
  99.     for(int i = 0; i < n; i++){
  100.         a[i] = V[i];
  101. //        cout << a[i] << " ";
  102. //        cin >> a[i];
  103.     }
  104. //    cout << "\n";
  105.     for(int i = 0; i < q; i++){
  106. //        int t,pos;
  107.         t[i] = rnd()%n;
  108.         P[i] = rnd()%n+1;
  109. //        cin >> t[i] >> P[i];
  110.         t[i] = min(t[i],n/2);
  111.         Q.pb(mp(t[i],mp(P[i],i)));
  112.     }
  113.     sort(Q.begin(),Q.end());
  114.     vector<pair<int,int>> v;
  115.     bool used[n+1];
  116.     for(int i = 0; i <= n; i++){
  117.         used[i] = false;
  118.     }
  119.     for(int i = 0; i < n; i++){
  120.         v.pb(mp(a[i],i));
  121.     }
  122.     sort(v.rbegin(),v.rend());
  123.     for(auto&[x,pos] : v){
  124.         if(used[pos])
  125.             continue;
  126.         if(pos < n/2){
  127.             int cnt = 0;
  128.             for(int i = pos; i < n/2; i++){
  129.                 if(used[i])
  130.                     break;
  131.                 S[x].insert(mp(i,a[i]));
  132.                 used[i] = 1;
  133.                 parent[a[i]] = x;
  134.                 cnt++;
  135.             }
  136.             st.insert(x);
  137.             upd(x,cnt);
  138.         } else {
  139.             int cnt = 0;
  140.             for(int i = pos; i < n; i++){
  141.                 if(used[i])
  142.                     break;
  143.                 S[x].insert(mp(i,a[i]));
  144.                 used[i] = 1;
  145.                 parent[a[i]] = x;
  146.                 cnt++;
  147.             }
  148.             st.insert(x);
  149.             upd(x,cnt);
  150.         }
  151.     }
  152. //    cerr << "st: ";
  153. //    for(auto& x : st)
  154. //        cerr << x << " ";
  155. //    cerr << "\n";
  156.     int cur_t = 1;
  157.     bool all = false;
  158. //    return;
  159.     for(auto& query : Q){
  160.         int& t = query.first;
  161.         int& pos = query.second.first;
  162.         int& id = query.second.second;
  163.         if(t == 0){
  164.             ans[id] = a[pos-1];
  165.             continue;
  166.         }
  167.         while(!all && cur_t < t){
  168.             int l = 0, r = st.size();
  169.             while(r - l > 1){
  170.                 int m = (l+r)>>1;
  171.                 int x = *st.find_by_order(m);
  172.                 int tl = getSuf(x);
  173.                 if(tl > n/2)
  174.                     l = m;
  175.                 else
  176.                     r = m;
  177.             }
  178.             int x = *st.find_by_order(l);
  179.             int y = *st.find_by_order(l+1);
  180. //            cerr << "x = " << x << ", y = " << y << "\n";
  181.             int tr = getSuf(y);
  182. //            cerr << "tr = " << tr << "\n";
  183.             if(tr+1 > n/2){
  184.                 all = true;
  185. //                cerr << "broke\n";
  186.                 break;
  187.             }
  188.             int delta = n/2 - tr;
  189.             vector<int> cur;
  190. //            cerr << "delete: ";
  191.             assert(S[x].size() >= delta);
  192.             for(int i = 0; i < delta; i++){
  193.                 auto p = *(--S[x].end());
  194.                 cur.pb(p.second);
  195. //                cerr << p.second << " ";
  196.                 S[x].erase(--S[x].end());
  197.             }
  198. //            cerr << "\n";
  199.  
  200.             upd(x,-delta);
  201.             reverse(cur.begin(),cur.end());
  202.             v.clear();
  203.             for(int i = 0; i < cur.size(); i++) used[i] = false;
  204.             for(int i = 0; i < cur.size(); i++){
  205.                 v.pb(mp(cur[i],i));
  206.             }
  207.             sort(v.rbegin(),v.rend());
  208.             for(int i = 0; i < v.size(); i++){
  209.                 int xx = v[i].first;
  210.                 int pos = v[i].second;
  211.                 if(used[pos])
  212.                     continue;
  213.                 int cnt = 0;
  214.                 for(int j = pos; j < cur.size(); j++){
  215.                     if(used[j])
  216.                         break;
  217.                     S[xx].insert(mp(j,cur[j]));
  218.                     used[j] = 1;
  219.                     parent[cur[j]] = xx;
  220.                     cnt++;
  221.                 }
  222.                 upd(xx,cnt);
  223.                 st.insert(xx);
  224.             }
  225.             cur_t++;
  226.         }
  227. //        cerr << "cur_t = " << cur_t << "\n";
  228.         int l = 0, r = st.size();
  229.         while(r - l > 1){
  230.             int m = (l+r)>>1;
  231.             int x = *st.find_by_order(m);
  232.             if(getSuf(x) >= n - pos + 1)
  233.                 l = m;
  234.             else
  235.                 r = m;
  236.         }
  237. //        cerr << "l,r = " << l << " " << r << "\n";
  238.         int x = *st.find_by_order(l);
  239. //        cerr << "x = " << x << "\n";
  240.         int sz = S[x].size();
  241.         int suffSum = 0;
  242.         if(l + 1 != st.size()){
  243.             int y = *st.find_by_order(l+1);
  244.             suffSum = getSuf(y);
  245.         }
  246. //        cerr << "suffSum = " << suffSum << "\n";
  247.         int cur_pos = (n - pos + 1) - suffSum;
  248.         cur_pos = S[x].size() - cur_pos;
  249. //        cerr << "cur_pos = " << cur_pos << "\n";
  250.         ans[id] = (S[x].find_by_order(cur_pos))->second;
  251.     }
  252. //    cout << "cur_t = " << cur_t << "\n";
  253.  
  254. //    vector<int> bruteAns = brute();
  255.  
  256.     for(int i = 0; i < q; i++){
  257. //        if(ans[i] != bruteAns[i]){
  258. //            for(int j = 0; j < n; j++){
  259. //                cout << a[j] << " ";
  260. //            }
  261. //            cout << "\n";
  262. //            cout << "WA\n";
  263. //            cout << t[i] << " " << P[i] << "\n";
  264. //            cout << "expected " << bruteAns[i] << ", found = " << ans[i] << "\n";
  265. ////            cout << ans[i] << "\n";
  266. //            exit(0);
  267. //        }
  268.         cout << ans[i] << "\n";
  269.     }
  270. //    cout << "AC\n";
  271.     return;
  272. }
  273.  
  274. signed main(){
  275.     ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
  276.     int tests = 1;
  277. //    cin >> tests;
  278.     for(int test = 1; test <= tests; test++){
  279.         solve();
  280.     }
  281.     return 0;
  282. }
  283. /**
  284. 41 6 22 18 20 33 44 15 5 32 49 16 38 19 46 36 37 8 25 43 39 12 47 23 10 13 2 9 31 30 35 50 14 48 17 11 7 45 34 3 27 24 40 42 29 21 26 1 4 28
  285. 41 6 22 18 20 33 44 15 5 32 49 16 38 19 46 36 37 8 25 43 39 12 47 23 10 13 2 9 31 30 35 50 14 48 17 11 7 45 34 3 27 24 40 42 29 21 26 1 4 28
  286. WA
  287. 4 9
  288. expected 6, found = 12
  289. 50 1
  290. 18 9 38 21 45 49 26 48 23 27 25 15 10 36 5 1 29 14 50 8 2 19 13 20 6 3 33 12 17 37 39 47 22 16 40 46 32 4 42 30 35 34 41 7 11 44 43 28 31 24
  291. 9 5
  292. WA
  293. expected 30, found = 28
  294.  
  295. **/
  296.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement