P4769 [NOI2018]冒泡排序(dp)】的更多相关文章

传送门 日常膜拜shadowice巨巨的题解 //minamoto #include<bits/stdc++.h> #define R register #define ll long long #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i) #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i) #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].n…
LINK:冒泡排序 神题. 可以想到爆搜 期望得分5~10分. 打成这个样子心态不得爆炸? 仔细分析 一个不合法序列还有什么标志. 容易想到某个数字离自己位置相反的方向多走了一步. 考虑单独对每个数字进行分析 每次都是这个数字前面的数字会让它多走一步. 对于每个位置 i 位置上的数字 \(a_i\) \(cnt_i\)表示前面有多少个数字比其大. 那么有 \(i-cnt_i<a_i\)那么就不合法了. 考虑状压 对于字典序可以利用总方案-<=的方案来做 类似数位dp. 期望得分44. code…
BZOJ_5416_[Noi2018]冒泡排序_DP+组合数+树状数组 Description www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf 好题. 合法的排列的交换次数刚好是交换次数的下界,也就是说不能有多余的交换. 也就是对于ai这个数,只能从i到ai这一个方向走. 考虑x,y,z三个数(x>y>z),y需要和x.z各交换一次,这显然不能使y这个数满足只向一个方向移动这个条件. 于是转化为排列的连续下降子序列最多为2. 考虑DP,设f[i…
https://www.zybuluo.com/ysner/note/1261482 题面 戳我 \(8pts\ n\leq9\) \(44pts\ n\leq18\) \(ex12pts\ q_i=i\) \(80pts\ n\leq1000\) \(100pts\ n\leq6*10^5\) 解析 \(8pts\)算法 \(O(n!n^2)\)模拟即可. 当然如果忘了答案清\(0\)的话.... \(44pts\)算法 手玩下样例,可以感受到:当交换次数达到下限时,每个数到自己位置的过程中不…
题目链接 题意 求有多少个字典序严格大于给定排列 \(q_i\) 的排列满足其逆序对数(冒泡排序需要交换的次数)达到下限 \(\frac{1}{2}\sum_{i=1}^n |i-p_i|\) Sol 很神仙的一题. 首先我们打表 (滑稽). 发现当没有字典序限制时的答案就是卡特兰数. 考虑感性理解,那么考虑卡特兰数的经典应用,它是最长下降子序列长度不超过 2 的排列的个数. 发现很有道理啊 owo. 于是我们就考虑在有字典序限制的条件下求解这个玩意. dp有点难想到,我们设 \(f[i][j]…
打表可以发现相当于不存在长度>=3的递减子序列. 考虑枚举在哪一位第一次不卡限制.注意到该位一定会作为前缀最大值.判掉已确定位不合法的情况后,现在的问题即为求长度为i.首位>j的合法排列个数,设其为g[i][j]. 由于首位>j,1~j在排列中一定依次出现,并且在j出现之前,>j的部分也一定单增.于是可以先将>j的部分安排好,再将1~j不改变相对顺序地插入.>j的部分即是考虑没有各种奇怪的限制要怎么求.设f[i][j]为长度i的排列,第一个非前缀max的数在j位置的方案…
题目: 洛谷 4769 博客页面左下角的嘴嘴瓜封神之战中的题目 分析: 一个排列交换次数为 \(\frac{1}{2}\sum_{i=1}^{n}|i-p_i|\) 的充要条件是这个排列不存在长度为 \(3\) 的下降序列(即:最长下降子序列不超过 \(2\) ),证明 感性理解如下: 考虑如果交换次数大于 \(\frac{1}{2}\sum_{i=1}^{n}|i-p_i|\) ,那么一定存在至少一个元素「绕路」了. 必要性 :「绕路」分为如下两种情况: 第一,某个元素的目标位置在它左侧,但它…
[NOI2010] [NOI2010]海拔 高度只需要0/1,所以一个合法方案就是一个割,平面图求最小割. [NOI2010]航空管制 反序拓扑排序,每次取出第一类限制最大的放置,这样做答案不会更劣. 考虑如何求每一个的最早时间,同上述拓扑排序,该元素不入队,当无点可拓展时就是最早时间. [NOI2010]超级钢琴 对每一个左端点维护当前取出了前几大的右端点,用堆+主席树维护. [NOI2011] [NOI2011]兔农 不难发现数列模意义下的进程是:斐波那切数列,首项回归0(减一操作),斐波那…
关于形如\(f_{i,j} = \sum_{t=1}^{|w|}\sum_{k=1}^{|v|}f_{i+w_t,j+v_k}\),其中\(w_t,v_k\)为一个定值的\(dp\)转移. 可以考虑放到坐标上,画出其转移路线,然后考虑组合意义. Section1 求\(\sum_{i,j} \binom{a_i+b_i+a_j+b_j}{a_i+a_j}\),其中\(a,b\leq 4000,n\leq 10^6\). \(\binom{a_i+b_i+a_j+b_j}{a_i+a_j}\)等价…
B:注意到nc/2<=m,于是以c/2为界决定数放在左边还是右边,保证序列满足性质的前提下替换掉一个数使得其更靠近边界即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long long #de…