标签:poj
http://poj.org/problem?id=2155
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 18769 | Accepted: 7078 |
Description
Input
Output
Sample Input
1 2 10 C 2 1 2 2 Q 2 2 C 2 1 2 1 Q 1 1 C 1 1 2 1 C 1 2 1 2 C 1 1 2 2 Q 1 1 C 1 1 2 1 Q 2 1
Sample Output
1 0 0 1
Source
(2)“改段求点”型,即对于序列A有以下操作:
【1】修改操作:将A[l..r]之间的全部元素值加上c;
【2】求和操作:求此时A[x]的值。
这个模型中需要设置一个辅助数组B:B[i]表示A[1..i]到目前为止共被整体加了多少(或者可以说成,到目前为止的所有ADD(i, c)操作中c的总和)。
void ADD(int x, int c) { for (int i=x; i>0; i-=i&(-i)) b[i] += c; } int SUM(int x) { int s = 0; for (int i=x; i<=n; i+=i&(-i)) s += b[i]; return s; }
/** * @author neko01 */ //#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <cstring> #include <string.h> #include <iostream> #include <algorithm> #include <queue> #include <vector> #include <cmath> #include <set> #include <map> using namespace std; typedef long long LL; #define min3(a,b,c) min(a,min(b,c)) #define max3(a,b,c) max(a,max(b,c)) #define pb push_back #define mp(a,b) make_pair(a,b) #define clr(a) memset(a,0,sizeof a) #define clr1(a) memset(a,-1,sizeof a) #define dbg(a) printf("%d\n",a) typedef pair<int,int> pp; const double eps=1e-9; const double pi=acos(-1.0); const int INF=0x3f3f3f3f; const LL inf=(((LL)1)<<61)+5; const int N=1005; int bit[N][N]; int n; int sum(int x,int y) { int s=0; for(int i=x;i<=n;i+=i&-i) for(int j=y;j<=n;j+=j&-j) s+=bit[i][j]; return s; } void add(int x,int y,int val) { for(int i=x;i>0;i-=i&-i) for(int j=y;j>0;j-=j&-j) bit[i][j]+=val; } int main() { int t; scanf("%d",&t); while(t--) { int q; scanf("%d%d",&n,&q); clr(bit); while(q--) { char s[5]; scanf("%s",s); int x1,x2,y1,y2; if(s[0]=='C') { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); add(x2,y2,1); add(x1-1,y2,-1); add(x2,y1-1,-1); add(x1-1,y1-1,1); } else { scanf("%d%d",&x1,&y1); printf("%d\n",sum(x1,y1)%2); } } puts(""); } return 0; }
标签:poj
原文地址:http://blog.csdn.net/neko01/article/details/40003745