luogu P3801 紅色的幻想鄉

2022-05-09 14:15:10 字數 1534 閱讀 9456

嘟嘟嘟

首先人人都能想到是線段樹,不過二維線段樹肯定會mle+tle的。

我們換一種想法,不去修改整個區間,而是修改乙個點:開橫豎兩個線段樹,分別記錄哪些行和列被修改了。因為如果兩陣紅霧碰撞,則會因為密度過大而沉降消失,所以自然想到亦或。

統計的時候求出這個矩形內有哪些行和列被修改了,接著把這些行和列的長度累加到答案中,但這樣的話交點處不僅會重加,而實際上應該是0,所以在減去兩倍的被修改的行,列數。

綜上:單點亦或修改,區間查詢。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11

using

namespace

std;

12#define enter puts("")

13#define space putchar(' ')

14#define mem(a, x) memset(a, x, sizeof(a))

15#define rg register

16 typedef long

long

ll;17 typedef double

db;18

const

int inf = 0x3f3f3f3f;19

const db eps = 1e-8;20

const

int maxn = 1e5 + 5;21

inline ll read()

2226

while(isdigit(ch))

27if(last == '

-') ans = -ans;

28return

ans;29}

30 inline void

write(ll x)

3136

37int

n, m, q;

38struct

tree

3946

void build(int l, int r, int

now)

4754

void update(int idx, int

now)

5557

int mid = (l[now] + r[now]) >> 1;58

if(idx <= mid) update(idx, now << 1

);59

else update(idx, now << 1 | 1

);60 sum[now] = sum[now << 1] + sum[now << 1 | 1

];61}62

int query(int l, int r, int

now)

6370

}x, y;

7172

intmain()

7384

else

8591}92

return0;

93 }

view code

luogu3801 紅色的幻想鄉

給乙個初始值都是0的0 1矩陣,兩個操作 1.選擇乙個點,將其所在排和列 不包括該點 的數字取反。2.求乙個子矩形內的數字和。n,m,q 100000.n,m 100000,每個x線段樹都維護乙個有400000個節點的y線段樹,而x節點也要400000個,空間受不了。如果我們要更新一排,x線段樹沒有...

紅色的幻想鄉 洛谷p3801

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

洛谷 P3801 紅色的幻想鄉

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