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;
}