收获:
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 }
时间: 2024-10-18 20:02:10