2A:情况只有3种,全是R,全是L,连续R再连续L,乱搞即可
2B:小贪心,往目的地方向走总是没错的
1A:随意组合貌似能组合出当前拥有的数字的各种形态?T_T。统计1的个数即可,如果奇数个1,它可以变得多一个,然后如果1的个数大于等于第二个串就是yes
1B:贪心即可,从大到小排序,前者相同顺序如果有一个位置大于后者,一定可以成立
1C:很好的题,引用CF官方题解的图(红色为a,蓝色为b)
把数列分为3部分,第一部分ai = i ,第二部分 bi = i,第三部分bi = 29 - i。比如n=30,第一部分0~9,第二部分10~19,第三部分20~29,如此构造即可
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<climits>
using namespace std;
const int N=100005;
int n,m,a[N],b[N],p[N];
bool cmp(const int i,const int j)
{
return a[i]<a[j];
}
int main()
{
cin>>n;
for (int i=0;i<n;i++)
{
scanf("%d",&a[i]);
p[i]=i;
}
sort(p,p+n,cmp);
m=(n+2)/3;
printf("YES\n");
for (int i=0;i<m;i++) b[p[i]]=a[p[i]]-i;
for (int i=m;i<min(n,m+m);i++) b[p[i]]=i;
for (int i=m+m;i<n;i++) b[p[i]]=n-1-i;
for (int i=0;i<n;i++) printf("%d ",b[i]);
printf("\n");
for (int i=0;i<n;i++) printf("%d ",a[i]-b[i]);
return 0;
}