A略
B
分情况,n等于k时一个一个判断即可,n不等于k,尽量让开头不符合,找第二组数开头的范围[2,2+n-k],哪个不等于1就作为开头,如果没有就是全等于1,那么第二个数就不符合。所以答案非1即2
C
先求每一行数的后缀和,从0到n-1,代表在时间j选择这个队后这个队最后的人数。首先,每个队选两个人的结果肯定不会比选一个人优,故每个队选一个人。再思考假如数i作为MEX,那么它一定不会出现在前缀和的i-1个后面,也不会出现在前面,所以就在i-1的位置。我们找每一行最多到第几列满足前缀和的第i个=i-1即为p[i],将他们从小到大排序,枚举到第几个数的p[i]<i的即可
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int T,n,a[310][310],s[310][310],b[310];
void init()
{for(int i=1;i<=n;i++)b[i]=0;
}
void solve()
{cin>>n;init();for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>a[i][j];for(int i=1;i<=n;i++)for(int j=n;j>=2;j--)s[i][n-j+2]=s[i][n-j+1]+a[i][j];/*for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)cout<<s[i][j]<<" ";cout<<endl;}*/for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)if(s[i][j]!=j-1){b[i]=j-1;break;}if(!b[i]) b[i]=n;}//for(int i=1;i<=n;i++)cout<<b[i]<<endl;sort(b+1,b+n+1);int p=1;for(int i=1;i<=n;i++){if(b[i]>=p) ++p;}cout<<p-1<<endl;
}
signed main()
{std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>T;while(T--) solve();
}
D
可以理解为求从初始点到目标点的最小花费,目标点就是点A在两个图中都与相同的点相连。将每一步操作时两个图点的位置打包成一个状态,最后找所有d[i][i]并且i属于目标点,相当于求二维最短路,用dij
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int T,n,s1,s2,m1,m2,c[1010],b[1010][1010],cc[1010],ans,cnt,d[1010][1010],v[1010][1010];
int ver1[1010*2],Next1[1010*2],head1[1010],tot1,ver2[1010*2],Next2[1010*2],head2[1010],tot2;
priority_queue<pair<int,pair<int,int> > >q;
void init()
{cnt=0;ans=0x3f3f3f3f3f3f3f;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){v[i][j]=c[i]=cc[i]=0;d[i][j]=0x3f3f3f3f3f3f3f;}tot1=tot2=0;for(int i=1;i<=2*n+10;i++)ver1[i]=ver2[i]=Next1[i]=Next2[i]=head1[i]=head2[i]=0;
}
void add1(int x,int y)
{ver1[++tot1]=y;Next1[tot1]=head1[x],head1[x]=tot1;
}
void add2(int x,int y)
{ver2[++tot2]=y;Next2[tot2]=head2[x],head2[x]=tot2;
}
void dij()
{q.push(make_pair(0,make_pair(s1,s2)));d[s1][s2]=0;while(q.size()){int x1=q.top().second.first,x2=q.top().second.second;q.pop();if(v[x1][x2]) continue;v[x1][x2]=1;for(int i=head1[x1];i;i=Next1[i]){int y1=ver1[i];for(int j=head2[x2];j;j=Next2[j]){int y2=ver2[j];if(d[x1][x2]+abs(y1-y2)<d[y1][y2]){d[y1][y2]=d[x1][x2]+abs(y1-y2);q.push(make_pair(-d[y1][y2],make_pair(y1,y2)));}}}}
}
void solve()
{cin>>n>>s1>>s2;init();cin>>m1;for(int i=1;i<=m1;i++){int x,y;cin>>x>>y;add1(x,y),add1(y,x);}cin>>m2;int x[1010],y[1010];for(int i=1;i<=m2;i++){cin>>x[i]>>y[i];b[x[i]][y[i]]=b[y[i]][x[i]]=1;add2(x[i],y[i]),add2(y[i],x[i]);}for(int i=1;i<=n;i++){for(int j=head1[i];j;j=Next1[j]){int y=ver1[j];if(b[i][y]) c[i]=c[y]=1;}}dij();for(int i=1;i<=n;i++)if(c[i]) cc[++cnt]=i;for(int i=1;i<=cnt;i++)if(d[cc[i]][cc[i]]<ans) ans=d[cc[i]][cc[i]];if(ans==0x3f3f3f3f3f3f3f) cout<<-1<<endl;else cout<<ans<<endl;for(int i=1;i<=m2;i++)b[x[i]][y[i]]=b[y[i]][x[i]]=0;
}
signed main()
{std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>T;while(T--) solve();
}