• bzoj 1176


    收获:

      1、min, max, sum, 属于判定,等询问是”对象对答案贡献独立“,即不需要其他对象就了能更新答案,并保证只要所有对象更新过答案,那么该答案就是正确的。大概这就是所谓的”修改独立“。

      2、处理”先把所有修改给你,再询问“问题时,这道题要用到降维思想,就是处理的顺序也是一维,并且这维可以差分。那么就将二维问题变成了一维问题。(最值不满足差分性)。

     1 /**************************************************************
     2     Problem: 1176
     3     User: idy002
     4     Language: C++
     5     Result: Accepted
     6     Time:6896 ms
     7     Memory:42684 kb
     8 ****************************************************************/
     9  
    10 #include <cstdio>
    11 #include <algorithm>
    12 #define N 2000010
    13 #define M 340010
    14 using namespace std;
    15  
    16 typedef long long dnt;
    17  
    18 struct Proc {
    19     int opt, tim;
    20     int id;
    21     int x, y, v;
    22     int t, b;
    23     Proc(){}
    24     Proc( int opt, int tim, int x, int y, int v ):opt(opt),tim(tim),id(0),x(x),y(y),v(v),t(0),b(0) {}
    25     Proc( int opt, int tim, int id, int y, int t, int b ):opt(opt),tim(tim),id(id),x(0),y(y),v(0),t(t),b(b) {}
    26     bool operator<( const Proc &o ) const {
    27         return y<o.y || (y==o.y && opt<o.opt);
    28     }
    29 };
    30  
    31 int n, m, s;
    32 Proc proc[M]; int idp;
    33 dnt bit[N];
    34 dnt ans[N]; int ida;
    35  
    36 void modify( int x, int v ) {
    37     for( int i=x; i<=n; i+=i&-i )
    38         bit[i] += v;
    39 }
    40 dnt query( int x ) {
    41     dnt rt=0LL;
    42     for( int i=x; i; i-=i&-i )
    43         rt += bit[i];
    44     return rt;
    45 }
    46 dnt query( int t, int b ) {
    47     return query(b)-query(t-1);
    48 }
    49 void cdq( int lf, int rg ) {
    50     if( lf==rg ) return;
    51     int mid=(lf+rg)>>1;
    52     cdq(lf,mid);
    53     cdq(mid+1,rg);
    54     sort( proc+lf, proc+rg+1 );
    55     for( int i=lf; i<=rg; i++ ) {
    56         Proc &p = proc[i];
    57         if( p.opt==1 && p.tim<=mid ) {
    58             modify( p.x, p.v );
    59         } else if( p.opt==2 && p.tim>mid ) {
    60             ans[p.id] -= query( p.t, p.b );
    61         } else if( p.opt==3 && p.tim>mid ) {
    62             ans[p.id] += query( p.t, p.b );
    63         }
    64     }
    65     for( int i=lf; i<=rg; i++ ) {
    66         Proc &p = proc[i];
    67         if( p.opt==1 && p.tim<=mid )
    68             modify( p.x, -p.v );
    69     }
    70 }
    71 int main() {
    72     scanf( "%d%d", &s, &n );
    73     for( int i=1; ; i++ ) {
    74         int opt;
    75         scanf( "%d", &opt );
    76         if( opt==3 ) break;
    77         if( opt==1 ) {
    78             int x, y, v;
    79             scanf( "%d%d%d", &x, &y, &v );
    80             idp++;
    81             proc[idp] = Proc( opt, idp, x, y, v );
    82         } else {
    83             int x0, y0, x1, y1;
    84             scanf( "%d%d%d%d", &x0, &y0, &x1, &y1 );
    85             ida++;
    86             ans[ida] += (dnt) (y1-y0+1)*(x1-x0+1)*s;
    87             idp++;
    88             proc[idp] = Proc( 2, idp, ida, y0-1, x0, x1 );
    89             idp++;
    90             proc[idp] = Proc( 3, idp, ida, y1, x0, x1 );
    91         }
    92     }
    93     cdq( 1, idp );
    94     for( int i=1; i<=ida; i++ )
    95         printf( "%lld
    ", ans[i] );
    96 }
    View Code
  • 相关阅读:
    20145325张梓靖 《Java程序设计》第9周学习总结
    20145325张梓靖 实验四 "Andoid开发基础"
    20145325张梓靖 《Java程序设计》第8周学习总结
    20145307《信息安全系统设计基础》第7周学习总结
    20145307《信息安全系统设计基础》第六周学习总结
    Y86模拟器安装
    20145307《信息安全系统设计基础》第五周学习总结PT2
    git失败案例
    20145307陈俊达《信息安全系统设计基础》第5周学习总结PT1
    20145307陈俊达《信息安全系统设计基础》第3周学习总结
  • 原文地址:https://www.cnblogs.com/idy002/p/4455713.html
Copyright © 2020-2023  润新知