【LG4437】[HNOI/AHOI2018]排列】的更多相关文章

[LG4437][HNOI/AHOI2018]排列 题面 洛谷 题解 题面里这个毒瘤的东西我们转化一下: 对于\(\forall k,j\),若\(p_k=a_{p_j}\),则\(k<j\). 也就是说若\(y=a_x\),则\(y\)排在\(x\)前面, 那么我们在原数组编号中\(a_x\)向\(x\)连边可以表示出这种拓扑关系. 那么我们连玩边后肯定是以\(0\)为根的一颗有根树,否则一定会形成一个环,无解. 贪心地想一下,对于权值最小的点,我们肯定让它尽量往前选,那么在它父亲选完后,我们…
题面 题解: 把题面的限制换成中文: 如果排在第k位的下标 = 排在第j位的值 ,那么k < j 换一个描述方式: 一个值为x的数要排在第x个数后面. 再换一个描述方式: \(fa[i] = a_i\) 仿佛有什么不对劲? 嗯这其实就是一棵树. 并且我们可以发现,这棵树一定以一个虚拟节点0为根,并且有合法排列,也就是树没有环,当且仅当从0开始遍历,可以遍历到所有节点. 且排列合法当且仅当我们在访问一个节点之前,先访问它的父亲,也就相当于在树上走. 因为如果不以0为根,那么由于题面中所说权值大小在…
[Luogu4437] 如果\(a[i]=j\)则序列\(p[]\)中\(j\)必须排在\(i\)前面,如果\(j\)不在范围内则不管,求一个式子\(\sum_{i=1}^n iw_{p[i]}\)的最大值 考虑建出一个图,连边\(k=a_j\to j\)方向表示顺序,这样\([1,n]\)每个点的入度都会是\(1\) 如果有环那么就无解,否则这个图就是一棵以\(0\)为根树,如果是在树上的话,也就是说必须要先选父亲才能选儿子 考虑一种贪心 考虑一个当前权值最小的点\(i\) \(1.\)如果\…
题面传送门 开始 WA ycx 的遗产(bushi 首先可以将题目转化为图论模型:\(\forall i\) 连边 \(a_i\to i\),然后求图的一个拓扑序 \(b_1,b_2,\dots b_n\) 使得 \(\sum\limits_{i=1}^niw_{b_i}\) 最小.显然如果原图出现环就 \(-1\) 了.否则原图一定是一棵森林. 然后我就在那儿想各种乱搞,包括但不限于 DP.贪心之类,然后都假掉了 我们知道有个东西叫排序不等式,它是说 \(\forall a_1\leq a_2…
题面描述的相当绕,其实就是如果ai=j,重排后ai要在aj之后.同时每个ai有附属属性wi,要求最大化重排后的Σiwi. 容易发现这事实上构成一张图,即由j向i连边.由于每个点入度为1或0,该图是基环外向树森林,并且如果图中有环显然无解,所以这张图就是个森林.把0也看做一个点后变成一棵树.由于其是基环树判环并查集就够了. 问题变为对该树找一个删点的顺序使价值最大,要求删了父亲才能删儿子.显然应该尽量先删价值小的,但直接贪心肯定不对. 如果树中的最小值的父亲此时已经被删,立即将其删除一定是最优的.…
题目链接 如果\(j<=k,a_{p[j]}!=p[k]\)可以理解为如果\(a_{p[j]}=p[k]\),那么\(k\)一定要放在\(j\)前面,也就是\(a_j\)在\(j\)前面. 于是连边\((a[j],j)\),表示\(a[j]\)在\(j\)前面,如果有环就是无解,如果没有环那么一定是一棵以\(0\)为根的树 根据题意,我们肯定是要尽量把\(w\)小的安排在前面. 于是考虑这样一个贪心: 对于当前最小\(w_i\) 如果\(fa[i]=0\),那么肯定直接选\(i\) 如果\(fa…
https://www.lydsy.com/JudgeOnline/problem.php?id=5289 https://www.luogu.org/problemnew/show/P4437 考虑对于a[i]=m,a[m]=n,我们令p[j]=i,p[k]=m(一定会有一对(j,k)满足这个条件的),则我们会有p[k]=a[p[j]],此时我们要满足k<j,也就是a[m]放的位置要比a[i]靠前. 也就是说选第m个之后才能选第i个. 转换成图论模型就是m->i <=> a[i]…
https://zybuluo.com/ysner/note/1120723 题面 原题 某省选强化题 大致意思是给你一颗树,选父亲后才能选儿子. 每个点对答案的贡献为你在第几次选这个点 × 该点权值 问取完所有点最小答案是多少. 对于\(60pts\) \(n\leq1000\) 对于\(100pts\) \(n\leq500000\) 解析 贪心没学好,_ _ _ _ _(自己yy) 答案要求的其实是个选取序列... 我们可以发现,要保证答案最优性,最大点取的时间越小越好. 又可以发现,只要…
luogu 问题本质是把\(a_i\)作为\(i\)的父亲,然后如果有环就不合法,否则每次要取数,要满足取之前他的父亲都被取过(父亲为0可以直接取),求最大价值 贪心想法显然是要把权值大的尽量放在后面,这等价于把权值小的尽量放在前面.所以如果当前最小的数没有父亲,显然直接取出来最优;如果有父亲,那么这个数应该在它的父亲被取之后马上取出来.这时我们把这两个点合并.之后重复此操作知道所有点被取完,就能得到答案 还有个问题是两个点合并后怎么取权值.两个点合并相当于两个序列合并,序列分别记为\(\{a_…
原题传送门 \(n^2\)过百万在HNOI/AHOI2018中真的成功了qwqwq 先将没门分格的地方连起来,枚举每一个块,看向左向右最多能走多远,最坏复杂度\(O(n^2)\),但出题人竟然没卡(建议JSOI的出题人好好学学) #include <bits/stdc++.h> #define N 1000005 #define getchar nc using namespace std; inline char nc(){ static char buf[100000],*p1=buf,*…