Codeforces Round #668 (Div. 1)題解
阿新 • • 發佈:2020-11-20
自閉場,VP的時候一道題都不會做,我退役罷
A.Balanced Bitstring
題解:找性質題
注意到如果要使每個長為$k$的子串中$0,1$數量相等,則$a[i]=a[i+k],i \in [1,n-k]$
於是如果有$a[i%k]$互不相等,則無解
這樣我們就有了一段長為$k$的字串
統計它之中$0,1$的個數
如果$>k/2$則無解
否則一定有解
#include <bits/stdc++.h> using namespace std; int n, k, sum1, sum2; string a; int f[300011]; void solve() { scanf("%d%d", &n, &k); cin >> a; memset(f, -1, sizeof(f)); for(int i = 0; i < n; i++) { if(a[i] != '?') { if(f[i%k] == -1) f[i % k] = a[i] - '0'; else if(f[i%k] != (int)(a[i] - '0')) { cout << "NO" << endl; return; } } } sum1 = sum2 = 0; for(int i = 0; i < k; i++) { sum1 += (f[i] == 0); sum2 += (f[i] == 1); } if(sum1 > k/2 || sum2 > k/2) cout << "NO" << endl; else cout << "YES" << endl; } int main() { int T; scanf("%d", &T); while(T--) solve(); return 0; }
B.Tree Tag
題解:我們考慮什麼情況下Alice可以獲勝
如果$dis_{a,b} \leq da$,則Alice可以一步就追上Bob
如果Alice處在一個能覆蓋整棵樹的點,即$da*2+1 \geq$樹的直徑,那麼Bob也無處可走了
其它情況下,Alice會一步一步逼近Bob,並一定能把Bob逼近某棵子樹
如果當前Alice佔據一個點,使Bob無論怎麼走都還在Alice的控制範圍內,那麼Alice必勝
此時條件即為$2da \geq db$
除以上條件外,Bob獲勝
#include <bits/stdc++.h> using namespace std; int n, a, b, da, db, dis[100011]; vector <int> e[100011]; void dfs(int w, int fa) { dis[w] = dis[fa] + 1; for(int i = 0; i < (int)e[w].size(); i++) { int ver = e[w][i]; if(ver != fa) dfs(ver, w); } } void solve() { scanf("%d%d%d%d%d", &n, &a, &b, &da, &db); for(int i = 1; i <= n; i++) e[i].clear(); for(int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); e[u].push_back(v); e[v].push_back(u); } dfs(1, 0); int maxw = 0; for(int i = 1; i <= n; i++) if(dis[maxw] < dis[i]) maxw = i; dfs(maxw, 0); maxw = 0; for(int i = 1; i <= n; i++) if(dis[maxw] < dis[i]) maxw = i; if(dis[maxw] <= da*2+1) { printf("Alice\n"); return; } dfs(a, 0); if(dis[b] <= da+1) { printf("Alice\n"); return; } if(2*da >= db) { printf("Alice\n"); return; } printf("Bob\n"); } int main() { int t; scanf("%d", &t); while(t--) solve(); return 0; }