Codeforces Round #656 (Div. 3)

Codeforces Round #656 (Div. 3)

A.Three Pairwise Maximums

观察可以发现构造出来的数必定有两个数为三个数里的最大数,先特判

再分别输出两个不同的数字和0即可

#include<bits/stdc++.h>
using namespace std;
int n,m,t,k;
int a[5];
void shit();
int main(){
	cin>>t;
	while(t--){
		cin>>a[1]>>a[2]>>a[3];
		sort(a+1,a+4);
		if(a[2]!=a[3])printf("NO\n");
		else{
			printf("YES\n%d %d 1\n",a[1],a[3]);
		}
	}
	return 0;
}

B.Restore the Permutation by Merger

sb

#include<bits/stdc++.h>
using namespace std;
int n,m,t,k;
int a[100005];
int vis[105];
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=2*n;i++){
			cin>>a[i];
		}
		vector<int>jl;
		for(int i=1;i<=2*n;i++){
			if(!vis[a[i]]){
				vis[a[i]]=1;
				jl.push_back(a[i]);
			}
		}
		for(auto v:jl){
			printf("%d ",v);
		}
		cout<<endl;
		memset(vis,0,sizeof vis);
	}
	return 0;
}

C.Make It Good

后往前,连续的升再降,再升就 b r e a k break break,用总数减去即可

#include<bits/stdc++.h>
using namespace std;
int n,m,t,k;
int a[200005];
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		int cnt=1;
		int f=0;
		for(int i=n;i>=2;i--){
			if(a[i-1]>=a[i]&&!f){
				cnt++;
				continue;
			}
			if(a[i-1]>a[i]&&f){
				break;
			}
			if(a[i-1]<=a[i]){
				cnt++;
				f=1;
				continue;
			}
		}
		cout<<n-cnt<<endl;
	}
	return 0;
}

D.a-Good String

分治,前后两段哪个变好的费用更少就选哪边,边界为长度为1的时候

#include<bits/stdc++.h>
using namespace std;
int n,m,t,k;
int fz(string a,char c,int len){
	if(len==1)return a[0]!=c;
	string l=a.substr(0,len/2);
	string r=a.substr(len/2);
	return min(fz(l,c+1,len/2)+len/2-count(r.begin(),r.end(),c),fz(r,c+1,len/2)+len/2-count(l.begin(),l.end(),c));
}
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		string a;
		cin>>a;
		int ans=fz(a,'a',a.length());
		cout<<ans<<endl;
	}
	return 0;
}

E.Directing Edges

先连上有向边,进行拓扑排序,判断是否有环

再依次输出无向边,从拓扑次序小的对大的连边

#include<bits/stdc++.h>
using namespace std;
int n,m,t,k;
const int maxn=2e5+5;
int cnt=0;
int head[200005];
struct edge{
	int v,nex;
}e[200005];
void add(int u,int v){
	e[++cnt].v=v;
	e[cnt].nex=head[u];
	head[u]=cnt;
}
struct node{
	int x,y;
}g[maxn],g2[maxn];
int ru[maxn],cx[maxn];
bool topo(){
	queue<int>q;
	for(int i=1;i<=n;i++){
		if(!ru[i]){
			q.push(i);
		}
	}
	int tt=0;
	while(!q.empty()){
		int u=q.front();
		cx[u]=++tt;
		q.pop();
		for(int i=head[u];i;i=e[i].nex){
			int v=e[i].v;
			ru[v]--;
			if(!ru[v]){
				q.push(v);
			}
		}
	}
	if(tt<n)return false;
	return true;
}
int main(){
	cin>>t;
	while(t--){
		cin>>n>>m;
		int c=0;
		int c2=0;
		memset(head,0,sizeof head);
		memset(ru,0,sizeof ru);
		memset(cx,0,sizeof cx);
		for(int i=1;i<=m;i++){
			int x,y,z;
			cin>>x>>y>>z;
			if(x)add(y,z),ru[z]++,g2[++c2].x=y,g2[c2].y=z;
			else{
				g[++c].x=y;
				g[c].y=z;
			}
		}
		if(topo()==false){
			printf("NO\n");
			continue;
		}
		else printf("YES\n");
		for(int i=1;i<=c;i++){
			int x=g[i].x;
			int y=g[i].y;
			if(cx[x]<cx[y]){
				printf("%d %d\n",x,y);
			}
			else printf("%d %d\n",y,x);
		}
		for(int i=1;i<=c2;i++){
			int x=g2[i].x;
			int y=g2[i].y;
			printf("%d %d\n",x,y);
		}
	}
	return 0;
}

F.Removing Leaves

2300的题,咕 咕 咕

G.Columns Swaps

2300的题,咕 咕 咕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值