2021牛客暑期多校训练营4

126 篇文章 0 订阅
32 篇文章 0 订阅


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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值