2021年牛客暑期多校训练营4
A Course(待)
题意:
题解:
注意:
代码:
B Sample Game(待)
题意:
题解:
注意:
代码:
C LCS
题意:
给定数字a,b,c,n现在让你找到三个字符串s1,s2,s3 其中LCS(s1,s2)长度为a LCS(s2,s3)长度为b LCS(s1,s3)长度为c。而且s1,s2,s3长度都为n,如果不存在输出0,否则输出任意的一组s1,s2,s3即可
题解:
详情参考 注意LCS的含义,最长公共子序列是可以不连续的。理解含义之后就发现这居然是道签到题,构造即可。
因为a,b,c之间容斥的关系 a+b+c-2*min<=n恒成立,如果出现>的情况则直接输出NO即可,之后再进行构造。比如说:
- s1,s2,s3共有的用字符 a
- s1,s2,共有,s3没有的 b
- s2,s3共有,s1没有的 c
- s1,s3共有,s2没有的 d
- s1独有的 e
- s2独有的 f
- s3独有的 g
注意:
注意一下格式就好了
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
char s1[maxn],s2[maxn],s3[maxn];
int main()
{
int a,b,c,n;
scanf("%d%d%d%d",&a,&b,&c,&n);
int mini=min(a,b);mini=min(mini,c);//得到这三个串共有的字符个数
if(a+b+c-2*mini>n){//a-min=>s1和s2共有的但是s3没有的,b-min=>s2和s3共有的但是s1没有的,c-min=>s1和s3共有的但是s2没有的;
printf("NO");
return 0;
}
for(int i=0;i<mini;i++){
s1[i]=s2[i]=s3[i]=\'a\';
}
for(int i=mini;i<a;i++){
s1[i]=\'b\';
s2[i]=\'b\';
}
b-=mini;c-=mini;
for(int i=a;i<a+b;i++){//b-mini表示的是s2和s3共有的
s2[i]=\'c\';
s3[i]=\'c\';
}
for(int i=a+b;i<a+b+c;i++){//c-mini表示的是s1,s3共有的
s1[i]=\'d\';
s3[i]=\'d\';
}
for(int i=0;i<n;i++){//自己独有的补齐即可
if(s1[i])cout<<s1[i];
else cout<<\'e\';
}
cout<<endl;
for(int i=0;i<n;i++){//自己独有的补齐即可
if(s2[i])cout<<s2[i];
else cout<<\'f\';
}
cout<<endl;
for(int i=0;i<n;i++){//自己独有的补齐即可
if(s3[i])cout<<s3[i];
else cout<<\'g\';
}
return 0;
}
D Rebuild Tree(待)
题意:
题解:
注意:
代码:
E Tree Xor(待)
题意:
现有一个无向图,两个点i,j之间的权值是w[i]^w[j],已知每一个w[i]所在的区间,现在问一共有多少种w数组,符合条件
题解:
注意:
代码:
F Just a joke
题意:
给定一个无向图,Alice和Bob轮流进行操作,两种操作:1.删除一个点,2.删除一个联通组件,谁不能进行操作谁就输了。
题解:
操作1.删去一条边 ,边数-1。操作 2.删去没有环的联通组件 (1-2 ,1-3)边数-k点数-(k+1)
也就是说每次的操作都是边数+点数-奇数,这样一来就只和n+m有关了
注意:
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)scanf("%d%d",&x,&y);
if((n+m)&1)printf("Alice");
else printf("Bob");
return 0;
}
G Product(待)
题意:
题解:
注意:
代码:
H Convolution(待)
题意:
题解:
注意:
代码:
I Inverse Pair
题意:
对给定的n个数,只能给某些数+1,或者不变,从而使得整个序列的逆序对数最少
题解:
就直接逆序对,然后输入的时候处理一下数据,我当时构造的时候也这么想过,但是我老往函数里边构造,结果就出不来