首页 > 其他分享 >CF1214E题解

CF1214E题解

时间:2024-01-19 15:37:33浏览次数:27  
标签:ch 个点 int 题解 le CF1214E 对应

Petya and Construction Set

题目传送门

题解

一个构造题,结论挺容易猜的。观察到关键信息:\(d_i\le n\)。所以我们先把所有奇数编号的点按对应的 \(d\) 从大到小组成一条链,然后依次考虑偶数号点应该接在链上的哪个点后,容易知道这个点为链上的第 \(i+d-1\) 个。特殊的,如果接在了最后一个点后面,我们就更新链的长度。

我可以告诉你,这是对的,证明如下(感觉比另一篇的证明简单些):

我们用归纳法。

  • 第一个点一定能找到对应的位置,这是因为 \(d_i\le n\)。

  • 假设第 \(i-1\) 个点找到了对应位置,那么第 \(i\) 个点也可以找到对应位置,这是因为第 \(i-1\) 个点找到了对应位置就意味着从第 \(i-1\) 个点往后,至少存在 \(d_{i-1}\) 个点,而 \(d_i\le d_{i-1}\),所以我们要找 \(i\) 后第 \(d_i-1\) 个点一定存在。

  • 可推广至 \(n\)。

代码已经短到一种境界了:

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int rd() {
	int s=0,m=0;char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-')m=1;ch=getchar();}
	while( isdigit(ch)) s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
	return m?-s:s;
}
int n,l[200005],cnt;
struct QWQ {int id,d;} a[200005];
bool cmp(QWQ a1,QWQ a2) {return a1.d>a2.d;}
signed main() {
	cin>>n;
	for(int i=1;i<=n;i++)
		a[i]={i,rd()};
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
		l[++cnt]=a[i].id*2-1;
	for(int i=1;i<n;i++)
		printf("%lld %lld\n",l[i],l[i+1]);
	for(int i=1;i<=n;i++) {
		int j=i+a[i].d-1;
		printf("%lld %lld\n",l[j],a[i].id*2);
		if(j==cnt) 
			l[++cnt]=a[i].id*2;
	}
	return 0;
}

标签:ch,个点,int,题解,le,CF1214E,对应
From: https://www.cnblogs.com/operator-/p/17974756

相关文章

  • CF150C题解
    SmartCheater题目传送门题解首先显然的,每个乘客是独立计算的,然后我们发现,一个乘客在\(i\)到\(i+1\)不买票的期望贡献是一定的,为\(\dfrac{x_{i+1}-x_i}{2}-c*p_i\),所以我们其实就是要对于每个乘客的区间求最大子段和,简单线段树板子,感觉也没啥细节。代码:#include<bits/st......
  • CF1286C1题解
    Madhouse(Easyversion)题目传送门题解这种水题还能有蓝?不能因为困难版是黑就把简单版难度往上强拉啊!第一次问\([1,n]\),第二次问\([1,n-1]\),把读入的所有字符串先各自内部把字符排序(反正本来就是乱序)后存入map,第一次询问有,第二次询问没有的字符串就是原串后缀的乱序,都找出......
  • NOIP2023题解
    目录NOIP2023T1词典(dict)T2三值逻辑(tribool)T3双序列拓展(expand)T4天天爱打卡(run)NOIP2023T1词典(dict)考察:贪心题解Link题目传送门首先任意多次操作本质就是随意排序,所以如果要使\(w_i\)最小,我们一定会使\(w_i\)从\(a\)到\(z\)排,其它都\(z\)到\(a\)排......
  • CF1899G题解
    UnusualEntertainment题目传送门题解真的不要太典,,,考虑点\(u\)是\(v\)的后代等价于\(u\)在子树\(v\)中,dfs序直接走起,变成判断是否存在\(i\)使得:\[in_x\lein_{p_i}\leout_x,l\lei\ler\]二维数点,启动!代码:#include<bits/stdc++.h>usingnamespacestd;#defi......
  • CF1899F题解
    Alex'swhims题目传送门题解构造题,感觉比G更难?可能是我不擅长构造。考虑点的度数,发现一次操作\(u,v_1,v_2\)会使\(deg_{v_1}\)减\(1\),使\(deg_{v_2}\)加\(1\),即一次操作最多减少一个叶子,那如果存在一个时刻使我们的叶子数量大于\(3\)个,下一次若问\(n-1\)则直接......
  • P6550题解
    P6550[COCI2010-2011#2]LUNAPARK题目传送门题解论证简单,构造逆天(好吧其实就是烦了点)。每个格子是正整数,所以我们必然尝试多走格子。我们发现,只要\(r,c\)中有一个是奇数,我们就可以全部走到,构造很简单:我们找准奇数边,假设是\(r\),蛇形地走,显然在奇数行我们会结束在末尾,在偶数......
  • P5133题解
    P5133tb148的客人题目传送门题解唯一的一篇题解还是交错题的……很简单的一个二分加差分题。显然是二分答案,考虑检验。如果\(2mid+1\gen\),那么所有人可以自由去到任意位置,一定可行;否则,我们求出每个人可以去到的区间范围,并以此推出要满足这个人的限制,\(1\)号需要在哪个区......
  • P3867题解
    P3867[TJOI2009]排列计数题目传送门题解\(k\)很小,不是分讨就是突破口。如果我们用这种方式生成排列:将\(1\)到\(n\)按顺序插入当前状态,那么你会发现当前的数\(x\)的插入被很大程度的限制住了,我们只需记录当前\(x-k\)到\(x-1\)的位置即可枚举出所有可能的下一状态,因......
  • P7312题解
    P7312[COCI2018-2019#2]Sunčanje题目传送门题解分类讨论的思想有点像P4169?要你对于每一个矩形,求是否存在编号比它大,与它有交的矩形。直接做需要用一个比较神仙的线段树用法,所以我们可以容斥:我们求出编号比它大,与它无交的矩形数量,最后与所有可能覆盖它的矩形共\(n-i\)个......
  • P6554题解
    P6554PromisesICan'tKeep题目传送门题解看题解都有些做烦了,就来发一篇。换根dp。第一遍dfs处理出\(Lef_u\)表示\(u\)子树内的叶子个数(包含自己),然后求出以\(1\)为根时的答案\(\sumLef_u*val_u\),注意特判根为叶子的情况。第二遍dfs大力换根就好了,从根\(u\)......