BZOJ3729 Gty的遊戲(偽ETT)

2022-02-27 07:24:50 字數 1687 閱讀 4016

傳送門

\(nim\)遊戲的改版,我們現在每次最多只能取走\(k\)個石子,那麼\(sg\)函式很容易寫出來

\[sg(x)=mex_^sg(x-i)

\]有\(sg(0)=0\),用歸納法易知\(sg(x)=x\bmod (k+1)\)

有\(n\)級台階,從\(0\)級開始數到\(n\)級。每級上都有一定的石子。每次可以把乙個階梯的石子往下移,\(0\)級階梯的不能移,不能操作者輸。

這裡有乙個結論,我們只需要考慮所有奇數層,該遊戲就等價於\(nim\)遊戲

為啥嘞?

首先偶數層是不會有任何影響的,因為如果你移動偶數層若干個石子到奇數層,那麼對手一定可以通過移動把你移的石子移到下乙個偶數層,相當於這些石子仍然在偶數層。如果移動奇數層的石子,我們就預設它消失了

那麼這題就比較明顯了,首先很容易算出每個節點的\(sg\)值,那麼對於乙個節點\(u\),如果它的深度是奇數,那麼答案就是它子樹里所有深度為偶數的節點的\(sg\)值的異或和之和,如果不為\(0\)說明妹子贏,否則\(gty\)贏

那麼用\(ett\)就好了(也就是\(splay\)維護\(dfs\)序),而且這裡只需要單括號尤拉序就可以了

不過這裡有個問題是單括號尤拉序我該怎麼找子樹代表的區間呢?

如果直接維護\(size\)應該可以做,但是\(size\)還需要鏈修改非常麻煩。我們可以在\(splay\)上二分,對於節點\(u\),找到\(dfs\)序比它大的節點中最小的滿足\(dep[v]\leq dep[u]\)的節點\(v\),那麼\([u,v)\)這個範圍就是子樹的範圍了。同時為了避免\(1\)找不到對應的\(v\),要插入乙個虛擬節點,深度設為\(0\),且\(dfs\)序最大

//minamoto

#include#define r register

#define inf 0x3f3f3f3f

#define inline __inline__ __attribute__((always_inline))

#define fp(i,a,b) for(r int i=(a),i=(b)+1;ii;--i)

#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)

using namespace std;

char buf[1<<21],*p1=buf,*p2=buf;

inline char getc()

int read()

inline int getop()

const int n=1e5+5;

inline int min(r int x,r int y)

}e[n],*rt;

inline node::node()

void rotate(ptr &rt,ptr p)

void splay(ptr &rt,ptr p)

p->upd();

}ptr get(ptr p,int d)

}int n,m,q,tim,cnt,res,dep[n],dfn[n],rk[n],a[n];

void dfs(int u,int fa)

void build(ptr &p,int l,int r,ptr fa)

int main()

case 2:

case 3:

} }return 0;

}

bzoj3720 Gty的妹子樹

我們可以樹上分塊,詳見我部落格中雜文下的根號演算法題庫 然後每個塊維護降序,對於整一塊在子樹內的就可以二分,其餘部分暴力。include include include include define fo i,a,b for i a i b i using namespace std const i...

bzoj3744 Gty的妹子序列

time limit 20 sec memory limit 128 mb submit 967 solved 293 submit status discuss 我早已習慣你不在身邊,人間四月天 寂寞斷了弦。回望身後藍天,跟再見說再見 某天,蒟蒻autumn發現了從 gty的妹子樹 bzoj372...

BZOJ 3744 Gty的妹子序列

第一行包括乙個整數n 1 n 50000 表示數列a中的元素數。第二行包括n個整數a1 an ai 0,保證ai在int內 接下來一行包括乙個整數m 1 m 50000 表示詢問的個數。接下來m行,每行包括2個整數l r 1 l r n 表示詢問al ar中的逆序 對數 若ai aj且i 對每個詢問...