• uva 11992 Fast Matrix Operations


    这道题很狗血啊 赋值的时候那个v是大于等于0来着,主要考察区间赋值和更新,pushdown同时要有两个操作。代码如下:

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 using namespace std;
      5 const int maxn=1000000+5;
      6 const int  INF=1000000009;
      7 int sum[maxn<<2];
      8 int maxv[maxn<<2];
      9 int minv[maxn<<2];
     10 int add[maxn<<2];
     11 int setv[maxn<<2];
     12 int ansmin,ansmax;
     13 int row,col;
     14 void PushUp(int rt)
     15 {
     16    maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]);
     17    minv[rt]=min(minv[rt<<1],minv[rt<<1|1]);
     18    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
     19 }
     20 void PushDown(int rt,int len)
     21 {
     22     if(setv[rt]>=0)
     23     {
     24         add[rt<<1]=add[rt<<1|1]=0;//这一步没写好啊,要为下面的add做准备。
     25         maxv[rt<<1]=minv[rt<<1]=maxv[rt<<1|1]=minv[rt<<1|1]=setv[rt];
     26         sum[rt<<1]=setv[rt]*(len-len/2);
     27         sum[rt<<1|1]=setv[rt]*(len/2);
     28         setv[rt<<1]=setv[rt<<1|1]=setv[rt];
     29         setv[rt]=-1;
     30     }
     31      if(add[rt])
     32      {
     33         sum[rt<<1]+=add[rt]*(len-len/2);
     34         maxv[rt<<1]+=add[rt];
     35         minv[rt<<1]+=add[rt];
     36         sum[rt<<1|1]+=add[rt]*(len/2);
     37         maxv[rt<<1|1]+=add[rt];
     38         minv[rt<<1|1]+=add[rt];
     39         add[rt<<1]+=add[rt];
     40         add[rt<<1|1]+=add[rt];
     41         add[rt]=0;
     42      }
     43 }
     44 void build(int l,int r,int rt)
     45 {
     46     if(l==r)
     47     {
     48         sum[rt]=maxv[rt]=minv[rt]=0;
     49         return ;
     50     }
     51     int m=(l+r)>>1;
     52     build(l,m,rt<<1);
     53     build(m+1,r,rt<<1|1);
     54     PushUp(rt);
     55 }
     56 void update(int L,int R,int inc,int l,int r,int rt)
     57 {
     58   if(L<=l&&r<=R)
     59   {
     60       sum[rt]+=inc*(r-l+1);
     61       maxv[rt]+=inc;
     62       minv[rt]+=inc;
     63       add[rt]+=inc;
     64       return ;
     65   }
     66   PushDown(rt,r-l+1);
     67   int m=(l+r)>>1;
     68   if(L<=m) update(L,R,inc,l,m,rt<<1);
     69   if(R>m) update(L,R,inc,m+1,r,rt<<1|1);
     70   PushUp(rt);
     71 }
     72 void set_val(int L,int R,int v,int l,int r,int rt)
     73 {
     74   if(L<=l&&r<=R)
     75   {
     76       add[rt]=0;//这一步很重要
     77       maxv[rt]=minv[rt]=v;
     78       sum[rt]=(r-l+1)*v;
     79       setv[rt]=v;
     80       return;
     81   }
     82   PushDown(rt,r-l+1);
     83   int m=(l+r)>>1;
     84   if(L<=m) set_val(L,R,v,l,m,rt<<1);
     85   if(R>m) set_val(L,R,v,m+1,r,rt<<1|1);
     86   PushUp(rt);
     87 }
     88 int query(int L,int R,int l,int r,int rt)
     89 {
     90     if(L<=l&&r<=R)
     91     {
     92         ansmin=min(ansmin,minv[rt]);
     93         ansmax=max(ansmax,maxv[rt]);
     94         return sum[rt];
     95     }
     96     PushDown(rt,r-l+1);
     97     int m=(l+r)>>1;
     98     int ret=0;
     99     if(L<=m) ret+=query(L,R,l,m,rt<<1);
    100     if(R>m) ret+=query(L,R,m+1,r,rt<<1|1);
    101     return ret;
    102 }
    103 int main()
    104 {
    105     int m;
    106     while(scanf("%d%d%d",&row,&col,&m)!=EOF)
    107     {
    108         memset(add,0,sizeof(add));
    109         memset(setv,-1,sizeof(setv));
    110         build(1,col*row,1);
    111         int com;
    112         int x1,y1,x2,y2,v;
    113         while(m--)
    114         {
    115             scanf("%d",&com);
    116             if(com==1)
    117             {
    118                 scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&v);
    119                 for(int i=x1;i<=x2;i++)
    120                  update((i-1)*col+y1,(i-1)*col+y2,v,1,col*row,1);
    121             }
    122             else if(com==2)
    123             {
    124                 scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&v);
    125                  for(int i=x1;i<=x2;i++)
    126                  set_val((i-1)*col+y1,(i-1)*col+y2,v,1,col*row,1);
    127             }
    128             else
    129             {
    130                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    131                  ansmax=-INF; ansmin=INF;
    132                  int ans=0;
    133                  for(int i=x1;i<=x2;i++)
    134                  ans+=query((i-1)*col+y1,(i-1)*col+y2,1,col*row,1);
    135                 printf("%d %d %d
    ",ans,ansmin,ansmax);
    136             }
    137         }
    138     }
    139     return 0;
    140 }
  • 相关阅读:
    等你在清华
    印度教导的灵性四句话
    印度“人棍”男孩,用头部自理生活,坚挺过着生活
    观看纯净版优酷视频
    自定义联通话费充值
    windows实用工具
    计算机书籍下载
    文档下载冰点文库
    python读文件的三个方法read()、readline()、readlines()详解
    POJ 3661 Running(dp背包)
  • 原文地址:https://www.cnblogs.com/sooflow/p/3280189.html
Copyright © 2020-2023  润新知