제출 #47458

#제출 시각아이디문제언어결과실행 시간메모리
47458mirbek01Worst Reporter 3 (JOI18_worst_reporter3)C++17
19 / 100
2053 ms8508 KiB
# include <bits/stdc++.h>

using namespace std;

const int N = 5e5 + 2;

long long n, q, d[N], p[N];

int main(){
      cin >> n >> q;

      int cn = 0;

      for(int i = 1; i <= n; i ++){
            cin >> d[i];
            if(d[i] == 1) cn ++;
      }

      if(cn == n){
            for(int i = 1; i <= q; i ++){
                  int t, l, r;
                  cin >> t >> l >> r;
                  int L = t - n, R = t;
                  if(l > R || L > r) {
                        cout << 0 << endl;
                        continue;
                  }
                  if(l <= L && R <= r){
                        cout << R - L + 1 << endl;
                        continue;
                  }
                  if(l <= L && L <= r){
                        cout << r - L + 1 << endl;
                        continue;
                  }
                  if(l <= R && R <= r){
                        cout << R - l + 1 << endl;
                        continue;
                  }
                  if(L <= l && r <= R){
                        cout << r - l + 1 << endl;
                        continue;
                  }
            }
            return 0;
      }

      for(int i = 1; i <= n; i ++){
            p[i] = -i;
      }

      for(int i = 2; i <= n; i ++){
            int lo = 0, hi = 1e9;
            while(hi - lo > 1){
                  int md = (lo + hi) >> 1;
                  if((p[i - 1] + d[i - 1] * md - p[i]) > d[i])
                        hi = md;
                  else
                        lo = md;
            }
            if((p[i - 1] + d[i - 1] * lo - p[i]) > d[i]) hi = lo;
            d[i] = p[i - 1] + d[i - 1] * hi - 1 - p[i];
      }

      for(int i = 1; i <= q; i ++){
            int t, l, r;
            cin >> t >> l >> r;
            p[0] = t;
            int cnt = 0;
            if(p[0] >= l && p[0] <= r) cnt ++;
            for(int j = 1; j <= n; j ++){
                  p[j] = -j;
                  p[j] += (p[j - 1] - p[j] - 1) / d[j] * d[j];
                  if(p[j] >= l & p[j] <= r) cnt ++;
            }
            cout << cnt << endl;
      }
}
/**
3 1
2
5
3
4 2 4
**/

컴파일 시 표준 에러 (stderr) 메시지

worst_reporter3.cpp: In function 'int main()':
worst_reporter3.cpp:74:27: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
                   if(p[j] >= l & p[j] <= r) cnt ++;
                      ~~~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...