Advertisement
Jaydeep999997

SRM 675 P1

Oct 8th, 2020
805
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.23 KB | None | 0 0
  1. const int sz = 20000;
  2. struct query {
  3.     int s, e, k, m, res;
  4. } qu[105];
  5. int qn, cnt[105];
  6. const int mod = 1000000007;
  7. inline bool cmp(query q1, query q2) {
  8.     return q1.m < q2.m;
  9. }
  10. class LimitedMemorySeries1 {
  11. public:
  12.     void upd(int X) {
  13.         int lo = 0, hi = qn - 1, md, F = qn;
  14.         while (lo <= hi) {
  15.             md = (lo + hi) / 2;
  16.             if (qu[md].m < X) lo = md + 1;
  17.             else {
  18.                 F = min(F, md);
  19.                 hi = md - 1;
  20.             }
  21.         }
  22.         cnt[F]++;
  23.     }
  24.     long long getSum(int n, int x0, int a, int b, vector <int> q) {
  25.         sort(q.begin(), q.end());
  26.         qn = q.size();
  27.         for (int i = 0; i < qn; i++) qu[i] = { 0, mod - 1, q[i], 0, mod - 1 };
  28.         long long res = 0;
  29.         for (int K = 0; K < 32; K++) {
  30.             for (int i = 0; i < qn; i++) qu[i].m = (qu[i].s + qu[i].e) / 2;
  31.             sort(qu, qu + qn, cmp);
  32.             for (int i = 0; i < qn; i++) cnt[i] = 0;
  33.             int qi = 0;
  34.             long long X;
  35.             X = x0;
  36.             upd(X);
  37.             for (int i = 1; i < n; i++) {
  38.                 X = (X*a + b) % mod;
  39.                 upd(X);
  40.             }
  41.             for (int i = 1; i < qn; i++) cnt[i] += cnt[i - 1];
  42.             for (int i = 0; i < qn; i++) {
  43.                 if (cnt[i] > qu[i].k) qu[i].e = qu[i].m - 1, qu[i].res = min(qu[i].res, qu[i].m);
  44.                 else qu[i].s = qu[i].m + 1;
  45.             }
  46.         }
  47.         for (int i = 0; i < qn; i++) res += qu[i].res;
  48.         return res;
  49.     }
  50. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement