这题本来是不难的,结果会长把may not写成may超过64位,我试 unsigned long long试了3次,才注意到有负数,用double交了两次过了后,听说int就能过...
内心是崩溃的...
题目大意:
You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.
The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1, A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of Aa, Aa+1, ... , Ab.(有多组测试数据)
You need to answer all Q commands in order. One answer in a line.The sums may exceed the range of 64-bit integers
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define maxn 110010 #define left L,m,rt<<1 #define right m+1,R,rt<<1|1 double sum[maxn<<2]; double col[maxn<<2]; int flag; void up(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void down(int rt,int m) { if(col[rt]) { sum[rt<<1]+=col[rt]*(m-(m>>1)); sum[rt<<1|1]+=col[rt]*(m>>1); col[rt<<1]+=col[rt]; col[rt<<1|1]+=col[rt]; col[rt]=0; } } void build(int L,int R,int rt) { if(L==R) { scanf("%lf",&sum[rt]); return; } int m=(L+R)>>1; build(left); build(right); up(rt); } void update(int l,int r,int c,int L,int R,int rt) { if(l<=L&&r>=R) { sum[rt]+=c*(R-L+1); col[rt]+=c; return; } down(rt,R-L+1); int m=(L+R)/2; if(l<=m)update(l,r,c,left); if(r>m)update(l,r,c,right); up(rt); } double query(int l,int r,int L,int R,int rt) { if(l<=L&&r>=R) { return sum[rt]; } down(rt,R-L+1); int m=(L+R)/2; double sum1=0; if(l<=m) { sum1+=query(l,r,left); } if(r>m) { sum1+=query(l,r,right); } return sum1; } int main() { int N,l,r,i,M,a,b,c; char op[2]; while(~scanf("%d%d",&N,&M)) { memset(col,0,sizeof(col)); build(1,N,1); while(M--) { scanf("%s",op); if(op[0]=='Q') { scanf("%d%d",&l,&r); printf("%.0f\n",query(l,r,1,N,1)); } else { scanf("%d%d%d",&l,&r,&c); update(l,r,c,1,N,1); } } } return 0; }