Codeforces Round #656 (Div. 3)(A-E)

时间:2021-09-05
本文章向大家介绍 Codeforces Round #656 (Div. 3)(A-E),主要包括 Codeforces Round #656 (Div. 3)(A-E)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

A. Three Pairwise Maximums
题意:给出x,y,z,其中x=max(a,b),y=max(a,c),z=max(b,c),能否求出a,b,c.
题解:发现若a,b,c存在,则有x<y=z的大小关系,a,b,c中的最大值和次大值就知道了。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

int T;


int main()
{
	cin>>T;
	while(T--)
	{
		int a[4];
		cin>>a[1]>>a[2]>>a[3];
		sort(a+1,a+3+1);
		if(a[3]!=a[2])
		{
			cout<<"NO\n";
			continue;
		}	
		cout<<"YES\n"; 
		cout<<a[3]<<" "<<a[1]<<" "<<"1\n";
	}
	return 0;
} 

B. Restore the Permutation by Merger
拿个桶判断 没出现输出就行

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int T,n;

int vis[55];

int main()
{
	cin>>T;
	while(T--)
	{
		cin>>n;
		n=n*2;
		int x;
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=n;i++) 
		{
			cin>>x;
			if(!vis[x])
			{
				cout<<x<<" ";
				vis[x]=true;
			}
		}
		cout<<endl;
	}
	return 0;
} 

C. Make It Good
题意:删除字符串a最小前缀,满足被删前缀后的字符串a,每次从头或尾取字符组成的字符串c不减。
题解:若c不减,则a必须是先递增再递减的形式,即是单峰。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 200009
using namespace std;

int T;

int n;
int a[N];

int main()
{
	cin>>T;
	while(T--)
	{
		cin>>n;
		for(int i=1;i<=n;i++) cin>>a[i];
		int now=n;
		for(int i=n;i>=1;i--) 
		{
			if(a[i]<=a[i-1]) now--;
			else break; 
		}
		int tmp=now;
		for(int i=tmp;i>=1;i--)
		{
			if(a[i]>=a[i-1]) now--;
			else break;
		}
		if(now)now--;
		cout<<now<<endl;
	}
	return 0;
} 

D. a-Good String
最少修改多少次,让字符串变为a-good string
.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 131077
using namespace std;

int T;

int n,len,ans;

char s[N];

int a[30][N];

//12345678

void slove(int l,int r,int tp,int now)
{
	if(l==r)
	{
		if(s[l]-'a'+1!=tp) now++;
		ans=min(ans,now);
		return ; 
	} 
	int mid=(l+r)>>1;
	slove(mid+1,r,tp+1,now+(mid-l+1)-(a[tp][mid]-a[tp][l-1]));
	slove(l,mid,tp+1,now+(r-mid)-(a[tp][r]-a[tp][mid])); 
}

int main()
{
	cin>>T;
	while(T--)
	{
		cin>>n;
		scanf("%s",s+1);
		len=strlen(s+1);ans=len;
		for(int i=1;i<=len;i++)
		{
			for(int j=1;j<=26;j++)
			{
				a[j][i]=a[j][i-1];
			}
			a[s[i]-'a'+1][i]++; 
		}	
		slove(1,len,1,0);
		cout<<ans<<endl;
	}
	return 0;
}

E. Directing Edges.
题目大意:给你一张图,只有部分边确定方向,有的边没有确定方向,有没有一种确定方向的方法,让这张图为有向无环图。

题解:先在有向边的基础上跑拓扑排序,无向边使拓扑序小的指向拓扑序大的。

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define N 200009 
using namespace std;
queue<int>q;

int T,js;
bool flag;
int n,m;
int sumedge;

int head[N],xx[N],yy[N],vis[N],col[N],In_du[N],dep[N];

struct Edge
{
	int x,y,nxt;
	Edge(int x=0,int y=0,int nxt=0):
	x(x),y(y),nxt(nxt){} 
}edge[N];

void add(int x,int y)
{
	edge[++sumedge]=Edge(x,y,head[x]);
	head[x]=sumedge;
}

void Clear_Init()
{
	memset(In_du,0,sizeof(In_du));
	memset(head,0,sizeof(head));
	while(!q.empty()) q.pop();
	sumedge=0;flag=true;js=0;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int p,x,y;
		cin>>p>>x>>y;
		if(p==1)
		{
			add(x,y);
			In_du[y]++;
		}
		xx[i]=x,yy[i]=y;
	}
}

bool DFS(int x)
{
	vis[x]=true;
	col[x]=0;
	for(int i=head[x];i;i=edge[i].nxt)
	{
		int v=edge[i].y;
		if(col[v]==0) return false;
		else if(col[v]==-1&&!DFS(v)) return false;
	}
	col[x]=1;
	return true;
}

void pre_slove()
{
	for(int i=1;i<=n;i++)
	{
		if(!vis[i]&&!DFS(i))
		{
			cout<<"NO\n";
			flag=false;
			return ;
		}
	}
}

void Top_sort()
{
	for(int i=1;i<=n;i++)
	{
		if(!In_du[i]) q.push(i); 
	}
	while(!q.empty())
	{
		int now=q.front();q.pop();
		dep[now]=++js; 
		for(int i=head[now];i;i=edge[i].nxt)
		{
			int v=edge[i].y;
			In_du[v]--;
			if(!In_du[v]) q.push(v); 
		}
	}
}

void Put()
{
	cout<<"YES\n";
	for(int i=1;i<=m;i++)
	{
		int x=xx[i],y=yy[i];
		if(dep[x]<dep[y]) cout<<x<<" "<<y<<endl;
		else cout<<y<<" "<<x<<endl;
	}
}

int main()
{
	cin>>T;
	while(T--)
	{
		Clear_Init();
		//pre_slove();
		//if(!flag) continue;
		Top_sort();
		if(js<n) cout<<"NO\n";
		else Put();
	}
	return 0;
}

原文地址:https://www.cnblogs.com/zzyh/p/15230763.html