CF #771 (Div. 2)A-D

A. Reverse

题解:略

#include <bits/stdc++.h>
using namespace std;
#define ll long long 
#define sc scanf
#define pr printf
const int maxn=1e3;
int a[maxn];
int main() {
	int t;
	cin>>t;
	while(t--){
		int f=1;
		int n;cin>>n;
		int i=1;
	    for(;i<=n;i++)cin>>a[i];
	    for(i=1;i<=n;i++){
	    	if(a[i]!=i)break;
	    	if(i!=1)cout<<" ";
	    	cout<<a[i];
	    	f=0;
		}
		if(i<=n){
			int j=i;
			while(i<=n&&a[i]!=j){i++;}
			for(int t=i;t>=j;t--){
				if(f!=1)cout<<" ";
	    	    cout<<a[t];
				f=0;
	    	}
		}
		i++;
		 for(;i<=n;i++){
	    	//if(a[i]!=i)break;
	    	if(f!=1)cout<<" ";
	    	cout<<a[i];
		}
		cout<<endl;
	}
	return 0;
}

B. Odd Swap Sort

题解:
这题刚读完:
感觉是奇数偶数各自看看有没有序,然后把自己推翻。
。。。
然后尝试推,结果其实就是这样的。

#include <bits/stdc++.h>
using namespace std;
#define ll long long 
#define sc scanf
#define pr printf
const int maxn=1e5+3;
int a[maxn],b[maxn];
int main() {
	int t;cin>>t;
	while(t--){
		int n,x;cin>>n;
		int f=0;
		int t1=0,t2=0;
		for(int i=0;i<n;i++){
			cin>>x;
			if(x&1){
				if(t1&&a[t1]>x){f=1;}
				a[++t1]=x;
		    }else{
		    	if(t2&&b[t2]>x){f=1;}
				b[++t2]=x;
			}
			}
		if(f)cout<<"no"<<endl;
		else cout<<"yes"<<endl;
	} 
	return 0;
}

C - Inversion Graph

题意:
满足条件在这里插入图片描述
可连接起来,最后看看有几块。

题解:
第一眼并查集,开始找板子。
找到,开写,发现不对。。。。
回去再看,题目说了这个数组
在这里插入图片描述
即:这些数组是从1-n打乱顺序排的。
那么其实就可以看出来,每当前n项和等于前n项下标和就一定是一个节点,统计出现这种情况次数。

#include <bits/stdc++.h>
using namespace std;
#define ll long long 
#define sc scanf
#define pr printf
const int maxn=1e5+3;
int a[maxn];
int main() {
	int t;cin>>t;
	while(t--){
		int n,x;cin>>n;
		int sum1=0,sum2=0;
		int cnt=0;
		for(int i=1;i<=n;i++){
			sum1+=i;
		    sc("%d",&a[i]);
		    sum2+=a[i];
		    if(sum1==sum2)cnt++;
		}
		cout<<cnt<<endl; 
	} 
	return 0;
}

D. Big Brush

题意:
给二维数组上色,每次需要上四块,在这里插入图片描述
求上色顺序,不可输出-1。

题解:
上色过程中会被层层遮盖,而最后一次上色必会留下四个相同的颜色,找到这个颜色,用它做起点,倒推过程。最后倒序输出。
具体操作参考代码:
很多写到注释里了

#include <bits/stdc++.h>
using namespace std;
#define ll long long 
#define sc scanf
#define pr printf
const int maxn=1e3+3;
int a[maxn][maxn];
struct one{
	int x,y,z;
}ans[maxn*maxn];
int s=1;
int n,m;
void dfs(int x,int y){
	if(x<=0||x>=n||y<=0||y>=m)return ;
	int f=0;
	for(int i=x;i<=x+1;i++)
	    for(int j=y;j<=y+1;j++)
	      if(a[i][j]){
	      	if(f&&f!=a[i][j])return ;//两种颜色
			  f=a[i][j];//颜色或者0; 
		  }
	if(f) //找到新的允许消色的地方 
	{
		ans[s++]={x,y,f};
		//把这些颜色归0,即消去颜色 
		a[x][y]=0 ,a[x+1][y]=0 ,a[x][y+1]=0 ,a[x+1][y+1]=0 ;
		//递归寻找,肯定在四周 
	   for(int i=x-1;i<=x+1;i++)
	    for(int j=y-1;j<=y+1;j++)dfs(i,j);
	
	} 
} 
int main() {
     cin>>n>>m;
     for(int i=1;i<=n;i++)
       for(int j=1;j<=m;j++)sc("%d",&a[i][j]);
    //逆推:先找到第一个符合题意的; 
    for(int i=1;i<=n;i++)
       for(int j=1;j<=m;j++)dfs(i,j);
    //若有没有消去颜色的: 
	for(int i=1;i<=n;i++)
       for(int j=1;j<=m;j++){
       	if(a[i][j]!=0){
       		cout<<-1<<endl;
       		return 0;
		   }
	   }
	//逆序输出:
	cout<<s-1<<endl; 
	for(int i=s-1;i>0;i--)pr("%d %d %d\n",ans[i].x,ans[i].y,ans[i].z);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值