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

2022-05-07 18:57:07 字數 2579 閱讀 6192

noi2014 起床困難綜合症放在樹上,加上單點修改與鏈上查詢。

類似於原題,我們只需要求出 \(0\) 和 \(2^ - 1\) 走過這條鏈會變成什麼值,就能確定每一位為 \(0 / 1\) 走完後變成什麼值。

我們對於 \(lct\) 每個節點維護兩個值 \(r_0,r_1\) 表示 \(0\) 和 \(2 ^ k - 1\) 從當前 \(lct\) 維護的鏈底走到這個點會變成什麼值。

然後我們就可以把位運算操作變成乙個值放在這個點上。

合併資訊的時候,可以這樣寫:

inline data operator + (const data &lhs, const data &rhs) ;

}

此處 \(\sim\) 是取反,也就是所有位反轉,注意此處需要用unsigned long long存,就沒有符號位,不會進行反轉。

解釋前面那個地方(~lhs.r0 & rhs.r0)意味著最開始從 \(0\) 開始走,走完左子樹後還是 \(0\) 然後繼續走 得到的結果,

(lhs.r0 & rhs.r1)就是一開始從 \(0\) 走,走完左子樹後變成 \(1\) 然後繼續走 得到的結果。

另外乙個也是同理了,只是最開始從 \(1\) 走。

但是這樣還是不夠的,因為位運算是有順序的,\(reverse\) 的時候答案就會錯誤,所以我們多存乙個逆向的值就行了。

最後只需要像原題按位貪心就行了。

複雜度是 \(o(n + q (\log n + k))\) 的。

位運算時需要對所有位進行翻轉可以用 \(\sim\) ,十分方便。

\(lct\) 維護資訊如果有順序的話,那麼需要維護乙個逆向操作的答案才行。

具體可以看看**實現(雖然寫的有點長。。)

#include #define for(i, l, r) for(register int i = (l), i##end = (int)(r); i <= i##end; ++i)

#define fordown(i, r, l) for(register int i = (r), i##end = (int)(l); i >= i##end; --i)

#define set(a, v) memset(a, v, sizeof(a))

#define cpy(a, b) memcpy(a, b, sizeof(a))

#define debug(x) cout << #x << ": " << (x) << endl

#define debug(...) fprintf(stderr, __va_args__)

#define pb push_back

using namespace std;

typedef unsigned long long ull;

templateinline bool chkmin(t &a, t b)

templateinline bool chkmax(t &a, t b)

namespace pb_ds

} templateinline type read()

templateinline void print(register type x, register char ch = '\n')

*iter++ = ch; }}

using namespace pb_ds;

void file()

const int n = 1e5 + 1e3;

#define ls(o) ch[o][0]

#define rs(o) ch[o][1]

struct data ;

inline data operator + (const data &lhs, const data &rhs) ;

}templatestruct link_cut_tree

inline bool get(int o)

inline void push_up(int o)

inline void rotate(int v)

bool rev[maxn];

inline void get_rev(int o)

inline void push_down(int o)

void push_all(int o)

inline void splay(int o)

inline void access(int o)

inline void make_root(int o)

inline void split(int u, int v)

};link_cut_treet;

vectorg[n];

void build(int u = 1, int fa = 0)

int main ()

for (i, 1, n - 1) build();

for (i, 1, m)

print(res);

} else

} io :: flush();

return 0;

}

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

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

Luogu3613 睡覺困難症候群

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

luogu3613 睡覺困難症候群

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