题目
输入输出样例
输入 #1
3 2 4 0 2 A 1 3 5 Q 2 3 5 1 3 2 3 1 1 2 2 3 3
输出 #1
1 2 1 1 1 0
输入 #2
17 25 4098 310 2622 A 10 16 657212040 A 4 15 229489140 A 1 2 -433239891 A 3 12 532385784 A 10 17 56266644 A 8 10 10038874 A 6 9 13084764 A 4 5 -9206340 Q 2 8 A 2 4 -43223955 A 6 9 31478706 A 2 4 189818310 A 2 8 179421180 A 2 8 40354938 Q 8 14 A 3 6 57229575 A 6 13 132795740 A 2 17 14558022 A 14 15 -552674185 A 5 11 -1104138 Q 2 12 Q 1 14 A 3 9 524902182 A 8 12 114291440 A 3 7 107531442 1 11 12
输出 #2
3 6 7 8 2
输入 #3
20 3 4317 1020 2232 A 8 15 -434078222 A 1 2 54988154 A 13 19 81757858 15 7 11 3 5 3 9 6 9 9 13 6 19 1 20 3 5 3 10 1 7 2 14 6 10 2 3 2 3 10 12
输出 #3
View Code
0 0 0 0 0 2 2 0 0 0 0 0 0 0 0
分析
这道题呢,如果你真想用线段树 or 树状数组硬刚,其实也是刚得出来的
但是,不要忘了,区间修改还有一种方法:差分数组
别急,我们先看看数据范围:opt中的Q<=1000,说明,暴力的询问是可以的,前缀和就好
关于final?不要忘了可以离线,因为没有修改
delta与sum数组都不要取模
取了的话负数的模值会受影响
代码
1 /********************** 2 User:Mandy.H.Y 3 Language:c++ 4 Problem:luogu3948 5 Problem: 6 Algorithm: 7 **********************/ 8 9 #include<bits/stdc++.h> 10 11 //delta与sum数组都不要取模 12 //取了的话负数的模值会受影响 13 14 using namespace std; 15 16 const int maxn = 8e4 + 5; 17 const int maxm = 1e6 + 5; 18 const int maxf = 1e7 + 5; 19 20 long long n,mod,mi,ma,opt; 21 long long delta[maxn],sum[maxn]; 22 long long cnt[maxn]; 23 24 template<class T>inline void read(T &x){ 25 x = 0;bool flag = 0;char ch = getchar(); 26 while(!isdigit(ch)) flag |= ch == '-',ch = getchar(); 27 while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48),ch = getchar(); 28 if(flag) x = -x; 29 } 30 31 template<class T>void putch(const T x){ 32 if(x > 9) putch(x / 10); 33 putchar(x % 10 | 48); 34 } 35 36 template<class T>void put(const T x){ 37 if(x < 0) putchar('-'),putch(-x); 38 else putch(x); 39 } 40 41 void file(){ 42 freopen("3948.in","r",stdin); 43 // freopen("3948.out","w",stdout); 44 } 45 46 void readdata(){ 47 read(n);read(opt); 48 read(mod);read(mi);read(ma); 49 } 50 51 52 void work(){ 53 while(opt --){ 54 char c = getchar(); 55 long long l,r,x; 56 while(c != 'A' && c != 'Q') c = getchar(); 57 if(c == 'A'){ 58 read(l);read(r);read(x); 59 delta[l] += x; 60 delta[r + 1] -= x; 61 } 62 else if(c == 'Q'){ 63 int num = 0;sum[0]=0; 64 read(l);read(r); 65 for(long long i = 1;i <= r; ++ i){ 66 sum[i] = sum[i-1] + delta[i]; 67 if(i >= l){ 68 x = sum[i] * i % mod; 69 if(mi <= x && x <= ma) ++num ; 70 } 71 } 72 put(num); 73 putchar(' '); 74 } 75 } 76 int final; 77 read(final); 78 for(int i = 1;i <= n; ++ i){ 79 cnt[i] = cnt[i-1]; 80 sum[i] = sum[i-1] + delta[i]; 81 long long x = sum[i] * i % mod; 82 if(mi <= x && x <= ma) ++cnt[i]; 83 } 84 85 while(final--){ 86 int l,r; 87 read(l);read(r); 88 put(cnt[r] - cnt[l-1]); 89 putchar(' '); 90 } 91 } 92 93 int main(){ 94 // file(); 95 readdata(); 96 work(); 97 return 0; 98 }