首页 > 其他分享 >题解:P11277 世界沉睡童话

题解:P11277 世界沉睡童话

时间:2024-11-15 08:45:21浏览次数:1  
标签:P11277 __ frac 题解 long 贡献 沉睡 2n define

比较简单的构造。

注意到题面给出 \(a_i\le 2n-1\) 的条件,考虑这个有什么用,你会发现从 \(n\) 到 \(2n-1\) 这 \(n\) 个数都是两两互不为约数,所以当我们构造出序列后,这些数可以用来填补空位。

\(k\) 的上界是 \(\frac{n(n-1)}{2}\),显然在全部都为同一个数的时候取到,显然有 \(x\) 个数相同的时候,这 \(x\) 个数至少产生 \(\frac{x(x-1)}{2}\) 的贡献,那我们是否可以利用这个性质来构造出一个合法序列呢?当然是可以的。

首先给出这样一个性质,当我们取到的数为 \(y\) 的时候,只由一些 \(y\) 和一些 \(dy\)(\(d\) 为常数)组成的可重集 \(S\),和只由一些 \(y\) 组成的可重集 \(T\),若 \(|S|=|T|\),那么这两个产生的贡献是相等的,可以通过找规律或者灵光一现知道这件事。证明的话就是两种集合内部都是任意两种元素都可以自由握手的,所以方案数在集合大小相等时显然相等。

我们接着想,自由握手是相等的,那么再加入一个不能自由握手的元素呢?以 \(y,2y,3y\) 为例子,分别有 \(x_1,x_2\) 个 \(y,2y\),总和为 \(x\),如果加入 \(1\) 个 \(3y\),最终产生的贡献就会是 \(\frac{x(x-1)}{2}+x_1\),总和不变的情况下,将 \(x_1\) 取遍 \([0,n)\) 的话我们可以做到贡献取遍 \([\frac{x(x-1)}{2},\frac{(x+1)x}{2})\),那么由不同的 \(x\) 以及 \(x_1\) 取值,以及是否加入 \(3y\),贡献就可以取遍 \([0,\frac{n(n-1)}{2}]\),空位直接由 \(n\) 到 \(2n-1\) 中没被取的填上。

具体地就是找到最大的满足 \(\frac{x(x-1)}{2}\le k\) 的 \(x\),然后按上述构造法构造。

为了不产生额外的贡献,我们最优的取法显然是取 \(\lfloor\frac{2n-1}{3}\rfloor\) 作为 \(y\),这样是它倍数的数一般只有 \(2\) 个,可以做到与其他数不产生贡献。为什么是一般,因为显然在一种最特殊的情况下 \(n=3\) 时,\(y\) 取到 \(1\),这时就不成立,要特判一下。

实现有点细节,但不多。

#include <bits/stdc++.h>
#include <bits/extc++.h>
#define ll long long
#define ull unsigned long long
#define m_p make_pair
#define m_t make_tuple
#define N 250010
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
using namespace __gnu_pbds;
signed main()
{
	// auto __IN__ = freopen(".in", "r", stdin);
	// auto __OUT__ = freopen(".out", "w", stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	ll n, k, val, l, r, mid, ans = 0, d, p;
	cin >> n >> k;
	if(n==3&&k==2){
		cout << "1 2 3";
		return 0;
	}
	l = 0;
	r = n;
	while (l <= r)
	{
		mid = l + r >> 1;
		if (mid * (mid - 1) / 2ll <= k)
		{
			ans = mid;
			l = mid + 1;
		}
		else
			r = mid - 1;
	}
	val = (n * 2 - 1) / 3;
	if (val == 1 && n == 3)
		++val;
	d = k - ans * (ans - 1) / 2ll;
	// cerr << d << "\n";
	if (ans < 2)
		ans = 0;
	for (int i = 1; i <= d; i++)
		cout << val << " ";
	for (int i = 1; i <= ans - d; i++)
		cout << val * 2 << " ";
	p = n;
	if (ans < n && ans && ans * (ans - 1) / 2ll != k)
	{
		--n;
		cout << val * 3 << " ";
	}
	for (int i = ans + 1; i <= n; i++)
	{
		if (k && (p == val * 3 || p == val * 2 || p == val))
			++p;
		cout << p << " ";
		++p;
	}
	return 0;
}

标签:P11277,__,frac,题解,long,贡献,沉睡,2n,define
From: https://www.cnblogs.com/wryyy-233/p/18547294

相关文章

  • Atcoder ABC 216 G 01Sequence 题解 [ 蓝 ] [ 差分约束 ]
    01Sequence:比较板的差分约束,但有一个很妙的转化。朴素差分约束设\(x_i\)表示第\(i\)位的前缀和。我们要最小化\(1\)的个数,就要求最小解,就要求最长路。因为约束条件都是大于等于号,所以求最长路才能满足所有条件。求最大解也是同理。我们可以对于每一个条件,列出如下不等式......
  • 2024年09月CCF-GESP编程能力等级认证Python编程二级真题解析
    本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题据有关资料,山东大学于1972年研制成功DJL-1计算机,并于1973年投入运行,其综合性能居当时全国第三位。DJL-1计算机运算控制部分所使用的......
  • [CF1188E] Problem from Red Panda 题解
    [CF1188E]ProblemfromRedPanda题解考虑每个位置的操作次数\(c_i\),不难发现,\(i\)气球最后的颜色个数\(d_i\)是\(a_i+c_ik-\sumc_i\),如果存在\(\forallc_i>0\),那么我们总是可以把所有气球少操作一次,这样上式不变,不影响最后的序列,下文所有的操作序列都假设\(\min......
  • [JXOI2017] 加法 题解
    [JXOI2017]加法最小值最大,一眼二分。贪心地,每次尽量对包含当前序列最小值的区间做加法操作,也就是说,对于当前二分的答案\(x\),任何的\(A_i<x\)都需要被操作。从左到右地考虑答案。我们认为当前点之前的所有值都已经满足条件,于是我们只需考虑每次区间对当前点之后答案造成的贡......
  • 题解:P7836 「Wdoi-3」夜雀 collecting
    题解摘自做题记录。分析数据范围明显得要让我们分开搞。【Sub2】应该是暴力。这里有个主体思路,我们完全可以贪心地将当前背包里的食材删掉,直到每种出现过的食材数量刚好为\(1\)。因为我们保留更多的是没有用的。那么我们就可以用二进制数表示\(x\)种食材的出现状态了。同......
  • 【题解】CF1982
    A考虑两队的领先情况改变,那么一定有某一时刻两队的比分相等于是首先检查最开始的领先队伍,再检查现在的领先队伍,如果前后不同,则\(YES\),否则\(NO\)B注意到当\(x=1\),则会进入循环,手模一下发现\(ans=k\%(y-1)+1)\)现在的问题是:什么时候\(x=1\)?直接手动模拟即可,不难证明时......
  • Intellij IDEA如何设置中文版?安装中文汉化包插件?失败问题解决!
    前言大家好,我是小徐啊。IntellijIDEA默认是英文的操作界面,因为是外国人开发的嘛~对于英文好一点的同学来说,英文就英文吧,但对于英文比较差的同学,就还是希望能够汉化一下,变成熟悉的中文。今天小徐就来介绍下如何在IDEA中安装汉化插件,以及在这过程中,我遇到的奇怪问题,以及最后如何......
  • P8099 [USACO22JAN] Minimizing Haybales P 题解
    好题图论的难点在于建图~首先我们关注到如果两个草堆之间的差大于K,那么他们的位置就是固定的,就相当于给了一些限制,这就是很经典的连边然后拓扑排序。其实你是不是可以直接从小的向大的连边(我没试)然后再做排序。这一部分代码(粗略验证正确性,赶着写的,可能比较一言难尽)#include<bi......
  • 【考试题解】NOIP2024(欢乐)加赛3
    目录A.SakurakoandWater题目内容思路代码B.BinomialCoefficients,KindOf题目内容思路代码C.QED'sFavoritePermutation题目内容思路代码D.CardGame题目内容思路代码E.LongWaytobeNon-decreasing题目内容思路代码F.ManyGames题目内容思路代码A.SakurakoandW......
  • COCI19-20#6 Trener题解
    COCI19-20#6Trenerlink一道水题(我真是太弱了啊啊啊啊。众所周知,看到这个题立刻知道他是要选名字长度为$1$到$N$的,而我们知道他每一个名字,所以可以直接用字符哈希去做,因为他每一个名字的字符数是上一层名字的字符数加一,所以对于哈希每个字符串只需要跑三次,分别是自己的这......