給定乙個n∗
n n∗n
(n≤1e5)
n ≤1
e5
)的矩陣,單點修改,區間查詢。
二維樹狀陣列?空間開不下。
那就換乙個辦法,記得之前用cdq分治來做樹狀陣列的時候,每乙個查詢的答案是在它前面的修改的並且修改的位置在它前面的才可以計入答案,這裡也是一樣,將每乙個詢問拆成四個字首和陣列之後,每乙個查詢的答案為在它前面修改的並且
x x
小於它y' role="presentation">y
y也小於它的值的和,這就是乙個三維偏序。二維樹狀陣列的複雜度是
nlog2n
n
log2n
,cdq分治的時間複雜度也是
nlog2n
n
log2n
。
/*********************===
* author : ylsoi
* problem : bzoj2683
* algorithm : cdq
* time : 2018.7.30
* *********************/
#include
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define mid ((l+r)>>1)
typedef long long ll;
using namespace std;
void file()
const int maxn=5e5+10;
const int maxm=2e5+10;
int n,m,sum[maxn];
struct nodea[maxm<<2],tmp[maxm<<2];
bool cmp(node xx,node yy)
void modify(int
pos,intx)}
int query(int
pos)
return ret;
}void cdq(int l,int r)
else
}if(pl<=mid)
else
rep(i,l,mid)if(!a[i].ty)modify(a[i].y,-a[i].val);
}rep(i,l,r)a[i]=tmp[i];
}void init();
}else;
a[++m]=(node);
a[++m]=(node);
a[++m]=(node);}}
}int main()
return
0;}
BZOJ2683 簡單題 題解
1.若n比較小,則可以用二維的樹狀陣列或線段樹來做,但是500000,空間開不下,於是考慮離線cdq。子矩陣的數字和表示為也就是二維字首和,因此乙個要查詢的子矩陣,對其有影響的矩陣為s x2 y2 s x2 y1 1 s x1 1 y2 s x1 1 y1 1 這四個字首子矩陣 所以,在沒有修改操作...
BZOJ 2683 簡單題 CDQ分治
n n矩陣,支援單點修改,查詢某乙個子矩陣內的和 n leq 500000 運算元 leq 200000 首先運用二維字首和的思想,把子矩陣的和拆成四個字首和。然後把詢問和修改看成 x,y,t 的三元組,t表示當前是第幾次操作。然後就變成三維偏序問題,對於每個詢問,找x,y,t均比它小的修改操作,再...
bzoj2683簡單題 cdq分治
time limit 50 sec memory limit 128 mb submit 1803 solved 731 submit status discuss 你有乙個n n的棋盤,每個格仔內有乙個整數,初始時的時候全部為0,現在需要維護兩種操作 命令引數限制 內容1 x y a 1 x,y ...