4 3 省選模擬賽 石子遊戲 樹上博弈

2022-02-05 02:00:25 字數 1830 閱讀 1390

注意觀察題目 每個點都只能將石子給自己的兩個兒子 且石子個數》=1.

顯然 這是乙個階梯nim. 只有和最後一層的奇偶性相同的層才會有貢獻 證明也很顯然。

那麼這其實就是近乎nim遊戲了 勝負自然取決於所有有貢獻的石子堆的異或和。

但是 上午我傻了的一點 沒有分清sg函式和nim遊戲的聯絡。

在nim遊戲中sg函式其實就是每個有貢獻的石子堆的石子數。

再來看這道題 由於異或和一定 暴力列舉移動哪一堆石子 判斷是否可行即可。

這個操作其實是 nim遊戲的證明問題了。解決的方案是 觀察一下移動後造成的影響和最終期望的結局來判斷移動的石子個數。

複雜度o(n).算是今天模擬賽最水的題目了 但是我傻了吧唧的沒寫。

//#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define db double

#define inf 1000000000

#define ldb long double

#define pb push_back

#define get(x) x=read()

#define gt(x) scanf("%d",&x)

#define put(x) printf("%d\n",x)

#define putl(x) printf("%lld\n",x)

#define gc(a) scanf("%s",a+1)

#define rep(p,n,i) for(re int i=p;i<=n;++i)

#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])

#define fep(n,p,i) for(re int i=n;i>=p;--i)

#define pii pair#define f first

#define s second

#define mk make_pair

#define mod 998244353

#define re register

#define gf(x) scanf("%lf",&x)

#define pf(x) ((x)*(x))

#define ull unsigned long long

#define p 1000000000000000ll

using namespace std;

char buf[1<<15],*fs,*ft;

inline char getc()

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}const int n=17;

int t,n,maxx,ans,sum1;

int a[1<>1]+1;

get(a[i]);

if(pos[sum[i]])ans=ans^a[i];

} if(!ans)

rep(1,maxx,i)

}put(sum1);

}}

4 3 省選模擬賽 採蘑菇 點分治

給出一棵樹 每個點都有乙個顏色ci 問 從i號點出發到任意乙個點的路徑上本質不同的顏色之和。n leq 300000 光線性掃瞄時不行的 顯然有 n 2 的暴力。考慮樹是一條鏈的時候怎麼做?可以發現先求出1的答案然後維護換根的過程 記錄每個點顏色的pre 前驅 nex後繼很容易通過分類討論得到答案。...

省選模擬賽 project

最小割問題。建如下邊 s,i,ai 代表選用a語言編寫第i個專案 i,t,bi 代表選用a語言編寫第i個專案 其後注意要反向連邊 i,j,d 代表選用b語言編寫第i個專案,選用a語言編寫第j個專案 j,i,c 代表選用a語言編寫第i個專案,選用b語言編寫第j個專案 litc學長出的題,引文最小割題目...

mirror 省選模擬賽

標籤 狀壓dp 結論 當最優情況下,每行每列鏡子的個數都為偶數 題目可以轉化為擺放鏡子,使得格仔中產生的光環最長 所以不需要考慮鏡子到底放什麼方向 於是我們直接狀壓一列鏡子當前的奇偶性進行轉移 時間複雜度o 4n n m2 o 4 n n m2 include include include inc...