思路讲解
赛时就做出来了,存档一下
好像有更简单的做法(倒过来想),但还是算了
AC代码
1 |
|
赛时就做出来了,存档一下
好像有更简单的做法(倒过来想),但还是算了
1 | #include <iostream> |

参考题解

我们来重点解释一下这个式子,其实我们最需要解决的就是可能两个数我要一个数,但是问题是我一个数不可能掰成两个数用。
https://www.luogu.com.cn/article/91cyarz3 当然下面这个最清楚

其实我主要不会的是怎么查前驱后继
想复杂了,这个其实是用二分做的。
那check函数怎么写呢?
不难发现一个性质,就是如果我要组成k个对
那么一定可以由k个最大的数作底座(当然你想反过来也可以)
1 | inline bool check(ll k){ |
其实我之前的做法的问题就是“内讧”,自己抢自己的。
https://atcoder.jp/contests/abc388/submissions/61633977
1 | #include <iostream> |
用这个multiset可以实现查前继后驱
但事实证明贪心的选择A以及A*2的后驱还是有问题
WA https://atcoder.jp/contests/abc388/submissions/61623225
1 | #include <iostream> |
无向图判环+贪心选择短边,这就是kruskal算法
https://vjudge.net/solution/57384651
1 | #include <iostream> |
P1908 逆序对 的升级版,加了下面这句话
He is allowed to swap two adjacent numbers for no more than k times.
1 | cnt=std::max(cnt-K,0LL); |
那为什么只要加了这句话就AC了呢?交换两个相邻元素就可以消除逆序对?
首先这个逆序对有两种情况,一种是相邻的逆序对,一种是不相邻的逆序对,比如以下这个
2.....1
中间只能填2,所以任何所谓的超距作用其实中间的所有数必然和那个‘1’是逆序对关系,所以所有逆序对关系都可以转化为相邻逆序对关系。
https://vjudge.net/solution/57377152
1 | #include <iostream> |