luogu3613 睡覺困難症候群

2021-08-16 14:48:00 字數 3335 閱讀 7124

題目背景

剛立完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...