您的位置:首页 > 其它

zoj 3573 Under Attack

2012-08-31 00:57 309 查看
更新的时候一定要确保更新到最后一排子节点,一开始忽略这个了,交了很多遍都是WA,所有的更新后在加一次更新,确保所有节点的add值为0.就可以了。

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
int n,q1,q2;
int ma;
struct node{
int l;
int r;
int add;
int sum;
}tree[150000];
void build_tree(int i,int l,int r)
{
int mid=(l+r)/2;
tree[i].l=l;
tree[i].r=r;
tree[i].add=0;
tree[i].sum=0;
if(tree[i].l==tree[i].r)
{
return;
}
build_tree(2*i,l,mid);
build_tree(2*i+1,mid+1,r);
tree[i].sum=tree[2*i].sum+tree[2*i+1].sum;
}

int updata(int i,int a,int b,int c)
{
if(tree[i].l==a&&tree[i].r==b)
{
tree[i].add+=c;
tree[i].sum+=(tree[i].r-tree[i].l+1)*c;
return tree[i].sum;
}
if(tree[i].add)
{
tree[2*i].add+=tree[i].add;
tree[2*i].sum+=(tree[2*i].r-tree[2*i].l+1)*tree[i].add;
tree[2*i+1].add+=tree[i].add;
tree[2*i+1].sum+=(tree[2*i+1].r-tree[2*i+1].l+1)*tree[i].add;
tree[i].add=0;
}
if(a>=tree[2*i+1].l)  return updata(2*i+1,a,b,c);
else if(b<=tree[2*i].r) return updata(2*i,a,b,c);
else
{
return updata(2*i,a,tree[2*i].r,c)+updata(2*i+1,tree[2*i+1].l,b,c);
}
tree[i].sum=tree[2*i].sum+tree[2*i+1].sum;
}
void updata1(int i)
{
if(tree[i].l==tree[i].r)
return;
if(tree[i].add)
{
tree[2*i].add+=tree[i].add;
tree[2*i].sum+=(tree[2*i].r-tree[2*i].l+1)*tree[i].add;
tree[2*i+1].add+=tree[i].add;
tree[2*i+1].sum+=(tree[2*i+1].r-tree[2*i+1].l+1)*tree[i].add;
tree[i].add=0;
}
updata1(2*i);
updata1(2*i+1);
}
void qurry1(int i)
{
//cout<<tree[i].sum<<endl;
if(tree[i].r==tree[i].l)
{
if(tree[i].sum>ma)
{
ma=tree[i].sum;
q1=tree[i].l;
}
// cout<<tree[i].sum<<endl;;
return;
}
qurry1(2*i);
qurry1(2*i+1);
}
void qurry2(int i)
{
if(tree[i].r==tree[i].l)
{
if(tree[i].sum>ma)
{
ma=tree[i].sum;
q2=tree[i].l;
}
return;
}
qurry2(2*i+1);
qurry2(2*i);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
build_tree(1,0,n);
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c))
{
if(a==-1) break;
updata(1,a,b,c);
}
updata1(1);
ma=-1;
qurry1(1);
ma=-1;
qurry2(1);
cout<<q1<<" "<<q2<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: