洛谷 P3801 紅色的幻想鄉

2022-08-19 23:33:11 字數 1363 閱讀 5665

蕾公尺莉亞的紅霧異變失敗後,很不甘心。

經過上次失敗後,蕾公尺莉亞決定再次發動紅霧異變,但為了防止被靈夢退治,她決定將紅霧以奇怪的陣勢釋放。

我們將幻想鄉看做是乙個n*m的方格地區,一開始沒有任何乙個地區被紅霧遮蓋。蕾公尺莉亞每次站在某乙個地區上,向東南西北四個方向各發出一條無限長的紅霧,可以影響到整行/整列,但不會影響到她所站的那個地區。如果兩陣紅霧碰撞,則會因為密度過大而沉降消失。靈夢察覺到了這次異變,決定去解決它。但在解決之前,靈夢想要了解一片範圍紅霧的密度。可以簡述為兩種操作:

1 x y 蕾公尺莉亞站在座標(x,y)的位置向四個方向釋放無限長的紅霧。

2 x1 y1 x2 y2 詢問左上點為(x1,y1),右下點為(x2,y2)的矩形範圍內,被紅霧遮蓋的地區的數量。

第一行三個整數n,m,q,表示幻想鄉大小為n*m,有q個詢問。

接下來q行,每行3個或5個整數,用空格隔開,含義見題目描述。

對於每乙個操作2,輸出一行乙個整數,表示對應詢問的答案。

輸入 #1複製

4 4 3

1 2 2

1 4 4

2 1 1 4 4

輸出 #1複製

8
樣例解釋:

用o表示沒有紅霧,x表示有紅霧,兩次釋放紅霧後幻想鄉地圖如下:

oxox

xoxo

oxox

xoxo

資料範圍:

對於20%的資料,1<=n,m,q<=200

對於 40%的資料,1<=n,m,q<=1000

對於100%的資料,1<=n,m,q<=100000

1<=x1,x2,x<=n x1<=x2

1<=y1,y2,y<=m y1<=y2

by-orangebird

思路:區域字首和,想到樹狀陣列,重複兩次抵消,即交點,則是容斥定理,注意站的點不收影響,即再次站在這會取消上次的影響,需要記錄一下

typedef long

long

ll;typedef pair

pll;

const

int maxm = 1e5+5

;int

cx[maxm], cy[maxm], ax[maxm], ay[maxm];

void add(int *c, int x, int

val)

int getsum(int *c, int

x) int

main()

else

if(ay[y1])

else

} else

if(type == 2

) }

return0;

}

view code

紅色的幻想鄉 洛谷p3801

蕾公尺莉亞的紅霧異變失敗後,很不甘心。經過上次失敗後,蕾公尺莉亞決定再次發動紅霧異變,但為了防止被靈夢退治,她決定將紅霧以奇怪的陣勢釋放。我們將幻想鄉看做是乙個n m的方格地區,一開始沒有任何乙個地區被紅霧遮蓋。蕾公尺莉亞每次站在某乙個地區上,向東南西北四個方向各發出一條無限長的紅霧,可以影響到整行...

洛谷 P3801 紅色的幻想鄉(線段樹 容斥)

如果會二維線段樹的話,這個題目應該會好想一點,但是資料範圍不允許使用如果考慮一維線段樹的話,只能考慮每次的貢獻值 其實不難發現,我們建兩個線段樹,分別維護 x 軸和 y 軸,這樣對於每一次詢問,只要找到 x1,x2 有幾個標記的點 記為 x y1,y2 有幾個標記的點 記為 y 所以答案為 也就是減...

luogu P3801 紅色的幻想鄉

嘟嘟嘟 首先人人都能想到是線段樹,不過二維線段樹肯定會mle tle的。我們換一種想法,不去修改整個區間,而是修改乙個點 開橫豎兩個線段樹,分別記錄哪些行和列被修改了。因為如果兩陣紅霧碰撞,則會因為密度過大而沉降消失,所以自然想到亦或。統計的時候求出這個矩形內有哪些行和列被修改了,接著把這些行和列的...