C–LCS
题意:
L C S ( s 1 , s 2 ) LCS(s1,s2) LCS(s1,s2)表示 s 1 s1 s1 和 s 2 s2 s2 的最长公共子序列
给定三个字符串 s 1 s1 s1, s 2 s2 s2, s 3 s3 s3,要求满足 L C S ( s 1 , s 2 ) = a LCS(s1,s2) = a LCS(s1,s2)=a, L C S ( s 2 , s 3 ) = b LCS(s2,s3) = b LCS(s2,s3)=b, L C S ( s 1 , s 3 ) = c LCS(s1,s3) = c LCS(s1,s3)=c
输出满足要求的 s 1 , s 2 , s 3 s1,s2,s3 s1,s2,s3
题解:
构造
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a,b,c,n;
cin>>a>>b>>c>>n;
int x=min(a,min(b,c));
if(c<=n-(b-a)&&a+b-c<=n&&c+a-b<=n)
{
string ans1,ans2,ans3;
for(int i=1;i<=a;i++) ans1+='a',ans2+='a';
for(int i=1;i<=x;i++) ans3+='a';
int aa=ans1.size();
int bb=ans2.size();
int cc=ans3.size();
for(int i=1;i<=b-cc;i++) ans3+='b',ans2+='b';
for(int i=1;i<=c-x;i++) ans1+='c',ans3+='c';
aa=ans1.size();
bb=ans2.size();
cc=ans3.size();
for(int i=aa;i<n;i++) ans1+='z';
for(int i=bb;i<n;i++) ans2+='q';
for(int i=cc;i<n;i++) ans3+='e';
cout<<ans1<<endl<<ans2<<endl<<ans3<<endl;
}
else cout<<"NO"<<endl;
return 0;
}
F–Just a joke
题意:
在无向图 G G G 中删边, 有两种操作
( 1 ) (1) (1) 选择 G G G 的一条边,从 G G G 中删除。
( 2 ) (2) (2) 选择 G G G 中没有任何环的连通分量,然后将其从 G G G 中删除。
不能操作的玩家输
题解:
判断点加边的奇偶性即可
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int x,y;
for(int i=0;i<m;i++){
cin>>x>>y;
}
if((n+m)&1) cout<<"Alice"<<endl;
else cout<<"Bob"<<endl;
}
I–Inverse Pair
题意:
给定一个序列
a
a
a, 可以对于每一个
a
i
a_i
ai, 可以选择加
1
1
1 或者不变, 求最小逆序对的个数
题解:
使用归并排序寻找逆序对
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+5;
const int inf=0x3f3f3f3f;
const int MAX = 5e5 + 10;
int tools[MAX];
long long num;
int a[N];
map<int,int> mp;
void get_num(int l,int r)
{
if(l >= r) return;
int mid = (l+r) >> 1;
get_num(l,mid);
get_num(mid+1,r);
int i = l,j = mid+1,k = l;
while(i <= mid&&j <= r) {
if(a[i] <= a[j]){
num += j - mid - 1;
tools[k++] = a[i++];
}
else tools[k++] = a[j++];
}
while(i <= mid){
num += j - mid - 1;
tools[k++] = a[i++];
}
while(j <= r) tools[k++] = a[j++];
for(i = l;i <= r;i++) a[i] = tools[i];
}
int main()
{
int n;
cin>>n;
int can=0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
if(mp[a[i]+1])
{
can++;
continue;
}else{
mp[a[i]]++;
}
}
get_num(1,n);
cout<<num-can<<endl;
return 0;
}