多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

2026牛客暑期多校训练营7 2026-8-7

2026牛客暑期多校训练营7 2026-8-7 K天梯赛签到题#includebits/stdc.h#define int long long#define inf 0x3f3f3f3f3f3f3f#define GG ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#define cnot coutNO\n#define cyes coutYES\n#define cans coutans\n#define pb push_back#define x0 first#define y0 second#define lc p1#define rc p1|1#define mem(a,b) memset(a,b,sizeof(a))#define sp(x) fixedsetprecision(x)#define all(v) v.begin(),v.end()#define fr(i,st,ed) for(int ist;ied;i)#define ffr(i,st,ed,dt) for(int ist;ied;idt)using namespace std;typedef pairint,stringPis;typedef pairint,intPii;typedef pairstring,stringPss;const int N2e410,mod1e97,M1e610;int lowbit(int x){return x(-x);}string Get(vectorstringvec,int r){string res;int szvec.size();fr(i,0,sz-1){if(ir)//res.pb(vec[i]);resvec[i];else //res.pb(vec[i][0]);resvec[i][0];}return res;}void solve(){int n;cinn;cin.ignore();vectorvectorstringa(n1);vectorintRo(n1,0);vectorstringans(n1);fr(i,1,n){string s;getline(cin,s);int sizs.size();string tmp;fr(j,0,siz-1){if(s[j] ){a[i].pb(tmp);tmp.clear();}else{tmp.pb(s[j]);}}a[i].pb(tmp);}fr(stp,1,100){mapstring,vectorintmp;vectorboolck(n1,0);bool f0;fr(i,1,n){ans[i]Get(a[i],Ro[i]);mp[ans[i]].pb(i);}for(const auto [ss,vecc]:mp){if(vecc.size()1){f1;for(int x:vecc)ck[x]1;}}if(!f)break;fr(i,1,n){if(ck[i])Ro[i];}}fr(i,1,n)coutans[i]\n;}signed main(){GG;int _t1;//cin_t;while(_t--){solve();}}L中国剩余定理但不用也能做如图#includebits/stdc.h#define int long long#define inf 0x3f3f3f3f3f3f3f#define GG ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#define cnot coutNO\n#define cyes coutYES\n#define cans coutans\n#define pb push_back#define x0 first#define y0 second#define lc p1#define rc p1|1#define mem(a,b) memset(a,b,sizeof(a))#define sp(x) fixedsetprecision(x)#define all(v) v.begin(),v.end()#define fr(i,st,ed) for(int ist;ied;i)#define ffr(i,st,ed,dt) for(int ist;ied;idt)using namespace std;typedef pairint,stringPis;typedef pairint,intPii;typedef pairstring,stringPss;const int N2e410,mod1e97,M1e610;int lowbit(int x){return x(-x);}void solve(){int n;cinn;int ans0;fr(b,1,sqrt(n)1){int cb*(b1);int res((n1)/c)*b;int remmax(0LL,n-(((n1)/c1)*c-b)1);resrem;ansres;}cans;}signed main(){GG;int _t1;//cin_t;while(_t--){solve();}}G题解 核心结论存在必胜策略当且仅当不同数值不超过3种。 一种值时直接成立。 两种值A,B每次对手给出不同值交替的放置(A,B)和(B,A)。异值 对的数量为偶数将它们交替定向即可抵消。三种值A,B,C和两种值的策略类似。 每次对手给出不同值AB交替放置(A,B),(B,A) 每次对手给出不同值BC交替放置(B,C),(C,B) 每次对手给出不同值CA交替放置(C,A),(A,C) 三类剩余数量的奇偶性相同若都是奇数个将三对定向成环 (A −B)(B−C)(C−A)0若至少有四种值取ABCD,对手先给出(A,B)与 (C,D)。 玩家定向后设左侧两个数为p,q右侧两个数为r,s再将第二份配 成(p,q) 与 (r,s),无论玩家如何定向总差值均为 (p q−r−s)±(p−q)±(r−s)2(u−v), 其中u∈{p,q}v∈{r,s}。 四个值互不相同差值不可能为0其余同值元素两两配对即可。 统计不同值数量复杂度O(nlogn)空间复杂度O(n)。#includebits/stdc.h#define int long long#define pii pairint,int#define endl \n#define fi first#define se second#define dbg(x) cout#x xendl;#define dbg2(x,y) cout#x x #y yendl;#define dbg3(x,y,z) cout#x x #y y #z zendl;#define forn for(int i1;in;i)#pragma GCC optimize(2)using namespace std;void solve(){int n;cinn;mapint,intmp;forn{int x;cinx;mp[x];}if(mp.size()3){coutYES;}else{coutNO;}}signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int T1;//cinT;while(T--){solve();}return 0;}A个人感觉今年多校出的前五好的题目之一花费k的代价选择任意多的数抑或 这个条件等价 选择一个二进制位付出1i的代价使得所有数的该位可以变化现在我们需要创造一个可变化序列代表 哪些位可变 并找出最优可变序列满足能够创造不减序列这个 可以修改序列 可以用一个位掩码表示我们首先来思考对于一个可修改序列的位掩码如何贪心的构造不减序列对于当前的数 val,它的前缀 pre我们希望将修改为nxt使得nxtpre一个显然的贪心是我们希望nxt在满足要求的情况下尽可能小我们首先找到这两个数不相同且不可修改的最高位置如果这个位置不存在就说明如果这个位置不存在说明我们可以将nxt构造为pre;令这个位置val的值为xpre的值为y1.x1,y0;此时我们保留该位以上val的值将该位以下val 的可修改位置的值置02.x0,y1;我们尝试寻找val的高位是否存在val的位可修改且为0的值并希望这个位距离该位尽可能近以便构造出尽可能小的数将该位修改为1高位沿用val,比该位低且可修改的值置0逐步构造如果能顺利完成说明该修改方式合法接下来尝试寻找最优 可修改位的集合一个二进制上的显然是 高位修改的代价大于其所有低位修改加起来的和所以我们可以从最高位开始贪心的假设该位不用修改而比它低的位全部需要修改如果能通过则说明该位没有修改的必要不能则需要在答案中加入该位实现需要一定的二进制熟练度总体难度大约cf2200(nk那个2600有点扯淡了。。。#includebits/stdc.h#define int long long#define inf 0x3f3f3f3f3f3f3f#define GG ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#define cnot coutNO\n#define cyes coutYES\n#define cans coutans\n#define pb push_back#define x0 first#define y0 second#define lc p1#define rc p1|1#define mem(a,b) memset(a,b,sizeof(a))#define sp(x) fixedsetprecision(x)#define all(v) v.begin(),v.end()#define fr(i,st,ed) for(int ist;ied;i)#define ffr(i,st,ed,dt) for(int ist;ied;idt)using namespace std;typedef pairint,stringPis;typedef pairint,intPii;typedef pairstring,stringPss;const int N2e510,mod1e97,M1e610;int lowbit(int x){return x(-x);}int a[N];int n;int nxt(int val,int pre,int Mask){int dif(val^pre)(((1LL32)-1)^Mask);if(dif0)return pre;int hi63-__builtin_clzll(dif);int x(valhi)1;int y(prehi)1;if(x1y0){int u((1LL32)-1)^((1LL(hi1))-1);int l(1LLhi)-1;int res0;res|preu;res|(1LLhi);res|val(((1LL32)-1)^Mask)l;return res;}else{int ca(Mask(((1LL32)-1)^pre))(((1LL32)-1)^((1LL(hi1))-1));if(!ca)return -1;int pos__builtin_ctzll(ca);int u((1LL32)-1)^((1LL(pos1))-1);int l(1LLpos)-1;int res0;res|preu;res|(1LLpos);res|val(((1LL32)-1)^Mask)l;return res;}}void solve(){cinn;fr(i,1,n)cina[i];int ans0;for(int i32;i0;i--){int mskans|((1LLi)-1);bool f1;int prv0;fr(j,1,n){int curnxt(a[j],prv,msk);if(cur-1){f0;break;}prvcur;}if(!f)ans|(1LLi);}cans;}signed main(){GG;int _t1;cin_t;while(_t--){solve();}}D逆向思考 假设当前候选者只有冠军逐步往里面加入成员加入顺序代表最终答案的逆序此时的每一次加入要求1.加入者在p中的位置此时p中的最小值在q中的位置此时q中的最大值2.加入者在p中的位置此时p中的最小值在q中的位置此时q中的最大值这样做是为了不出现同时是pq头部的情况一个显然的贪心是取尽可能离当前最小值近的位置加入以便避免漏掉元素必要性显然充分性的证明可以移步标准题解#includebits/stdc.h#define int long long#define inf 0x3f3f3f3f3f3f3f#define GG ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#define cnot coutNO\n#define cyes coutYES\n#define cans coutans\n#define pb push_back#define x0 first#define y0 second#define lc p1#define rc p1|1#define mem(a,b) memset(a,b,sizeof(a))#define sp(x) fixedsetprecision(x)#define all(v) v.begin(),v.end()#define fr(i,st,ed) for(int ist;ied;i)#define ffr(i,st,ed,dt) for(int ist;ied;idt)using namespace std;typedef pairint,stringPis;typedef pairint,intPii;typedef pairstring,stringPss;const int N2e510,mod1e97,M1e610;int lowbit(int x){return x(-x);}int n,x;struct Node{int Max;};Node tree1[N2],tree2[N2];int p[N],q[N],Posp[N],Posq[N],valp[N],valq[N];void up(int p,Node tree[]){tree[p].Maxmax(tree[p1].Max,tree[p1|1].Max);}void build(int p,int l,int r,Node tree[],int a[]){if(lr){tree[p].Maxa[l];return;}int mid(lr)1;build(p1,l,mid,tree,a);build(p1|1,mid1,r,tree,a);up(p,tree);}void upd(int p,int l,int r,int pos,Node tree[]){if(lr){tree[p].Max-1;return;}int mid(lr)1;if(posmid)upd(p1,l,mid,pos,tree);if(posmid)upd(p1|1,mid1,r,pos,tree);up(p,tree);}int quemax(int p,int l,int r,int nl,int nr,Node tree[]){if(nrl||rnl) return -1;if(nllrnr)return tree[p].Max;int mid(lr)1;return max(quemax(p1,l,mid,nl,nr,tree),quemax(p1|1,mid1,r,nl,nr,tree));}int quepos(int p,int l,int r,int pos,int val,Node tree[]){if(lpos||tree[p].Maxval)return -1;if(lr)return l;int mid(lr)1;int res-1;if(posmid)resquepos(p1|1,mid1,r,pos,val,tree);if(res!-1)return res;return quepos(p1,l,mid,pos,val,tree);}void solve(){cinnx;fr(i,1,n){cinp[i];Posp[p[i]]i;}fr(i,1,n){cinq[i];Posq[q[i]]i;}fr(i,1,n){valp[i]Posq[p[i]];valq[i]Posp[q[i]];}build(1,1,n,tree1,valp);build(1,1,n,tree2,valq);upd(1,1,n,Posp[x],tree1);upd(1,1,n,Posq[x],tree2);int minpPosp[x],minqPosq[x];vectorintans;while((int)ans.size()n-1){int cp-1,cq-1;if(minp1){if(quemax(1,1,n,1,minp-1,tree1)minq){cpquepos(1,1,n,minp-1,minq,tree1);}}if(minq1){if(quemax(1,1,n,1,minq-1,tree2)minp){cqquepos(1,1,n,minq-1,minp,tree2);}}if(cp-1cq-1){cnot;return;}int chos;if(cp!-1)chosp[cp],minpPosp[chos];else chosq[cq],minqPosq[chos];ans.pb(chos);upd(1,1,n,Posp[chos],tree1);upd(1,1,n,Posq[chos],tree2);}cyes;int szans.size();for(int isz-1;i0;i--){coutans[i] ;}cout\n;}signed main(){GG;int _t1;//cin_t;while(_t--){solve();}}
返回列表