luogu題面
這道題是noi起床困難綜合症改編而來的
思路是一樣的
這道題我們考慮用lct維護,每個節點維護兩個值
乙個為中序遍歷這棵子樹的ans0,ans1(分別表示0和inf(二進位制下全為1)跑的答案)
另乙個為中序遍歷的反向遍歷這棵子樹的ans0,ans1
還要記得儲存這個點的初始操作
考慮合併,若知道的左邊的f0,f1,右邊的g0,g1,合併後的h0,h1 有
h0 = (~f0 & g0) | (f0 & g1)
h1 = (~f1 & g0) | (f1 & g1)
含義就是走完前面,是0的繼續走0,不是的走1
注意lct中splay區間翻轉時交換左右
最後按高位貪心跑一遍
# include
# define rg register
# define il inline
# define fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ul;
const int _(1e5 + 10);
il ul read()
int n, m, fa[_], ch[2][_], rev[_], s[_];
struct value g, val[_], lr[_], rl[_];
il value merge(rg value x, rg value y)
il bool son(rg int x)
il bool isroot(rg int x)
il void update(rg int x)
il void reverse(rg int x)
il void pushdown(rg int x)
il void rotate(rg int x)
il void splay(rg int x)
il void access(rg int x)
il void makeroot(rg int x)
il void split(rg int x, rg int y)
il void link(rg int x, rg int y)
il ul query(rg int x, rg int y, rg ul z)
int main(rg int argc, rg char *argv);
if(x == 2) val[i] = (value);
if(x == 3) val[i] = (value);
}for(rg int i = 1, x, y; i < n; i++) x = read(), y = read(), link(x, y);
while(m--);
if(x == 2) val[i] = (value);
if(x == 3) val[i] = (value);
splay(i);}}
return 0;
}
luogu3613 睡覺困難症候群
題目背景 剛立完flag我就掛了wc和thuwc。時間限制0.5s,空間限制128mb 因為claris大佬幫助一周目由乃通過了deus的題,所以一周目的由乃前往二周目世界找雪輝去了 由於二周目世界被破壞殆盡,所以由乃和雪輝天天都忙著重建世界 其實和mc差不多吧 deus看到了題問她,總是被告知無可...
P3613 睡覺困難症候群(LCT 位運算)
noi2014 起床困難綜合症放在樹上,加上單點修改與鏈上查詢。類似於原題,我們只需要求出 0 和 2 1 走過這條鏈會變成什麼值,就能確定每一位為 0 1 走完後變成什麼值。我們對於 lct 每個節點維護兩個值 r 0,r 1 表示 0 和 2 k 1 從當前 lct 維護的鏈底走到這個點會變成什...
樹鏈剖分 LGP3613 睡覺困難症候群
原題位址 題目大意 不想打了。題目分析 每一位不會互相影響,可以把每一位分開考慮。還要用unsigned long long。解題思路 將每一位分開以後修改好啊,直接改就好了。詢問的時候算出來每一位填0,1經過這條鏈的變換之後得到的值。我們發現從高位往低位走的時候,如果這一位填0可以得到1,那麼填0...