zoj 3573 Under Attack
来源:互联网 发布:开启445端口批处理 编辑:程序博客网 时间:2024/05/24 23:16
更新的时候一定要确保更新到最后一排子节点,一开始忽略这个了,交了很多遍都是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;}