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\n", ans[i] );
96 }
View Code

 

posted @ 2015-04-25 12:10  idy002  阅读(184)  评论(0编辑  收藏  举报