| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
求大神看一下,线段树这样写不行吗?各种数据测试都通过 提交就WA
#include <stdio.h>
#include <string.h>
long long arr[200000], Sum[300000], addv[300000], _sum, c;
long long N, Q, a, b;
void initSum(long long o, long long L, long long R);
void update(long long o, long long L, long long R);
void query(long long o, long long L, long long R, long long add);
int main(){
char Cmd[10];
long long i;
scanf("%d%d", &N, &Q);
for(i=1; i<=N; i++) scanf("%d", &arr[i]);
initSum(1, 1, N);
memset(addv, 0, sizeof(addv));
while(Q--){
scanf("%s", Cmd);
if(Cmd[0] == 'Q'){
scanf("%lld%lld", &a, &b);
_sum = 0;
query(1, 1, N, 0);
printf("%lld\n", _sum);
}
else{
scanf("%lld%lld%lld", &a, &b, &c);
update(1, 1, N);
}
}
return 0;
}
void initSum(long long o, long long L, long long R){
if(L==R) Sum[o] = arr[L];
else{
long long M = (L+R)/2;
initSum(o*2, L, M);
initSum(o*2+1, M+1, R);
Sum[o] = Sum[o*2]+Sum[o*2+1];
}
}
void update(long long o, long long L, long long R){
if(a<=L && b>=R){
Sum[o] += c*(R-L+1);
addv[o] += c;
return ;
}
else{
long long M = (L+R)/2;
if(a<=M) update(o*2, L, M);
if(b>M) update(o*2+1, M+1, R);
}
Sum[o] = Sum[o*2]+Sum[o*2+1]+(R-L+1)*addv[o];
}
void query(long long o, long long L, long long R, long long add){
if(a<=L && b>=R){
_sum += Sum[o] + add*(R-L+1);
}
else{
long long M = (L+R)/2;
if(a<=M) query(o*2, L, M, add+addv[o]);
if(b>M) query(o*2+1, M+1, R, add+addv[o]);
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator