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;}

原创粉丝点击