BZOJ2683 簡單題 分治 樹狀陣列

2022-05-20 06:48:11 字數 2601 閱讀 5774

time limit: 50 sec  memory limit: 128 mb

[submit][status][discuss]你有乙個n*n的棋盤,每個格仔內有乙個整數,初始時的時候全部為0,現在需要維護兩種操作:

命令引數限制

內容

1 x y a

1<=x,y<=n,a是正整數

將格仔x,y裡的數字加上a

2 x1 y1 x2 y2

1<=x1

<= x2

<=n

1<=y1

<= y2

<=n

輸出x1 y1 x2 y2這個矩形內的數字和

無終止程式

輸入檔案第一行乙個正整數n。

接下來每行乙個操作。

對於每個2操作,輸出乙個對應的答案。

41 2 3 3

2 1 1 3 3

1 2 2 2

2 2 2 3 433

51<=n<=500000,運算元不超過200000個,記憶體限制20m。

對於100%的資料,操作1中的a不超過2000。

首先把詢問拆成4個,那麼我們就只要維護乙個點左下角權值和了。

然後對所有操作按照x 公升序排序。

對 y 用個樹狀陣列求字首和,(由於 x 公升序,所以此時詢問已經相當於對y求字首和了)

mid為分界線,考慮左區間對右區間的影響

顯然,我們可以把左區間的修改執行,然後執行右區間的詢問

這樣我們就做完了這道題。

1 #include2 #include

3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9 typedef long

long

s64;

1011

const

int one = 1000005;12

const

int inf = 214748340;13

14int

get()

1524

25int

n;26

namespace

bit27

30void add(int r, int

x)31

35int query(int

r)3642}

4344

intid, query_num, ans[one];

45struct

power

46oper[one], q[one];

5051

bool cmp(const power &a, const power &b)

5256

57void deal(int x_1, int y_1, int x_2, int

y_2)58;

61 oper[++id] = (power);

62 oper[++id] = (power);

63 oper[++id] = (power);64}

6566

void solve(int l, int

r)67

7879

for(int i = l; i <= r; i++)

80if(oper[i].opt == 1 && oper[i].id <=mid)

81 bit::add(oper[i].y, -oper[i].val);

8283

int tl = l, tr = mid + 1;84

for(int i = l; i <= r; i++)

85if(oper[i].id <= mid) q[tl++] =oper[i];

86else q[tr++] =oper[i];

8788

for(int i = l; i <= r; i++)

89 oper[i] =q[i];

9091 solve(l, mid), solve(mid + 1

, r);92}

9394

intopt, x_1, y_1, x_2, y_2;

9596

intmain()

97111

112 sort(oper + 1, oper + id + 1

, cmp);

113114 solve(1

, id);

115116

for(int i = 1; i <= query_num; i++)

117 printf("

%d\n

", ans[i]);

118 }

view code

bzoj 2683 簡單題 cdq分治 樹狀陣列

要求資瓷下列操作 1 x y z把 x,y 加上z 2 x1 y1 x2 y2求矩形x1 y1 x2 y2的權值和 n 500000,x,y n,q 200000 首先可以把乙個詢問用容斥原理拆成四個詢問,然後在cdq分治中二分乙個橫座標mid,然後把操作從前往後掃一遍,若是修改操作且橫座標不大於m...

bzoj2683 簡單題 CDQ分治 樹狀陣列

ac通道 題解 話說這題好像可以用整體二分來做 蒟蒻不會啊 cdcq大神的整體二分比我的cdq分治高到不知道 去了。說一下做法吧 首先把詢問的矩形分成4部分,算一下每部分的答案,然後容斥原理即可。怎樣算每部分的答案呢?我們按照時間分治,cdq遞迴過程中按x排序,遇到修改則插入到樹狀陣列中,遇到詢問就...

BZOJ 2683 簡單題 CDQ分治

n n矩陣,支援單點修改,查詢某乙個子矩陣內的和 n leq 500000 運算元 leq 200000 首先運用二維字首和的思想,把子矩陣的和拆成四個字首和。然後把詢問和修改看成 x,y,t 的三元組,t表示當前是第幾次操作。然後就變成三維偏序問題,對於每個詢問,找x,y,t均比它小的修改操作,再...