bzoj2683 簡單題 CDQ分治 樹狀陣列

2021-07-27 09:02:14 字數 1060 閱讀 8941

ac通道:

【題解】

話說這題好像可以用整體二分來做(蒟蒻不會啊),cdcq大神的整體二分比我的cdq分治高到不知道**去了。

說一下做法吧:

首先把詢問的矩形分成4部分,算一下每部分的答案,然後容斥原理即可。

怎樣算每部分的答案呢?

我們按照時間分治,cdq遞迴過程中按x排序,遇到修改則插入到樹狀陣列中,遇到詢問就在bit中查詢即可。

#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

#define file "read"

#define maxn 800010

#define up(i,j,n) for(int i=j;i<=n;++i)

#define dn(i,j,n) for(int i=j;i>=n;--i)

#define cmax(a,b) a=max(a,b)

#define cmin(a,b) a=min(a,b)

struct node

while(tb<=r&&a[ta].x>a[tb].x)

} while(ta<=mid)

while(tb<=r)

up(i,l,mid) if(a[i].opt==1) add(a[i].y,-a[i].v);

up(i,l,r) a[i]=stack[i-l+1];

}int main();

} else if(opt==2);

a[++m]=(node);

a[++m]=(node);

a[++m]=(node);

} else break;

} cdq(1,m); sort(a+1,a+m+1);

up(i,1,m)if(a[i].opt==2)printf("%lld\n",(ll)a[i+3].v-a[i+2].v-a[i+1].v+a[i].v),i+=3;

return 0;

}

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 ...

BZOJ 2683 簡單題(CDQ分治 容斥)

description 你有乙個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這個矩形內的數字和 3...