这么简单的一个线段树我TLE了1个小时。。。我还一直以为是数据类型之间的差异引起的TLE,结果是必须写成优化的线段树- -#,懒惰就该有个惩罚。。。(优化就多那么几行,不应该偷懒啊~~)
弱弱的说一句:wow~C++的效率比G++高好多。。。(同一段代码)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#define N 100005
using namespace std;
long long ans,num[N];
struct xx
{
int l,r;
long long cover,d;
} tree[4*N+100];
void creat_tree(int x,int a,int b)
{
tree[x].l=a;tree[x].r=b;tree[x].d=0;
if(a==b){tree[x].cover=num[a];return;}
int mid=(a+b)/2;
creat_tree(x*2,a,mid);creat_tree(x*2+1,mid+1,b);
tree[x].cover=tree[2*x].cover+tree[2*x+1].cover;
}
void update(int x,int a,int b,long long c)
{
if(tree[x].r<a||tree[x].l>b)return;
if(a<=tree[x].l&&tree[x].r<=b)
{
tree[x].d+=c;
tree[x].cover+=c*(tree[x].r-tree[x].l+1);
return;
}
if(tree[x].d)
{
tree[2*x].cover+=tree[x].d*(tree[2*x].r-tree[2*x].l+1);
tree[2*x+1].cover+=tree[x].d*(tree[2*x+1].r-tree[2*x+1].l+1);
tree[2*x].d+=tree[x].d;
tree[2*x+1].d+=tree[x].d;
tree[x].d=0;
}
if(tree[x].r==tree[x].l){tree[x].cover+=c;return;}
int mid=(tree[x].l+tree[x].r)/2;
if(mid>=a)update(2*x,a,b,c);
if(mid<b)update(2*x+1,a,b,c);
tree[x].cover=tree[2*x].cover+tree[2*x+1].cover;
}
void counts(int x,int a,int b)
{
if(tree[x].r<a||tree[x].l>b)return;
if(a<=tree[x].l&&tree[x].r<=b){ans+=tree[x].cover;return;}
if(tree[x].d)
{
tree[2*x].cover+=tree[x].d*(tree[2*x].r-tree[2*x].l+1);
tree[2*x+1].cover+=tree[x].d*(tree[2*x+1].r-tree[2*x+1].l+1);
tree[2*x].d+=tree[x].d;
tree[2*x+1].d+=tree[x].d;
tree[x].d=0;
}
int mid=(tree[x].l+tree[x].r)/2;
if(mid>=a)counts(2*x,a,b);
if(mid<b)counts(2*x+1,a,b);
}
int main()
{
int m,n,x,y;
long long z;
char ope;
cin>>m>>n;
memset(tree,0,sizeof(tree));
memset(num,0,sizeof(num));
for(int i=1;i<=m;i++)scanf("%lld",&num[i]);
creat_tree(1,1,m);
while(n>0)
{
n--;
scanf(" %c",&ope);
if(ope=='C'){scanf("%d%d%lld",&x,&y,&z);update(1,x,y,z);}
else {scanf("%d%d",&x,&y);ans=0;counts(1,x,y);printf("%lld\n",ans);}
}
return 0;
}