嘟嘟嘟
首先人人都能想到是線段樹,不過二維線段樹肯定會mle+tle的。
我們換一種想法,不去修改整個區間,而是修改乙個點:開橫豎兩個線段樹,分別記錄哪些行和列被修改了。因為如果兩陣紅霧碰撞,則會因為密度過大而沉降消失,所以自然想到亦或。
統計的時候求出這個矩形內有哪些行和列被修改了,接著把這些行和列的長度累加到答案中,但這樣的話交點處不僅會重加,而實際上應該是0,所以在減去兩倍的被修改的行,列數。
綜上:單點亦或修改,區間查詢。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11view codeusing
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 }
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的方格地區,一開始沒有任何乙個地區被紅霧遮蓋。蕾公尺莉亞每次站在某乙個地區上,向東南西北四個方向各發出一條無限長的紅霧,可以影響到整行...