题解:CF1970B2 Exact Neighbours (Medium)
题目链接:Exact Neighbours (Medium)
简单构造和模拟。
思路:根据题意可知一列只能放
按这个操作从左到右构造下去一定能得到一个合法的方案,因为在
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
void solve(){
int n;
scanf("%d",&n);
vector<int>a(n+10),x(n+10),y(n+10),ans(n+10);
rep(i,1,n)scanf("%d",&a[i]);
if(a[1]){cout<<"NO";return;}
x[1]=1,y[1]=1;
ans[1]=1;
rep(i,2,n){
if(!a[i]){x[i]=i,y[i]=1,ans[i]=i;continue;}
int now=a[i]-i+1;
if(now==0){x[i]=i,y[i]=1;ans[i]=1;continue;}
if(now>0){x[i]=i,y[i]=now+1;ans[i]=1;continue;}
else{x[i]=i,y[i]=y[-now+1],ans[i]=-now+1;continue;}
}
puts("YES");
rep(i,1,n)printf("%d %d\n",x[i],y[i]);
rep(i,1,n)printf("%d ",ans[i]);return;
}
int main()
{
solve();
return 0;
}