线段树,但是要优化,增加一个MIN,一个max,表示区间的最小值和最大值,当区间的的Max<p时,可以直接加C,当区间的min>=p时直接加2*C,其实这个代码还是TLE了,实在不知道什么问题,后来直接交了几个别人过了的代码,包括偶像的,写的和我的都差不多。还是TLE,好吧,我好开心。。。。
我就当A了吧。。。
#include<stdio.h>
#include<string.h>
struct node{
int l;
int r;
__int64 min;
__int64 max;
__int64 add;
}tree[2000000];
int n,m,p,a,b,c;
__int64 max(__int64 a,__int64 b)
{
if(a>b)
return a;
return b;
}
__int64 min(__int64 a,__int64 b)
{
if(a<b)
return a;
return b;
}
void build_tree(int i,int l,int r)
{
tree[i].l=l;
tree[i].r=r;
tree[i].add=0;
tree[i].min=0;
tree[i].max=0;
if(tree[i].l==tree[i].r)
return;
int mid=(l+r)/2;
build_tree(2*i,l,mid);
build_tree(2*i+1,mid+1,r);
}
void updata(int i,int a,int b,int c)
{
if(a<=tree[i].l&&b>=tree[i].r)
{
if(tree[i].min>=p)
{
tree[i].add+=2*c;
tree[i].max+=2*c;
tree[i].min+=2*c;
return;
}
else if(tree[i].max<p)
{
tree[i].add+=c;
tree[i].max+=c;
tree[i].min+=c;
return;
}
}
if(tree[i].add)
{
tree[2*i].add+=tree[i].add;
tree[2*i].max+=tree[i].add;
tree[2*i].min+=tree[i].add;
tree[2*i+1].min+=tree[i].add;
tree[2*i+1].max+=tree[i].add;
tree[2*i+1].add+=tree[i].add;
tree[i].add=0;
}
if(a<=tree[2*i].r) updata(2*i,a,b,c);
if(b>=tree[2*i+1].l) updata(2*i+1,a,b,c);
tree[i].max=max(tree[2*i].max,tree[2*i+1].max);
tree[i].min=min(tree[2*i].min,tree[2*i+1].min);
}
void search(int i)
{
if(tree[i].r==tree[i].l)
{
if(tree[i].l!=1)
printf(" ");
printf("%d",tree[i].add);
return ;
}
if(tree[i].add)
{
tree[i*2].add+=tree[i].add;
tree[2*i+1].add+=tree[i].add;
tree[i].add=0;
}
search(2*i);
search(2*i+1);
}
int main()
{
while(scanf("%d%d%d",&n,&m,&p)!=EOF)
{
build_tree(1,1,n);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
updata(1,a,b,c);
}
search(1);
printf("\n");
}
return 0;
}