题目:https://loj.ac/problem/2719 首先要发现合法的充要条件是 | LDS | <=2 ! 因为有没用的步数,说明一个元素先往左移.又往右移(不会先往右移再往左移,因为一旦往右移,说明它是前缀最大值,并且一直是),就说明它前面有一个比它大的.后面有一个比它小的,即有长度至少为 3 的 LDS . 考虑 DP ,已填了前 i 个位置.注意到已经填过的最大的数最容易产生 LDS ,所以令 dp[ i ][ j ] 表示填了前 i 个位置.已填的最大数是 j 的方案数. 考虑…
Loj #2719. 「NOI2018」冒泡排序 题目描述 最近,小 S 对冒泡排序产生了浓厚的兴趣.为了问题简单,小 S 只研究对 *\(1\) 到 \(n\) 的排列*的冒泡排序. 下面是对冒泡排序的算法描述. 输入:一个长度为 n 的排列 p[1...n] 输出:p 排序后的结果. for i = 1 to n do ​ for j = 1 to n - 1 do ​ if(p[j] > p[j + 1]) ​ 交换 p[j] 与 p[j + 1] 的值 冒泡排序的交换次数被定义为交换过程…
题目传送门 传送门 题目大意 (相信大家都知道) 显然要考虑一个排列$p$合法的充要条件. 考虑这样一个构造$p$的过程.设排列$p^{-1}_{i}$满足$p_{p^{-1}_i} = i$. 初始令$q = (1, 2, \cdots, n)$. 依次考虑$i = 1, 2, \cdots, n$. 设$x = p_i$,如果$q^{-1}_x > i$,那么交换$q_x, q_{x - 1}$. 上述算法每次交换的时候会使逆序对增加1. 考虑给出的下界,假设交换的是$i$和$i + 1$.…
题意 给你一个长为 \(n\) 的排列 \(p\) ,问你有多少个等长的排列满足 字典序比 \(p\) 大 : 它进行冒泡排序所需要交换的次数可以取到下界,也就是令第 \(i\) 个数为 \(a_i\) ,下界为 \(\displaystyle \sum_{i=1}^{n} |i - a_i|\) . 题解 一道特别好的题,理解后做完是真的舒畅- 参考了 liuzhangfeiabc 大佬的博客 . 首先我们观察一下最后的序列有什么性质: 考试 打表 观察的:对于每个数来说,它后面所有小于它的数…
题目:https://loj.ac/problem/3056 只会写暴搜.用哈希记忆化之类的. #include<cstdio> #include<cstring> #include<algorithm> #include<map> #define ll long long using namespace std; int rdn() { ;;char ch=getchar(); ;ch=getchar();} +ch-',ch=getchar(); ret…
题意 LOJ #2721. 「NOI2018」屠龙勇士 题解 首先假设每条龙都可以打死,每次拿到的剑攻击力为 \(ATK\) . 这个需要支持每次插入一个数,查找比一个 \(\le\) 数最大的数(或者找到 \(>\) 一个数的最小数),删除一个数. 这个东西显然是可以用 std :: multiset<long long> 来处理的(手写权值线段树或者平衡树也行). 对于每一条龙我们只能刚好一次秒杀,并且要恰好算血量最后为 \(0\)(一波带走). 然后就转化成求很多个方程: \[ \…
题目链接 loj#2721. 「NOI2018」屠龙勇士 题解 首先可以列出线性方程组 方程组转化为在模p意义下的同余方程 因为不保证pp 互素,考虑扩展中国剩余定理合并 方程组是带系数的,我们要做的是在%p意义下把系数除过去,(系数为atk[i]) (atk[i],p[i]) 不等于1时无逆元,此时仍可能有解 很显然无解的情况就是 瞎jb猜的,无解的话就是%p[i]意义下atk[i] != 0 ,a[i] = 0 考虑原方程式ai = atk{i] * x + p[i] * y 方程两边同除g…
「NOI2018」冒泡排序 考虑冒泡排序中一个位置上的数向左移动的步数 \(Lstep\) 为左边比它大的数的个数,向右移动的步数 \(Rstep\) 为右边比它大的数的个数,如果 \(Lstep,Rstep\) 中有一个不为 \(0\) ,那么显然不会取到下界,因为产生了浪费的步数,题面给的提示在这里非常有用,如果至少有一个为 \(0\) ,那么显然没有产生浪费操作,取到下界,所以一个合法排列的充要条件就是对于所有位置 \(Lstep\times Rstep=0\) ,即该排列的最长下降子序列…
题目链接 loj#2718. 「NOI2018」归程 题解 按照高度做克鲁斯卡尔重构树 那么对于询问倍增找到当前点能到达的高度最小可行点,该点的子树就是能到达的联通快,维护子树中到1节点的最短距离 spfa她死了...同步赛没写的说... 似乎前两题比去年简单些....连蒟蒻我都可做前两题的说 代码 #include<queue> #include<cstdio> #include<cstring> #include<algorithm> inline in…
「NOI2018」冒泡排序 题目描述 最近,小S 对冒泡排序产生了浓厚的兴趣.为了问题简单,小 S 只研究对 1 到n 的排列的冒泡排序. 下面是对冒泡排序的算法描述. 输入:一个长度为n 的排列p[1...n] 输出:p 排序后的结果. for i = 1 to n do for j = 1 to n - 1 do if(p[j] > p[j + 1]) 交换p[j] 与p[j + 1] 的值 冒泡排序的交换次数被定义为交换过程的执行次数.可以证明交换次数的一个下 界是$\frac{1}{2}…