原题 CF1446C Xor Tree。
最开始以为是先建图然后固定住图之后删点,想了半天感觉差不多思路出来了,然后算了一遍样例才发现假掉了,删点之后边也会对应移动,这东西是动态变化的,一个来小时的思路全寄掉了,然后也就没什么想法了,最终
xxxxxxxxxx106123
45678910
11using namespace std;12
13mt19937 rnd(random_device{}());14int rndd(int l, int r){return rnd() % (r - l + 1) + l;}15bool rnddd(int x){return rndd(1, 100) <= x;}16
17typedef unsigned int uint;18typedef unsigned long long unll;19typedef long long ll;20typedef long double ld;21
22
23
24template < typename T = int >25inline T read(void);26
27int N;28int a[210000];29int ans(INT_MAX);30bitset < 12 > vis;31bitset < 12 > exist[12];32bool flag(true);33int cnt(0);34basic_string < int > cur;35
36struct Edge{37 Edge* nxt;38 int to;39 OPNEW;40}ed[1100000];41ROPNEW(ed);42Edge* head[12];43
44void dfs_vis(int p, int fa = 0){45 vis[p] = true, ++cnt;46 for(auto i = head[p]; i; i = i->nxt){47 if(SON == fa)continue;48 if(vis[SON]){flag = false; return;}49 dfs_vis(SON, p);50 }51}52bool Check(void){53 memset(head, 0, sizeof head);54 for(int i = 0; i <= 11; ++i)exist[i].reset();55 vis.reset();56 int tot = cur.size();57 if(tot <= 1)return true;58 for(auto p : cur){59 int mn(INT_MAX), mnp(-1);60 for(auto q : cur)61 if(q != p && (a[p] ^ a[q]) < mn)mn = a[p] ^ a[q], mnp = q;62 if(exist[p][mnp])continue;63 exist[p][mnp] = exist[mnp][p] = true;64 head[p] = new Edge{head[p], mnp};65 head[mnp] = new Edge{head[mnp], p};66 }flag = true, cnt = 0; dfs_vis(cur.front());67 return flag && cnt == tot;68}69void dfs(int p = 1){70 if(p > N){71 if(Check())ans = min(ans, N - (int)cur.size());72 return;73 }74 dfs(p + 1);75 cur += p;76 dfs(p + 1);77 cur.pop_back();78}79
80int main(){81 freopen("star.in", "r", stdin);82 freopen("star.out", "w", stdout);83 N = read();84 if(N > 10)printf("qwq\n"), exit(0);85 for(int i = 1; i <= N; ++i)a[i] = read();86 dfs();87 printf("%d\n", ans);88 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);89 return 0;90}91
92template < typename T >93inline T read(void){94 T ret(0);95 int flag(1);96 char c = getchar();97 while(c != '-' && !isdigit(c))c = getchar();98 if(c == '-')flag = -1, c = getchar();99 while(isdigit(c)){100 ret *= 10;101 ret += int(c - '0');102 c = getchar();103 }104 ret *= flag;105 return ret;106}原题 LG-P3747 [六省联考 2017] 相逢是问候。
cc0000 贴心地给了 exEular,但是依然没想出来,只能有一点思路,具体是在没搞出来。但是实际上好像难度也不算是太离谱,比较显然,不过细节比较多。
然后写了点简单的部分分,时间都在调 T3 所以也没去写后面的性质,最后
xxxxxxxxxx101123
45678910
11using namespace std;12
13mt19937 rnd(random_device{}());14int rndd(int l, int r){return rnd() % (r - l + 1) + l;}15bool rnddd(int x){return rndd(1, 100) <= x;}16
17typedef unsigned int uint;18typedef unsigned long long unll;19typedef long long ll;20typedef long double ld;21
2223
24template < typename T = int >25inline T read(void);26
27int N, M, P, C;28int a[51000];29
30ll qpow(ll a, ll b){31 ll ret(1), mul(a);32 while(b){33 if(b & 1)ret = ret * mul % MOD;34 b >>= 1;35 mul = mul * mul % MOD;36 }return ret;37}38
39class SegTree{40private:41 ll tr[210000 << 2];42 43 44 45public:46 void Pushup(int p){47 tr[p] = (tr[LS] + tr[RS]) % MOD;48 }49 void Build(int p = 1, int gl = 1, int gr = N){50 if(gl == gr)return tr[p] = a[gl] % MOD, void();51 Build(LS, gl, MID), Build(RS, MID + 1, gr);52 Pushup(p);53 }54 void Modify(int pos, int p = 1, int gl = 1, int gr = N){55 if(gl == gr)return tr[p] = qpow(C, tr[p]), void();56 if(pos <= MID)Modify(pos, LS, gl, MID);57 else Modify(pos, RS, MID + 1, gr);58 Pushup(p);59 }60 ll Query(int l, int r, int p = 1, int gl = 1, int gr = N){61 if(l <= gl && gr <= r)return tr[p];62 if(l > gr || r < gl)return 0;63 return (Query(l, r, LS, gl, MID) + Query(l, r, RS, MID + 1, gr)) % MOD;64 }65}st;66
67int main(){68 freopen("candle.in", "r", stdin);69 freopen("candle.out", "w", stdout);70 N = read(), M = read(), P = read(), C = read();71 for(int i = 1; i <= N; ++i)a[i] = read();72 st.Build();73 while(M--){74 int opt = read();75 if(opt == 0){76 int l = read(), r = read();77 for(int i = l; i <= r; ++i)st.Modify(i);78 }else{79 int l = read(), r = read();80 printf("%lld\n", st.Query(l, r));81 }82 }83 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);84 return 0;85}86
87template < typename T >88inline T read(void){89 T ret(0);90 int flag(1);91 char c = getchar();92 while(c != '-' && !isdigit(c))c = getchar();93 if(c == '-')flag = -1, c = getchar();94 while(isdigit(c)){95 ret *= 10;96 ret += int(c - '0');97 c = getchar();98 }99 ret *= flag;100 return ret;101}原题 CF802O April Fools' Problem (hard)。
正解确实没想到,不过一个比较显然的费用流应该不难想,因为确实很显然。。。
套个正常的模板 MCMF,额外建个边限制一下最大流为
xxxxxxxxxx106123
45678910
11using namespace std;12
13mt19937 rnd(random_device{}());14int rndd(int l, int r){return rnd() % (r - l + 1) + l;}15bool rnddd(int x){return rndd(1, 100) <= x;}16
17typedef unsigned int uint;18typedef unsigned long long unll;19typedef long long ll;20typedef long double ld;21
22
23
24template < typename T = int >25inline T read(void);26
27struct Edge{28 Edge* nxt;29 Edge* rev;30 int to;31 ll flow;32 ll c;33 OPNEW;34}ed[30000];35ROPNEW(ed);36Edge* head[2100];37
38const int S = 2001, RS = 2002, T = 2003, RT = 2004;39int N, K;40ll a[2100], b[2100];41Edge* edg[2100];42ll dis[2100];43ll cflow[2100];44bitset < 2100 > inq;45ll ans(0);46
47bool SPFA(void){48 memset(dis, 0x3f, sizeof dis);49 memset(edg, false, sizeof edg);50 queue < int > cur;51 dis[RS] = 0, cflow[RS] = 0x3f3f3f3f, inq[RS] = true;52 cur.push(RS);53 while(!cur.empty()){54 // printf("searching %d\n", cur.front());55 int p = cur.front(); cur.pop(); inq[p] = false;56 for(auto i = head[p]; i; i = i->nxt){57 if(i->flow <= 0 || dis[SON] <= dis[p] + i->c)continue;58 dis[SON] = dis[p] + i->c, cflow[SON] = min(cflow[p], i->flow), edg[SON] = i;59 if(!inq[SON])cur.push(SON), inq[SON] = true;60 }61 }return edg[RT];62}63void MCMF(void){64 while(SPFA()){65 ans += dis[RT] * cflow[RT];66 for(int p = RT; p != RS; p = edg[p]->rev->to)67 edg[p]->flow -= cflow[RT], edg[p]->rev->flow += cflow[RT];68 }69}70void add(int s, int t, int flow, int c){71 head[s] = new Edge{head[s], npt, t, flow, c};72 head[t] = new Edge{head[t], npt, s, 0, -c};73 head[s]->rev = head[t], head[t]->rev = head[s];74}75
76int main(){77 freopen("letter.in", "r", stdin);78 freopen("letter.out", "w", stdout);79 N = read(), K = read();80 for(int i = 1; i <= N; ++i)a[i] = read();81 for(int i = 1; i <= N; ++i)b[i] = read();82 add(RS, S, K, 0), add(T, RT, K, 0);83 for(int i = 1; i <= N; ++i){84 add(S, i, 1, a[i]), add(i, T, 1, b[i]);85 if(i <= N - 1)add(i, i + 1, 0x3f3f3f3f >> 1, 0);86 }while(SPFA())MCMF();87 printf("%lld\n", ans);88 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);89 return 0;90}91
92template < typename T >93inline T read(void){94 T ret(0);95 int flag(1);96 char c = getchar();97 while(c != '-' && !isdigit(c))c = getchar();98 if(c == '-')flag = -1, c = getchar();99 while(isdigit(c)){100 ret *= 10;101 ret += int(c - '0');102 c = getchar();103 }104 ret *= flag;105 return ret;106}补题暂时咕掉了,laterrrr 回来补。
xxxxxxxxxx11
xxxxxxxxxx11
xxxxxxxxxx11
update-2022_12_24 初稿