蕾公尺莉亞的紅霧異變失敗後,很不甘心。
經過上次失敗後,蕾公尺莉亞決定再次發動紅霧異變,但為了防止被靈夢退治,她決定將紅霧以奇怪的陣勢釋放。
我們將幻想鄉看做是乙個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複製1 2 2
1 4 4
2 1 1 4 4
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 longview codelong
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;
}
紅色的幻想鄉 洛谷p3801
蕾公尺莉亞的紅霧異變失敗後,很不甘心。經過上次失敗後,蕾公尺莉亞決定再次發動紅霧異變,但為了防止被靈夢退治,她決定將紅霧以奇怪的陣勢釋放。我們將幻想鄉看做是乙個n m的方格地區,一開始沒有任何乙個地區被紅霧遮蓋。蕾公尺莉亞每次站在某乙個地區上,向東南西北四個方向各發出一條無限長的紅霧,可以影響到整行...
洛谷 P3801 紅色的幻想鄉(線段樹 容斥)
如果會二維線段樹的話,這個題目應該會好想一點,但是資料範圍不允許使用如果考慮一維線段樹的話,只能考慮每次的貢獻值 其實不難發現,我們建兩個線段樹,分別維護 x 軸和 y 軸,這樣對於每一次詢問,只要找到 x1,x2 有幾個標記的點 記為 x y1,y2 有幾個標記的點 記為 y 所以答案為 也就是減...
luogu P3801 紅色的幻想鄉
嘟嘟嘟 首先人人都能想到是線段樹,不過二維線段樹肯定會mle tle的。我們換一種想法,不去修改整個區間,而是修改乙個點 開橫豎兩個線段樹,分別記錄哪些行和列被修改了。因為如果兩陣紅霧碰撞,則會因為密度過大而沉降消失,所以自然想到亦或。統計的時候求出這個矩形內有哪些行和列被修改了,接著把這些行和列的...