紅色的幻想鄉 洛谷p3801

2021-08-29 20:30:43 字數 1466 閱讀 9218

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

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

我們將幻想鄉看做是乙個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

放過的行數x×行長度+放過的列數y×列長度-抵消塊數

記放過的行數x,放過的列數y,每行每列交叉1個,抵消塊數就是2xy。

#include#define f(i,l,r) for(i=(l);i<=(r);i++)

using namespace std;

const int maxn=100005;

int tx[maxn],x[maxn],ty[maxn],y[maxn];

int n,m,q;

inline int lowbit(int x)

inline void add(int *a,int x,int n,int d)

return;

}inline long long query(int *a,int x)

return res;

}int main()

else

} return 0;

}

洛谷 P3801 紅色的幻想鄉

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

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

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

luogu P3801 紅色的幻想鄉

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