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看到了題問她,總是被告知無可...