超级水的线段树,主要是题目时间太宽松了,不然这题应该还是比较有难度的。。
第一次写结构体版的线段树,呵呵
#include<stdio.h>
typedef struct
{
int l,r,d;
}Node;
int SUM=0;
Node tree[15000*4];
void Build(int l,int r,int th){
tree[th].l=l;
tree[th].r=r;
tree[th].d=0;
if(l==r) return ;
int m=(tree[th].l+tree[th].r)/2;
Build(tree[th].l,m,th*2);
Build(m+1,tree[th].r,th*2+1);
}
void UpDate(int L,int R,int v,int th){
if(L<=tree[th].l&&tree[th].r<=R){
tree[th].d+=v;
return ;
}
int m=(tree[th].l+tree[th].r)/2;
if(m>=L) UpDate(L,R,v,th*2);
if(m<R) UpDate(L,R,v,th*2+1);
}
void Query(int i,int th){
SUM+=tree[th].d;
if(tree[th].l==i&&tree[th].r==i) return ;
int m=(tree[th].l+tree[th].r)/2;
if(m>=i) Query(i,th*2);
else Query(i,th*2+1);
}
int main(){
int T;
while(scanf("%d",&T)!=EOF){
Build(0,T,1);
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)!=EOF){
if(a==-1) break;
UpDate(a,b,c,1);
}
int posl,posr,max;
for(int i=0,max=0;i<=T;i++){
SUM=0;
Query(i,1);
if(SUM>max){
max=SUM;
posl=i;
}
}
for(int i=T,max=0;i>=0;i--){
SUM=0;
Query(i,1);
if(SUM>max){
max=SUM;
posr=i;
}
}
printf("%d %d\n",posl,posr);
}
}