(int x1, int y1, int x2, int y2) { return cnt(x2, y2) - cnt(x2, y1 - 1) - cnt(x1 - 1, y2) + cnt(x1 - 1, y1 - 1); } }; void best_coder() { int n, m; scanf("%d%d", &n, &m); FenwickTree ft(n, m); int a; while (~scanf("%d", &a)) { if (...
我们要单点查询a[pos]a[pos],由上可知a[pos]=d[1]+d[2]+⋯+d[pos]a[pos]=d[1]+d[2]+⋯+d[pos], 那么原来的sum(pos)函数不用修改,就正好能返回a[pos]a[pos]的值。 代码: //BIT - 区间修改,单点查询 - ststruct_BIT{intN,C[MAXN];intlowbit(intx){returnx&(-x);}voidinit(i...
voidadd(intp,intx){//这个函数用来在树状数组中直接修改while(p <= n) sum[p] += x, p += p & -p; }voidrange_add(intl,intr,intx){//给区间[l, r]加上xadd(l, x), add(r +1, -x); }intask(intp){//单点查询intres =0;while(p) res += sum[p], p -= p & -p;returnre...
LOJ #133. 二维树状数组 1:单点修改,区间查询 给出一个 n \times m 的零矩阵 A ,你需要完成如下操作: 1 \, x \, y \, k :表示元素 A_{x,y} 自增k; 2 \, a \, b \, c \, d :表示询问左上角为 (a,b) ,右下角为 (c,d) 的子矩阵内所有数的和。 在上面的单点操作我们已经提...
2.二维区间修改 根据差分的性质,我们在 (a,b),(a,d+1),(c+1,b),(c+1,d+1) 四个点分别执行 (+delta,-delta,-delta,+delta) 操作即可。 3.二维区间查询 前面已经指出,对于点 (a,b) 到(c,d) 之间的区间和,存在 tot=sum[c][d]-sum[c][b-1]-sum[a-1][d]-sum[a-1][b-1] =\...
首先想到要知道该格子是0还是1只要知道它被操作了几次就好..模2是1答案就是1..模2是0答案就是0.. 对于连续二维区域进行维护...用二维的线段树或者树状数组..写起来也挺简单的..相当于update嵌套一个update..query嵌套一个query... 对于区间更新拆成4次更新...单点查询直接查... Program...
区间更新,查询点 (需要差分思想) //修改区间,查询点 #include<iostream> #include<cstring> using namespace std; const int maxn=100005; const int maxq=100005; int a[maxn];int b[maxn];int c[maxn]; //a原数组,b是a的差分数组,c是b的树状数组 ...
1.改动(x1,y1)到(x2,y2)的数,使它们取异或。 2.查询(x,y)的状态。 思路:二维树状数组,区间改动,单点查询。 CODE:...[POJ - 2155] Matrix (二维树状数组) 链接http://poj.org/problem?id=2155 题意 给你一个n×nn\times nn×n的矩阵,现在让你对它进行kkk次操作,共两种,第一种是告诉你(x1...
(int x1, int y1, int x2, int y2) { return cnt(x2, y2) - cnt(x2, y1 - 1) - cnt(x1 - 1, y2) + cnt(x1 - 1, y1 - 1); } }; void best_coder() { int n, m; scanf("%d%d", &n, &m); FenwickTree ft(n, m); int a; while(~scanf("%d", &a)) { if (a...
分析: 二维树状数组 区间修改,单点查询 tip 《浅谈信息学竞赛中的“0”和“1”》 写代码的时候,我也没有多想,直接^1 实际上树状数组记录的是区间的翻转次数 每次修改的时候+1,最后的答案就是:Σ&1(或者说是Σ%2) 又因为:(a+b)%p=(a%p+b%p)%p 所以在树状数组中直接^1即可 #include<cstdio>...