poj 4047 Garden

来源:互联网 发布:麦子金服怎么样 知乎 编辑:程序博客网 时间:2024/05/22 09:38

金华邀请赛的题,可惜现场赛我sb了,没想出来,还是队友想的……还是要不断的练习呀,隔断时间不练习就不会了大哭

#include <cstdlib>

#include <iostream>
#include <cstdio>

using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

const int maxn=222222;
int d[4*maxn],n,k,v[maxn],sum[maxn],co[4*maxn],val[maxn];

void make(int l,int r,int rt)
{
   co[rt]=0;  
   if(l==r)
   {
       if(l<k) d[rt]=-99999999;
       else d[rt]=sum[r]-sum[r-k];       
       val[l]=d[rt];
     //  cout<<rt<<" "<<d[rt]<<"  "<<l<<" "<<r<<endl;
       return;
   }     
   int m=(l+r)>>1;
   make(lson);
   make(rson);
   d[rt]=max(d[rt<<1],d[rt<<1|1]);
   //cout<<rt<<" "<<d[rt]<<"  "<<l<<" "<<r<<endl;
}
void pushdown(int rt)
{
    if(co[rt]!=0)   
    {
         co[rt<<1]+=co[rt];        
         co[rt<<1|1]+=co[rt];        
         d[rt<<1]+=co[rt];
         d[rt<<1|1]+=co[rt];
         co[rt]=0;
    }  
}
void insert(int L,int R,int val,int l,int r,int rt)
{
       if(L<=l&&R>=r)
       {
            co[rt]+=val;d[rt]+=val;return;
       }
       pushdown(rt);
       int m=(l+r)>>1;
       if(L<=m) insert(L,R,val,lson);
       if(R>m) insert(L,R,val,rson);
       d[rt]=max(d[rt<<1],d[rt<<1|1]);
}
int query(int L,int R,int l,int r,int rt)
{
    if(L<=l&&R>=r) return d[rt];    
    pushdown(rt);
    int m=(l+r)>>1;
    int ans1=-99999999,ans2=-99999999;
    if(L<=m) ans1=query(L,R,lson);
    if(R>m) ans2=query(L,R,rson);
    return max(ans1,ans2);
}
int main(int argc, char *argv[])
{
    int ca,m,id,a,b;
    scanf("%d",&ca);
    while(ca--)
    {
         scanf("%d %d %d",&n,&m,&k);
         for(int i=1;i<=n;i++)
           scanf("%d",&v[i]);
         sum[0]=0;
         for(int i=1;i<=n;i++)  
           sum[i]=sum[i-1]+v[i];
         make(1,n,1);  
       //  for(int i=1;i<=n;i++)
       //    cout<<val[i]<<" ";
         cout<<endl;  
         for(int i=0;i<m;i++)
         {
              scanf("%d %d %d",&id,&a,&b);        
              if(id==0) insert(a,a+k-1,b-v[a],1,n,1),v[a]=b;
              else if(id==1)
              {
                  insert(a,a+k-1,v[b]-v[a],1,n,1);
                  insert(b,b+k-1,v[a]-v[b],1,n,1);
                  int pre=v[a];
                  v[a]=v[b];
                  v[b]=pre;
              }
              else
               printf("%d\n",query(a+k-1,b,1,n,1));
         }
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}
/*
12
5 7 3
-1 2 -4 6 1
2 1 5
2 1 3
1 2 1
2 1 5
2 1 4
0 2 4
2 1 5
*/


原创粉丝点击