NOIP2021 做题笔记

news/2024/11/17 17:37:19/文章来源:https://www.cnblogs.com/nagato--yuki/p/18543033

这次又被抓过去写noip2021了\(qaq\)

P7960 [NOIP2021] 报数

可以用类似于质数筛的方法筛一遍,做到 \(\mathcal O(\)值域\()\) 的预处理,以及 \(\mathcal O(1)\) 的查询。


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mxn 10000010
#define mxm 200010
bool vis[mxn];
int nxt[mxn];
inline bool check(int x){while(x){if(x%10==7)return 1;x/=10;}return 0;
}
void init(){for(int i=1;i<=mxn-10;i++){if(vis[i])continue;if(check(i))for(ll j=1;j*i<=mxn-10;j++)vis[j*i]=1;}ll lst=10000001;for(int i=mxn-10;i;i--)if(!vis[i])nxt[i]=lst,lst=i;
}
void solve(){int x;cin>>x;if(vis[x])cout<<"-1\n";else cout<<nxt[x]<<'\n';
}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);init();int T;cin>>T;while(T--)solve();return 0;
}

P7961 [NOIP2021] 数列

这题数据小,考虑使用超大力dp。
\(dp[i][j][k][l]\) 为讨论到 \(S\) 的第 \(i\) 位(二进制下),确定了 \(a\) 序列前 \(k\) 个数,\(S\) 前面有 \(k\)\(1\),且从上一位进位过来的有 \(l\) 位,假设序列上有 \(o\)\(i\),则有方程:

\[dp[i+1][j+o][k+(o+l)\&1][(o+l)>>1]=dp[i][j][k][l]\times {v_i}^{o}\times C_{n-j}^t \]

暴力转移即可。


#include<bits/stdc++.h>
using namespace std;
#define mxn 40
#define mxm 110
#define ll long long
#define mod 998244353
#define bpop __builtin_popcount
ll n,m,k,c[mxn][mxn],v[mxm];
ll poww[mxm][mxm],dp[mxm][mxn][mxn][mxm];
ll ans;
void init(){c[0][0]=1;for(int i=1;i<=n;i++){c[i][0]=1;for(int j=1;j<=i;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;}for(int i=0;i<=m;i++){poww[i][0]=1;for(int j=1;j<=n;j++)poww[i][j]=poww[i][j-1]*v[i]%mod;}
}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>m>>k;for(int i=0;i<=m;i++)cin>>v[i];init();//i:讨论到第i位//j:确定了前j个数//k:前面有k个1//l:从上一位进位l个//o:给S贡献o个1dp[0][0][0][0]=1;for(int i=0;i<=m;i++)for(int j=0;j<=n;j++)for(int kk=0;kk<=k;kk++)for(int l=0;l<=n/2;l++)for(int o=0;o<=n-j;o++)dp[i+1][j+o][kk+((l+o)&1)][(l+o)/2]=(   dp[i+1][j+o][kk+((l+o)&1)][(l+o)/2]+dp[i][j][kk][l]*poww[i][o]%mod*c[n-j][o]%mod )%mod;for(int i=0;i<=k;i++)for(int j=0;j<=n/2;j++)if(i+bpop(j)<=k)ans=(ans+dp[m+1][n][i][j])%mod;cout<<ans;
}

P7962 [NOIP2021] 方差

什么 \(dp\)?没听说过啊。
考虑到差分数组为单谷函数时方差最小,直接随机化shuffle差分数组搞定!


#include<bits/stdc++.h>
#define ll long long
#define inf 1e15
#define mxn 10100
using namespace std;
ll a[mxn],b[mxn],n;
int main(){srand(unsigned(time(0)));ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n; int time=clock();           for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++)b[i]=a[i]-a[i-1];sort(b+2,b+n+1);ll suf=0,sum=0,ans=inf;int mid=(n+1)/2;while(1){suf=0,sum=0;random_shuffle(b+2,b+n+1);sort(b+2,b+mid,[](int x,int y){return x>y;}),sort(b+mid+1,b+n+1);for(int i=1;i<=n;i++)a[i]=a[i-1]+b[i];for(int i=1;i<=n;i++)suf+=n*a[i]*a[i],sum+=a[i];ans=min(ans,suf-sum*sum);if(clock()-time>=990000)break;}cout<<ans;return 0;
}

P7963 [NOIP2021] 棋局

极其恶心的数据结构题。
首先,对于 \(\rm case\ 1\sim8\),可以直接暴力。
而对于 \(\rm case\ 9\sim14\),可以写并查集维护。
接下来来到正解环节。
由于棋子是一个一个加入的,所以连通块是不断分割的,有点难以维护,不妨倒着处理。
我们先写一个并查集,用于维护互通道路组成的连通块,以及直行道路组成的连通块(这里横向和纵向分开处理,原因后面讲)。
这个并查集需要维护连通块的大小,以及块内的编号最大最小值。


struct Dsu{int f[mxn],sze[mxn],minn[mxn],maxn[mxn];int fu,fv;I void init(){for(int i=1;i<=n*m;i++)f[i]=minn[i]=maxn[i]=i,sze[i]=1;}I int fnd(int x){return x==f[x]?x:f[x]=fnd(f[x]);}I void merge(int u,int v,int opt){fu=fnd(u),fv=fnd(v);if(fu==fv)return;if(sze[fu]>sze[fv])swap(fu,fv);f[fu]=fv,sze[fv]+=sze[fu];maxn[fv]=maxn[fu]>maxn[fv]?maxn[fu]:maxn[fv];minn[fv]=minn[fu]<minn[fv]?minn[fu]:minn[fv];if(opt)Merge(fu,fv);}
}dsu[3];

那吃子怎么办呢?
如果是走互通道路,则对于每一个联通块,可以开一个线段树(当然要动态开点),把连通块周围能吃掉的棋子存进去(要分两个颜色维护),若是黑色棋子,查询能吃到的白色棋子的数量即可。

如果是普通或直行道路,那最多吃四个子,直接判断就行了。

当合并连通块时,可以将两个联通块的线段树也合并进去。

这里可以按照加入棋子的顺序离散化每个棋子的等级,使每个棋子的等级不同。


//就像这样
struct Chess{int lvl,col,x,y,id;
}ch[mxn],ch2[mxn];
void solve(){sort(ch2+1,ch2+q+1,[](Chess a,Chess b){return a.lvl==b.lvl?a.id<b.id:a.lvl<b.lvl;});for(int i=1;i<=q;i++)ch[ch2[i].id]=ch2[i],ch[ch2[i].id].lvl=i;
}

线段树:


struct Seg{int ls[mxm],rs[mxm],cnt,rt[mxn<<1],sum[mxm];I void init(){memset(rt,0,sizeof(rt));for(int i=1;i<=cnt;i++)ls[i]=rs[i]=sum[i]=0;cnt=0;}I void push_up(int rot){sum[rot]=sum[ls[rot]]+sum[rs[rot]];}I int insert(int rot,int l,int r,int x){//单点插入if(!rot)rot=++cnt;//动态开店if(l==r){if(!sum[rot])sum[rot]++;return rot;}int mid=(l+r)>>1;if(mid>=x)ls[rot]=insert(ls[rot],l,mid,x);else rs[rot]=insert(rs[rot],mid+1,r,x);push_up(rot);return sum[rot]?rot:0;}I int remove(int rot,int l,int r,int x){//单点删除if(!rot)rot=++cnt;if(l==r)return 0;int mid=(l+r)>>1;if(mid>=x)ls[rot]=remove(ls[rot],l,mid,x);else rs[rot]=remove(rs[rot],mid+1,r,x);push_up(rot);return sum[rot]?rot:0;}I int merge(int rot1,int rot2,int l,int r){//线段树合并if(!rot1||!sum[rot1])return rot2;if(!rot2||!sum[rot2])return rot1;if(l==r){sum[rot2]=min(sum[rot1]+sum[rot2],1);return rot2;}int mid=(l+r)>>1;ls[rot2]=merge(ls[rot1],ls[rot2],l,mid);rs[rot2]=merge(rs[rot1],rs[rot2],mid+1,r);push_up(rot2);return rot2;}I int query(int rot,int l,int r,int x,int y,int opt=0){//区间求和if(!rot||y<l||x>r)return 0;if(l>=x&&r<=y)return sum[rot];int mid=(l+r)>>1,ret=0;if(x<=mid)ret+=query(ls[rot],l,mid,x,y,opt);if(y>mid)ret+=query(rs[rot],mid+1,r,x,y,opt);return ret;}
}Scol[2];

但是这样还不够,因为有可能一个点可以同时从直行道路和互通道路走到。所以要去重。

考虑同一行/列的点是连续的,所以可以按两种方式编号(就是之前讲的横向纵向分开处理),再插到线段树里,去重的时候直接区间查询就行了。

首先是预处理环节:


for(int i=1;i<=q;i++)vis[get1(ch[i].x,ch[i].y)]=i;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){int id=get1(i,j),nxt;if(vis[id])continue;//如果这个点上有棋子直接跳过for(int k=1;k<=4;k++){int fx=i+dir[k][0],fy=j+dir[k][1];if(fx<1||fy<1||fx>n||fy>m)continue;nxt=get1(fx,fy);if(vis[nxt])continue;if(edge[id][k]==2)dsu[k%2+1].merge(id,nxt,0);//如果为直行道路,分行/列放到并查集里if(edge[id][k]==3)dsu[0].merge(id,nxt,0);//如果为互通道路}}
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){int id1=get1(i,j),id2=get2(i,j),id=dsu[0].fnd(id1),nxt,col;//按两种方式编号Sdir[0].rt[id]=Sdir[0].insert(Sdir[0].rt[id],1,n*m,id1);//分别插进两个线段树里Sdir[1].rt[id]=Sdir[1].insert(Sdir[1].rt[id],1,n*m,id2);for(int k=1;k<=4;k++){int fx=i+dir[k][0],fy=j+dir[k][1];if(edge[id1][k]!=3||fx<1||fy<1||fx>n||fy>m)continue;nxt=get1(fx,fy);//如果是互通道路if(!vis[nxt])continue;col=ch[vis[nxt]].col;//按颜色,将每个棋子的等级插进去Scol[col].rt[id]=Scol[col].insert(Scol[col].rt[id],1,q,ch[vis[nxt]].lvl);}}

接下来,首先是计算互通道路的贡献:


for(int j=1;j<=4;j++){if(edge[id][j]!=3)continue;fx=X+dir[j][0],fy=Y+dir[j][1];if(fx<1||fy<1||fx>n||fy>m)continue;nxt=dsu[0].fnd(get1(fx,fy));Scol[col].remove(Scol[col].rt[nxt],1,q,ch[i].lvl);//之后这个棋子就不在了,不能被吃掉,所以要移除
}
for(int j=1;j<=4;j++){if(edge[id][j]!=3)continue;fx=X+dir[j][0],fy=Y+dir[j][1];if(fx<1||fy<1||fx>n||fy>m)continue;nxt=get1(fx,fy);if(vis[nxt]&&vis[nxt]<i)continue;dsu[0].merge(id,nxt,1);//将这个棋子合并进周围的连通块里
}
fid1=dsu[0].fnd(id);
ans[i]+=dsu[0].sze[fid1]-1;//-1是因为去掉棋子所在点的贡献
ans[i]+=Scol[!col].query(Scol[!col].rt[fid1],1,q,1,ch[i].lvl,i==4?1:0);//能吃的棋子数

然后是直行道路:


for(int j=1;j<=4;j++){if(edge[id][j]!=2)continue;fx=X+dir[j][0],fy=Y+dir[j][1];if(fx<1||fy<1||fx>n||fy>m)continue;nxt=get1(fx,fy);if(vis[nxt]&&vis[nxt]<i)continue;dsu[j%2+1].merge(id,nxt,0);//横向/纵向的合并
}
fid2=dsu[2].fnd(id);
int maxn,minn;
maxn=dsu[2].maxn[fid2],minn=dsu[2].minn[fid2];
ans[i]+=maxn-minn+1;//先算横向的贡献
ans[i]-=Sdir[0].query(Sdir[0].rt[fid1],1,n*m,minn,maxn);//去重,将minn~maxn范围内互通道路能走到的点的数量去掉
if(edge[minn][1]==2&&eat(i,vis[minn-1])&&Scol[!col].query(Scol[!col].rt[fid1],1,q,ch[vis[minn-1]].lvl,ch[vis[minn-1]].lvl)==0)ans[i]++;
if(edge[maxn][3]==2&&eat(i,vis[maxn+1])&&Scol[!col].query(Scol[!col].rt[fid1],1,q,ch[vis[maxn+1]].lvl,ch[vis[maxn+1]].lvl)==0)ans[i]++;
//计算吃子数,注意这里计算时要看这个子能不能从互通道路走过去吃掉
fid2=dsu[1].fnd(id);
maxn=dsu[1].maxn[fid2],minn=dsu[1].minn[fid2];
ans[i]+=(maxn-minn)/m+1;//纵向同理
if(edge[minn][2]==2&&eat(i,vis[minn-m])&&Scol[!col].query(Scol[!col].rt[fid1],1,q,ch[vis[minn-m]].lvl,ch[vis[minn-m]].lvl)==0)ans[i]++;
if(edge[maxn][4]==2&&eat(i,vis[maxn+m])&&Scol[!col].query(Scol[!col].rt[fid1],1,q,ch[vis[maxn+m]].lvl,ch[vis[maxn+m]].lvl)==0)ans[i]++;
fx=getx(maxn),fy=gety(maxn),maxn=get2(fx,fy);
fx=getx(minn),fy=gety(minn),minn=get2(fx,fy);
ans[i]-=Sdir[1].query(Sdir[1].rt[fid1],1,n*m,minn,maxn);

最后是普通道路:


for(int j=1;j<=4;j++){if(edge[id][j]!=1)continue;fx=X+dir[j][0],fy=Y+dir[j][1];if(fx<1||fy<1||fx>n||fy>m)continue;nxt=get1(fx,fy);if(vis[nxt]&&vis[nxt]<i){if(eat(i,vis[nxt])&&Scol[!col].query(Scol[!col].rt[fid1],1,q,ch[vis[nxt]].lvl,ch[vis[nxt]].lvl)==0)ans[i]++;}//这里计算时要看这个子能不能从互通道路走过去吃掉else if(dsu[0].fnd(id)!=dsu[0].fnd(nxt))ans[i]++;//如果是在一个块里,说明互通道路可以走到,不计算
}

最后的最后,献上完整代码:


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mxn 200010
#define mxm 5000010
#define I inline
int n,m,q,edge[mxn][5],vis[mxn],ans[mxn];
int dir[5][2]={{0,0},{0,-1},{-1,0},{0,1},{1,0}};
char str[mxn];
I int get1(int x,int y){return (x-1)*m+y;}
I int get2(int x,int y){return (y-1)*n+x;}
I int getx(int x){return (x-1)/m+1;}
I int gety(int x){return (x-1)%m+1;}
I void Merge(int u,int v);
struct Chess{int lvl,col,x,y,id;
}ch[mxn],ch2[mxn];
struct Dsu{int f[mxn],sze[mxn],minn[mxn],maxn[mxn];int fu,fv;I void init(){for(int i=1;i<=n*m;i++)f[i]=minn[i]=maxn[i]=i,sze[i]=1;}I int fnd(int x){return x==f[x]?x:f[x]=fnd(f[x]);}I void merge(int u,int v,int opt){fu=fnd(u),fv=fnd(v);if(fu==fv)return;if(sze[fu]>sze[fv])swap(fu,fv);f[fu]=fv,sze[fv]+=sze[fu];maxn[fv]=maxn[fu]>maxn[fv]?maxn[fu]:maxn[fv];minn[fv]=minn[fu]<minn[fv]?minn[fu]:minn[fv];if(opt)Merge(fu,fv);}
}dsu[3];
struct Seg{int ls[mxm],rs[mxm],cnt,rt[mxn<<1],sum[mxm];I void init(){memset(rt,0,sizeof(rt));for(int i=1;i<=cnt;i++)ls[i]=rs[i]=sum[i]=0;cnt=0;}I void push_up(int rot){sum[rot]=sum[ls[rot]]+sum[rs[rot]];}I int insert(int rot,int l,int r,int x){if(!rot)rot=++cnt;if(l==r){if(!sum[rot])sum[rot]++;return rot;}int mid=(l+r)>>1;if(mid>=x)ls[rot]=insert(ls[rot],l,mid,x);else rs[rot]=insert(rs[rot],mid+1,r,x);push_up(rot);return sum[rot]?rot:0;}I int remove(int rot,int l,int r,int x){if(!rot)rot=++cnt;if(l==r)return 0;int mid=(l+r)>>1;if(mid>=x)ls[rot]=remove(ls[rot],l,mid,x);else rs[rot]=remove(rs[rot],mid+1,r,x);push_up(rot);return sum[rot]?rot:0;}I int merge(int rot1,int rot2,int l,int r){if(!rot1||!sum[rot1])return rot2;if(!rot2||!sum[rot2])return rot1;if(l==r){sum[rot2]=min(sum[rot1]+sum[rot2],1);return rot2;}int mid=(l+r)>>1;ls[rot2]=merge(ls[rot1],ls[rot2],l,mid);rs[rot2]=merge(rs[rot1],rs[rot2],mid+1,r);push_up(rot2);return rot2;}I int query(int rot,int l,int r,int x,int y,int opt=0){if(!rot||y<l||x>r)return 0;if(l>=x&&r<=y)return sum[rot];int mid=(l+r)>>1,ret=0;if(x<=mid)ret+=query(ls[rot],l,mid,x,y,opt);if(y>mid)ret+=query(rs[rot],mid+1,r,x,y,opt);return ret;}
}Scol[2],Sdir[2];
I void init(){memset(edge,0,sizeof(edge));memset(ans,0,sizeof(ans));memset(vis,0,sizeof(vis));dsu[0].init(),dsu[1].init(),dsu[2].init();Scol[0].init(),Scol[1].init();Sdir[0].init(),Sdir[1].init();
}
I void Merge(int u,int v){Scol[0].rt[v]=Scol[0].merge(Scol[0].rt[u],Scol[0].rt[v],1,q);Scol[1].rt[v]=Scol[1].merge(Scol[1].rt[u],Scol[1].rt[v],1,q);Sdir[0].rt[v]=Sdir[0].merge(Sdir[0].rt[u],Sdir[0].rt[v],1,n*m);Sdir[1].rt[v]=Sdir[1].merge(Sdir[1].rt[u],Sdir[1].rt[v],1,n*m);
}
I bool eat(int x,int y){return ch[x].col!=ch[y].col&&ch[x].lvl>ch[y].lvl;
}
I void solve(){cin>>n>>m>>q;init();for(int i=1;i<=n;i++){cin>>str+1;for(int j=1;j<m;j++){edge[get1(i,j+1)][1]=str[j]-'0';edge[get1(i,j)][3]=str[j]-'0';}}for(int i=1;i<n;i++){cin>>str+1;for(int j=1;j<=m;j++){edge[get1(i,j)][4]=str[j]-'0';edge[get1(i+1,j)][2]=str[j]-'0';}}for(int i=1;i<=q;i++)cin>>ch[i].col>>ch[i].lvl>>ch[i].x>>ch[i].y,ch[i].id=i,ch2[i]=ch[i];sort(ch2+1,ch2+q+1,[](Chess a,Chess b){return a.lvl==b.lvl?a.id<b.id:a.lvl<b.lvl;});for(int i=1;i<=q;i++)ch[ch2[i].id]=ch2[i],ch[ch2[i].id].lvl=i;for(int i=1;i<=q;i++)vis[get1(ch[i].x,ch[i].y)]=i;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){int id=get1(i,j),nxt;if(vis[id])continue;for(int k=1;k<=4;k++){int fx=i+dir[k][0],fy=j+dir[k][1];if(fx<1||fy<1||fx>n||fy>m)continue;nxt=get1(fx,fy);if(vis[nxt])continue;if(edge[id][k]==2)dsu[k%2+1].merge(id,nxt,0);if(edge[id][k]==3)dsu[0].merge(id,nxt,0);}}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){int id1=get1(i,j),id2=get2(i,j),id=dsu[0].fnd(id1),nxt,col;Sdir[0].rt[id]=Sdir[0].insert(Sdir[0].rt[id],1,n*m,id1);Sdir[1].rt[id]=Sdir[1].insert(Sdir[1].rt[id],1,n*m,id2);for(int k=1;k<=4;k++){int fx=i+dir[k][0],fy=j+dir[k][1];if(edge[id1][k]!=3||fx<1||fy<1||fx>n||fy>m)continue;nxt=get1(fx,fy);if(!vis[nxt])continue;col=ch[vis[nxt]].col;Scol[col].rt[id]=Scol[col].insert(Scol[col].rt[id],1,q,ch[vis[nxt]].lvl);}}for(int i=q;i;i--){int fx,fy,nxt,id=get1(ch[i].x,ch[i].y),col=ch[i].col,X=ch[i].x,Y=ch[i].y;int fid1,fid2;for(int j=1;j<=4;j++){if(edge[id][j]!=3)continue;fx=X+dir[j][0],fy=Y+dir[j][1];if(fx<1||fy<1||fx>n||fy>m)continue;nxt=dsu[0].fnd(get1(fx,fy));Scol[col].remove(Scol[col].rt[nxt],1,q,ch[i].lvl);}for(int j=1;j<=4;j++){if(edge[id][j]!=3)continue;fx=X+dir[j][0],fy=Y+dir[j][1];if(fx<1||fy<1||fx>n||fy>m)continue;nxt=get1(fx,fy);if(vis[nxt]&&vis[nxt]<i)continue;dsu[0].merge(id,nxt,1);}fid1=dsu[0].fnd(id);ans[i]+=dsu[0].sze[fid1]-1;ans[i]+=Scol[!col].query(Scol[!col].rt[fid1],1,q,1,ch[i].lvl,i==4?1:0);for(int j=1;j<=4;j++){if(edge[id][j]!=2)continue;fx=X+dir[j][0],fy=Y+dir[j][1];if(fx<1||fy<1||fx>n||fy>m)continue;nxt=get1(fx,fy);if(vis[nxt]&&vis[nxt]<i)continue;dsu[j%2+1].merge(id,nxt,0);}fid2=dsu[2].fnd(id);int maxn,minn;maxn=dsu[2].maxn[fid2],minn=dsu[2].minn[fid2];ans[i]+=maxn-minn+1;ans[i]-=Sdir[0].query(Sdir[0].rt[fid1],1,n*m,minn,maxn);if(edge[minn][1]==2&&eat(i,vis[minn-1])&&Scol[!col].query(Scol[!col].rt[fid1],1,q,ch[vis[minn-1]].lvl,ch[vis[minn-1]].lvl)==0)ans[i]++;if(edge[maxn][3]==2&&eat(i,vis[maxn+1])&&Scol[!col].query(Scol[!col].rt[fid1],1,q,ch[vis[maxn+1]].lvl,ch[vis[maxn+1]].lvl)==0)ans[i]++;fid2=dsu[1].fnd(id);maxn=dsu[1].maxn[fid2],minn=dsu[1].minn[fid2];ans[i]+=(maxn-minn)/m+1;if(edge[minn][2]==2&&eat(i,vis[minn-m])&&Scol[!col].query(Scol[!col].rt[fid1],1,q,ch[vis[minn-m]].lvl,ch[vis[minn-m]].lvl)==0)ans[i]++;if(edge[maxn][4]==2&&eat(i,vis[maxn+m])&&Scol[!col].query(Scol[!col].rt[fid1],1,q,ch[vis[maxn+m]].lvl,ch[vis[maxn+m]].lvl)==0)ans[i]++;fx=getx(maxn),fy=gety(maxn),maxn=get2(fx,fy);fx=getx(minn),fy=gety(minn),minn=get2(fx,fy);ans[i]-=Sdir[1].query(Sdir[1].rt[fid1],1,n*m,minn,maxn);for(int j=1;j<=4;j++){if(edge[id][j]!=1)continue;fx=X+dir[j][0],fy=Y+dir[j][1];if(fx<1||fy<1||fx>n||fy>m)continue;nxt=get1(fx,fy);if(vis[nxt]&&vis[nxt]<i){if(eat(i,vis[nxt])&&Scol[!col].query(Scol[!col].rt[fid1],1,q,ch[vis[nxt]].lvl,ch[vis[nxt]].lvl)==0)ans[i]++;}else if(dsu[0].fnd(id)!=dsu[0].fnd(nxt))ans[i]++;}}for(int i=1;i<=q;i++)cout<<ans[i]<<'\n';
}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);int T;cin>>T;while(T--)solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/835422.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二篇Scrum冲刺博客

1 站立式会议 1.1会议照片1.2 会议内容 昨天已完成的工作: 已明确分配的任务,并进行了环境配置,特别是mysql的配置. 今天计划完成的工作项目模块 需要实现的功能 负责人 预计用时初始化模块 环境搭建 王伊若 4h登录模块 用户注册、登录 黄锐 7h登录模块 数据库连接 江佳哲 4…

20222320 2024-2025-1 《网络与系统攻防技术》实验6实验报告

目录 目录目录1.实验目标2.实验内容3.实验过程3.1 前期渗透3.2 Vsftpd源码包后门漏洞(21端口)3.3 SambaMS-RPC Shell命令注入漏洞(端口139)3.4 Java RMI SERVER命令执行漏洞(1099端口)3.5 PHP CGI参数执行注入漏洞(80端口)4.问题及解决方案5.学习感悟、思考等 1.实验目…

IMPRINT:通过学习身份保持表示进行生成对象合成

IMPRINT:通过学习身份保持表示进行生成对象合成生成对象合成作为合成图像编辑的一种有前景的新途径出现了。然而,对象身份保存的要求带来了重大挑战,限制了大多数现有方法的实际使用。作为回应,介绍了IMPRINT,这是一种基于扩散的生成模型,采用两阶段学习框架进行训练,将…

联邦学习开山之作Communication-Efficient Learning of Deep Networks from Decentralized Data

1 介绍 1.1 背景 越来越多的手机和平板电脑成为许多人的主要计算设备。这些设备上强大的传感器(包括摄像头、麦克风和GPS),加上它们经常被携带的事实,意味着它们可以访问前所未有的大量数据,其中大部分本质上是私人的。根据这些数据学习的模型持有承诺通过支持更智能的应用…

高级语言程序设计课程第7次个人作业

2024高级语言程序设计:https://edu.cnblogs.com/campus/fzu/2024C/ 高级语言程序设计课程第7次个人作业:https://edu.cnblogs.com/campus/fzu/2024C/homework/13304 学号:102400128 姓名:吴俊衡 1: 问题:无2: 问题:刚开始没想出来怎么弄,后面递归不会就用了多个for循环3:…

TYPE-C PD浅谈(四)

TYPE-C PD浅谈(四) 当对接识别完成后,Provider会先在VBUS上提供5V,接着会在CC脚位上送出Source Capability(SRC_CAP),格式如下:内容定义了供电的各种选项,如共有几组电源可选,相对应的电压电流等。 当Consumer接收到SRC_CAP封包后,会针对电源列表的内容,挑选一组电压…

STM32F103开发

本节我们将会对STM32的硬件资源进行介绍,包括如下内容:点亮LED; 检测按键按下和松开事件; 串口; 点亮128*128 TFT_LCD液晶屏;一、点亮LED 1.1 电路原理图 LED电路原理图如下图所示:其中:LED1连接到PA8`引脚,低电平点亮; LED2连接到PD2引脚,低电平点亮;1.2 GPIO引脚…

团队项目Scrum冲刺-day7

一、每天举行站立式会议 站立式会议照片一张昨天已完成的工作成员 任务陈国金 协助代码沙箱Docker实现凌枫 创建题目页面陈卓恒 协助开发创建题目页面谭立业 协助开发创建题目页面廖俊龙 接口测试曾平凡 前端页面测试曾俊涛 代码沙箱Docker实现薛秋昊 协助代码沙箱Docker实现今…

爱码单车队-冲刺日志第四天

会议记录:今天主要是投入一些后端的开发任务,然后开始实现基础的登录绑定用户的功能。

2024-2025-1 20241314 《计算机基础与程序设计》第八周学习总结

2024-2025-1 20241314 《计算机基础与程序设计》第八周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 2024-2025-1计算机基础与程序设计第八周作业这个作业的目标 功能设计与面向对象设计 面向对象设计过…

bolt.new只要5分钟就能完成1个网站,神奇惊艳

下面是我用bolt.new5分钟完成的首页,前端页面配色和css都很好看,我觉得很惊艳啦!网站截图如下# 网站介绍生成随机yes或者no答案的网站,每次点击oracle按钮,可以生成yes或者no的随机答案,帮助选择困难症用户,轻松选择yes还是no 网站网址https://yesnooracle.dev 功能特点…

2024-2025-1 20241415《计算机基础与程序设计》第八周学习总结

如2024-2025-1 20241415 《计算机基础与程序设计》第八周学习总结 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第八周作业这个作业的目标 功能设计与面向对象设计,面向对象设计过程,面向对象语言三要…