【题解】洛谷P11277: 世界沉睡童话

发现其实也不难,构造题还是需要一步一步来,从小问题部分分分析。

\(k=\frac{n(n-1)}{2}\),我们有 \(1,1,1,1,\cdots,1\),这样显然地每个 \(1\) 都会对后面的 \(1\) 计算贡献。

\(k=0\),我们有 \(n,n+1,n+2,n+3,\cdots,2n-1\),他们完全没有倍数关系,这不显然的但是必然,长度是 \(n\),我们首项为 \(n+0\),尾项为 \(n+n-1\),不会有任何贡献。

同样的有当 \(k=n-1\) 也是必然的,我们有 \(1,n,n+1,\cdots,2n-2\),我们第一个填 \(1\) 会产生 \(n-1\) 的贡献,后面的互不产生贡献就行了。

\(k<n-1\),我们就要聪明构造了,我们肯定构造为 \(x_1,x_2,\cdots,x_i\)\(n,n+1,\cdots,n+(i-1)\),因为他们互不影响所以我们每个数构造多少就产生多少贡献,同时我们要想到前面的数构造的尽可能的多使贡献快速增加满足要求 \(k\),后面的就只要一个不产生贡献就行了。

\(k>=n-1\),就是将上面两个操作合并就行了,反正他们贡献互不影响。

#include <bits/stdc++.h>
#define int long long
#define re register 
const int N=5e5+10;
using namespace std;

int n,k,len=1;

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr); 
	
	cin>>n>>k;
	
	for(int i=n-1;i<=k&&len<=n;k-=i--,len++){
		cout<<1<<" ";
	}
	for(int i=n;i<=2*n-1;i++){
		for(int j=0;j<=k&&len<=n;k-=j++,len++){
			cout<<i<<" ";
		}
	}
	return 0;
}
posted @ 2024-11-18 08:39  sad_lin  阅读(6)  评论(0编辑  收藏  举报