刷題 洛谷 P3613 睡覺困難症候群

2022-05-26 22:03:09 字數 3705 閱讀 5568

剛立完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 72 6

3 73 6

3 11 2

2 33 4

1 51 1 4 7

1 1 3 5

2 1 1 3

2 3 3 3

1 1 3 2

輸出樣例#1:

7

15

輸入樣例#2:

2 2 2

2 22 2

1 22 2 2 2

1 2 2 2

輸出樣例#2:

3
對於30%的資料,n,m <= 1

對於另外20%的資料,k <= 5

對於另外20%的資料,位運算只會出現一種

對於100%的資料,0 <= n , m <= 100000 , k <= 64

題目是起床困難綜合症的公升級版(症 or 徵?)

採取同樣的貪心策略,如果知道全0或全1跑完一遍運算後的結果,就可以知道最後答案

問題就在於怎麼維護這個全0或全1跑完一遍的結果

這東西要動態修改,又是樹狀的,那就lct吧(樹剖)

首先看一下直接維護我們要的東西可不可以,所以對於乙個節點,維護 \(r0\) ,\(r1\) 分別代表全0跑過這個節點包含的一段運算的結果,以及全1跑完這一段運算的結果

pushup怎麼寫?

\(x_=(\thicksim lc(x)_\&rc(x)_)|(lc(x)_\&rc(x)_)\)

\(x_=(\thicksim lc(x)_\&rc(x)_)|(lc(x)_\&rc(x)_)\)

(當然還要加上自己的權值,但是由於加上自己的有點麻煩,所以只寫了左右的,大概就是這個意思,心領神會就行,加上自己權值的可見**)

什麼意思?

以第乙個式子為例子,\(x_\) 是以全0開始的,那麼左邊的一段肯定是以全0開始的,所以兩個都是 \(lc(x)_\),然後分情況

跑完左邊一段後,有的位置上是0,而有的位置上是1

那麼是0的位置,最後的結果,肯定是用0跑完右邊一段的運算,所以只有跑完左邊一段後值為0的位置才可以留下右邊用全0跑完的結果

而是1的位置,就只能留下右邊用全1跑完的結果

第二個式子類似

又因為題目的位運算是有序的,那麼reverse的時候就行不通了,所以每個節點都還要維護乙個反向運算的結果,reverse的時候正向的和反向的swap一下就好了

然後這個東西,每次詢問就只要拉鍊一下,貪心就可以了

#include#define ui unsigned int

#define ll long long

#define db double

#define ld long double

#define ull unsigned long long

const int maxn=100000+10;

int n,m,k;

struct data;

};#define lc(x) ch[(x)][0]

#define rc(x) ch[(x)][1]

struct lct

inline void reverse(int x)

inline void pushup(int x)

inline void pushdown(int x) }

inline void rotate(int x)

inline void splay(int 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) };

lct t;

#undef lc

#undef rc

templateinline void read(t &x)

templateinline void write(t x,char c='\0')

templateinline void chkmin(t &x,t y)

templateinline t min(t x,t y)

int main()

for(register int i=1;i=0;--i)

if(res0&(e

} if(q==2)

}return 0;

}

P3613 睡覺困難症候群(LCT 位運算)

noi2014 起床困難綜合症放在樹上,加上單點修改與鏈上查詢。類似於原題,我們只需要求出 0 和 2 1 走過這條鏈會變成什麼值,就能確定每一位為 0 1 走完後變成什麼值。我們對於 lct 每個節點維護兩個值 r 0,r 1 表示 0 和 2 k 1 從當前 lct 維護的鏈底走到這個點會變成什...

Luogu3613 睡覺困難症候群

luogu題面 這道題是noi起床困難綜合症改編而來的 思路是一樣的 這道題我們考慮用lct維護,每個節點維護兩個值 乙個為中序遍歷這棵子樹的ans0,ans1 分別表示0和inf 二進位制下全為1 跑的答案 另乙個為中序遍歷的反向遍歷這棵子樹的ans0,ans1 還要記得儲存這個點的初始操作 考慮...

luogu3613 睡覺困難症候群

題目背景 剛立完flag我就掛了wc和thuwc。時間限制0.5s,空間限制128mb 因為claris大佬幫助一周目由乃通過了deus的題,所以一周目的由乃前往二周目世界找雪輝去了 由於二周目世界被破壞殆盡,所以由乃和雪輝天天都忙著重建世界 其實和mc差不多吧 deus看到了題問她,總是被告知無可...