HDU 6514 Monitor(二維差分)

2022-05-11 15:15:21 字數 1277 閱讀 9297

給定乙個\(n×m\)的矩陣。(\(n×m <= 1e7\))。

\(p\)次操作,每次可以在這個矩陣中覆蓋乙個矩形。

\(q\)次詢問,每次問乙個矩形區域中,是否所有的點都被覆蓋。

修改的時候用二維差分,判斷的時候用二維字首和。

增加矩形\((x1, y1),(x2, y2)\)時:

dis[id(x1, y1)]++;

dis[id(x1, y2+1)]--;

dis[id(x2+1, y1)]--;

dis[id(x2+1, y2+1)]++;

求矩形\((x1,y1),(x2,y2)\)的區間和時:

sum[id(x2, y2)] - (sum[id(x1-1, y2)] + sum[id(x2, y1-1)] - sum[id(x1-1, y1-1)])
#include #define fopi freopen("in.txt", "r", stdin")

#define fopo freopen("out.txt", "w", stdout")

#define for(i,x,y) for (int i = x; i <= y; i++)

#define rof(i,x,y) for (int i = x; i >= y; i--)

using namespace std;

typedef long long ll;

const int maxn = 2e7 + 100;

int dis[maxn], sum[maxn];

int n, m, p, q;

int x1, y1, x2, y2;

int id(int i, int j)

int main()

for(i, 1, n) for(j, 1, m)

sum[id(i,j)] = sum[id(i-1,j)] + sum[id(i,j-1)] - sum[id(i-1,j-1)] + dis[id(i,j)];

for(i, 1, n) for(j, 1, m) sum[id(i,j)] = sum[id(i,j)] > 0;

for(i, 1, n) for(j, 1, m)

sum[id(i,j)] = sum[id(i-1,j)] + sum[id(i,j-1)] - sum[id(i-1,j-1)] + sum[id(i,j)];

scanf("%d", &q);

for(i, 1, q)

}}

Monitor(矩形覆蓋 二維差分)

原題 題意 給出n個矩陣,q個查詢,問乙個矩陣是否被之前的矩陣完全覆蓋。解析 對於每個矩陣進行差分 每個矩陣的左上角 1,右下角 1,另外兩個 1。那麼此時的二維字首和就表示某個點被覆蓋的次數了。例如 黃色為0,紅色為1 然後將每個有被覆蓋的點變成1,否則為0,此時再次做二維字首和,得到的就是一定區...

hdu 1480 鑰匙計數之二

problem description 一把鑰匙有n個槽,2input 本題無輸入 output 對2sample output n 3 104 n 4 904 n 5 5880.n 25 8310566473196300280 提交完本題後,頗覺有遞推的味道。出發點 構造結果ans n num 1...

hdu 4033 二分判斷

終於有題我過了t t。剛開始jc看錯題了,以為是到各邊的距離,然後覺得蠻水的,直接以0 0 為內點,旋轉後求垂線圍成的多邊形是否是正多邊形即可。後來一看是到各頂點的距離。想了一會兒。後來用餘弦定理,二分邊長 邊長和反余弦是單調的 判斷所有構成三角形的頂角 和是否為2 pi即可。構不成三角形的話直接判...