思路讲解
BIT+频数数组
1 | inline ll query(ll x){ |
AC代码
https://www.luogu.com.cn/record/197653847
1 |
|
心路历程(WA,TLE,MLE……)
TLE https://www.luogu.com.cn/record/197653726
#include <unordered_map> 这个还是比map要快一点,省了300多ms
BIT+频数数组
1 | inline ll query(ll x){ |
https://www.luogu.com.cn/record/197653847
1 | #include <iostream> |
TLE https://www.luogu.com.cn/record/197653726
#include <unordered_map> 这个还是比map要快一点,省了300多ms
答案一定形如跳跳跳到最后一题,然后把剩下的题全做了。
那这个跳到最后一题的过程一定要最小化,所以就是最短路啦
那么要最小化什么那?损失的分数,那么要最小化的就是权,或者说是边权
当然,这个人说的有点瑕疵,起始在跳到最后一题的过程中有两种跳法,一种是跳到B[i],一种是跳到i-1
1 | pq.push({B[s],Dis[s]+A[s]}); |
还有一种思路,用线段树或者树状数组
https://codeforces.com/contest/2024/submission/300344376
1 | #include <iostream> |
这种一定要加一个限制,避免出现负数,0之类的不存在点进入的情况
1 | // 还要考虑往回走的情况 |
https://codeforces.com/contest/2024/submission/300344292
这个MAXDIS设太小了,这种设大一点比较好
1 | const ll MAXN=static_cast<ll>(4e5)+10,MAXDIS=1e17+7; |
?即是有多少个数不参与这个移动

当然这个公式只有在特定条件下才能用
1 | if(K==0){ |
https://codeforces.com/contest/2028/submission/300282002
1 | #include <iostream> |
我看题解说,注意到,每个块最多被move back一次,那为什么最多被移动一次那?
我个人的理解是因为我们是可以随意选择move back的顺序,所以我们可以让我们的move back自动搞为一个单调的。
其实这个题解主要还是坚定了我的信心,让我知道我做法的时间复杂度是没问题的,我前面想复杂了。
总体上的思路是用数据结构优化模拟法,当然发现加粗(每个块最多被move back一次)是非常重要的,否则很容易想复杂。
核心是这段程序
1 | while (!pq.empty()) { |
https://codeforces.com/contest/2047/submission/300222017
1 | #include <iostream> |