专栏文章
[题解] CF1918G Permutation of Given
CF1918G题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @miqkv8pi
- 此快照首次捕获于
- 2025/12/04 06:27 3 个月前
- 此快照最后确认于
- 2025/12/04 06:27 3 个月前
你们的构造怎么都这么简单。为什么每次做构造题都会被降智。
设 为产生的序列。题目要求 组成的可重集相等,那我干脆让中间一大段都满足 好了。随便钦定 的头两项,就可以构造出这样一个循环序列:
CPPa = 1 -2 -3 -1 2 3 1 -2 -3 ...
b = -2 -3 -1 2 3 1 -2 ...
但是这样 和 就出问题了。考虑给它拼上一个火车头。
CPPa = c d e x y ...
b = d ? ? ? y ...
这里 都是已经确定的、在中间一大段的部分。我们尝试让 中的三个问号分别填上数字 。
考虑 ,由于 ,故 ,则 。再考虑 ,发现 ,则 ,这样 。检查一下,发现逻辑上没问题。于是考虑计算出 。可以列出方程组:
解得 ,发现 和 都不会为 ,完全可行。由于要除以 ,我们令中间一段整体乘 即可。末尾也一样处理。
注意这个只适用于 ,对于 的随便构造或者暴力一下即可。
代码
CPP#include<bits/stdc++.h>
#define wrk(x,y) if(n==x)cout<<y"\n",exit(0)
#define pb push_back
#define SZ(x) (int)(x).size()
using namespace std;
const int N=1e6+5;
int n,a[N],b[]={2,-4,-6,-2,4,6};
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n;
wrk(2,"YES\n1 1");
wrk(3,"NO");
wrk(4,"YES\n1 2 -2 -1");
wrk(5,"NO");
wrk(6,"YES\n-2 -1 1 -1 1 2");
wrk(7,"YES\n-5 -4 3 -1 -2 4 1");
for(int i=4;i<=n-3;i++)a[i]=b[i%6];
a[1]=(a[4]+a[5])/2;
a[2]=-a[1];
a[3]=(a[4]-a[5])/2;
a[n]=(a[n-3]+a[n-4])/2;
a[n-1]=-a[n];
a[n-2]=(a[n-3]-a[n-4])/2;
cout<<"YES\n";
for(int i=1;i<=n;i++)cout<<a[i]<<" \n"[i==n];
return 0;
}
(逃
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...