您的位置:首页 > 其它

ZOJ 3573 Under Attack (线段树版)

2013-11-11 21:29 357 查看
超级水的线段树,主要是题目时间太宽松了,不然这题应该还是比较有难度的。。

第一次写结构体版的线段树,呵呵

#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.l=l;
tree.r=r;
tree.d=0;
if(l==r) return ;
int m=(tree.l+tree.r)/2;
Build(tree.l,m,th*2);
Build(m+1,tree.r,th*2+1);
}
void UpDate(int L,int R,int v,int th){
if(L<=tree.l&&tree.r<=R){
tree.d+=v;
return ;
}
int m=(tree.l+tree.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.d;
if(tree.l==i&&tree.r==i) return ;
int m=(tree.l+tree.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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: