題目背景
剛立完flag我就掛了wc和thuwc。。。
時間限制0.5s,空間限制128mb
因為claris大佬幫助一周目由乃通過了deus的題,所以一周目的由乃前往二周目世界找雪輝去了
由於二周目世界被破壞殆盡,所以由乃和雪輝天天都忙著重建世界(其實和mc差不多吧),deus看到了題問她,總是被告知無可奉告
deus沒辦法只能去三周目世界問三周目的由乃oi題。。。
三周目的世界中,因為沒有未來日記,所以一切都很正常,由乃天天認真學習。。。
因為deus天天問由乃oi題,所以由乃去學習了一下oi
由於由乃智商挺高,所以oi學的特別熟練
她在rboi2016中以第一名的成績進入省隊,參加了noi2016獲得了金牌保送
deus:這個題怎麼做呀?
yuno:這個不是noi2014的水題嗎。。。
deus:那如果出到樹上,多組鏈詢問,帶修改呢?
yuno:誒。。。???
deus:這題叫做睡覺困難症候群喲~
雖然由乃oi很好,但是她基本上不會ds,線段樹都只會口胡,比如她noi2016的分數就是100+100+100+0+100+100。。。noip2017的分數是100+0+100+100+0+100
所以她還是只能找你幫她做了。。。
題目描述
由乃這個問題越想越迷糊,已經達到了廢寢忘食的地步。結果她發現……晚上睡不著了!只能把自己的乙個神經元(我們可以抽象成乙個樹形結構)拿出來,交給deus。
這個神經元是乙個有n個點的樹,每個點的包括乙個位運算opt和乙個權值x,位運算有&,l,^三種,分別用1,2,3表示。
為了**失眠,deus可以將一些神經遞質放在點x上,初始的刺激值是
v_0v0 。然後v依次經過從x到y的所有節點,每經過乙個點i,v就變成v opti xi,所以他想問你,最後到y時,希望得到的刺激值盡可能大,所以最大值的v可以是多少呢?當然由於初始的神經遞質的量有限,所以給定的初始值
v_0v0 必須是在[0,z]之間。deus每次都會給你3個數,x,y,z。
不過,deus為了提公升**效果,可能會對一些神經節點進行微調。在這種情況下,也會給三個數x,y,z,意思是把x點的操作修改為y,數值改為z
輸入輸出格式
輸入格式:
第一行三個數n,m,k。k的意義是每個點上的數,以及詢問中的數值z都
<2^k
<2k 。之後n行,每行兩個數x,y表示該點的位運算編號以及數值
之後n - 1行,每行兩個數x,y表示x和y之間有邊相連
之後m行,每行四個數,q,x,y,z表示這次操作為q(1位詢問,2為更改),x,y,z意義如題所述
輸出格式:
對於每個操作1,輸出到最後可以造成的最大刺激度v
輸入輸出樣例
輸入樣例#1: 複製
5 5 3
1 7
2 6
3 7
3 6
3 1
1 2
2 3
3 4
1 5
1 1 4 7
1 1 3 5
2 1 1 3
2 3 3 3
1 1 3 2
輸出樣例#1: 複製
7 1
5 輸入樣例#2: 複製
2 2 2
2 2
2 2
1 2
2 2 2 2
1 2 2 2
輸出樣例#2: 複製
3 說明
對於30%的資料,n,m <= 1
對於另外20%的資料,k <= 5
對於另外20%的資料,位運算只會出現一種
對於100%的資料,0 <= n , m <= 100000 , k <= 64
很早之前就看到過和起床困難綜合症分不清
還是考慮按位貪心 具體參考起床起床困難綜合症
需要回答詢問的時候就把這條鏈切出來詢問即可
那麼怎麼維護這個題解提供了一種簡潔的方法 我把資訊分開維護 維護lo.f0 表示從左起一開始全是0的一直做操作到我這個位置的資訊 lo.f1表示左起一開始全是1的一直操作到我這裡 ro同理
假如說我們有兩段帶合併的已經計算出答案的區間,分別對應f0,f1和g0,g1。我們設合併後的答案是h0,h1,那麼有如下式子:
h0=(~f0&g0)+(f0&g1)
h1=(~f1&g0)+(f1&g1)
原因嘛 我分類討論了下 發現大概是把一些0和1的情況模擬位運算過程分開處理了
注意 維護資訊的時候需要有序維護 並且需要判斷子樹是否為空
#include
#include
#define ll unsigned long long
#define n 110000
using namespace std;
inline char gc()
return
*s++;
}inline ll read()
while(ch<='9'&&ch>='0') x=x
*10+ch-'0',ch=gc();
return
x*f;
}struct node
}v[n],lo[n],ro[n];
int c[n][2],n,m,k,fa[n],q[n],top;
bool rev[n];ll bin[70];
inline bool isroot(int
x)inline void update(int
x)inline void revs(int
x)inline void pushdown(int
x)inline void rotate(int
x)inline void splay(int
x)rotate(x);
}}inline void access(int
x)inline void makeroot(int
x)inline void split(int
x,int
y)inline void link(int
x,int
y)inline void change(int i,ll a,ll b)
int main()
for (int i=1;iint
x=read(),y=read();link(x,y);}
while(m--)
if (lo[y].f1&bin[i]&&bin[i]<=z) ans+=bin[i],z-=bin[i];
}printf("%llu\n",ans);
}if(op==2)
}return
0;}
Luogu3613 睡覺困難症候群
luogu題面 這道題是noi起床困難綜合症改編而來的 思路是一樣的 這道題我們考慮用lct維護,每個節點維護兩個值 乙個為中序遍歷這棵子樹的ans0,ans1 分別表示0和inf 二進位制下全為1 跑的答案 另乙個為中序遍歷的反向遍歷這棵子樹的ans0,ans1 還要記得儲存這個點的初始操作 考慮...
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...