思路讲解
和这题代码基本一样,还是比较适合我复训的。
我们来解释一下为什么可以这样pushup
1 | inline void invert(ll s,ll e){ |
众所周知,我们知道差分数组是给diff[s]+1,给diff[e+1]-1,那为什么可以直接pushup那?那是因为树状数组中遍历你上面的数组是必然遍历不到你的,这点你不用担心,所以不用担心差分连续加导致出错。
AC代码
https://www.luogu.com.cn/record/192393560
1 |
|
和这题代码基本一样,还是比较适合我复训的。
我们来解释一下为什么可以这样pushup
1 | inline void invert(ll s,ll e){ |
众所周知,我们知道差分数组是给diff[s]+1,给diff[e+1]-1,那为什么可以直接pushup那?那是因为树状数组中遍历你上面的数组是必然遍历不到你的,这点你不用担心,所以不用担心差分连续加导致出错。
https://www.luogu.com.cn/record/192393560
1 | #include <iostream> |
模拟题,没什么好说的
我的写法是学的题解的写法,我觉得挺好的
化曲为直,是个好做法。
1 | #include <iostream> |
说实话,我也实在不太清楚哪里错了
1 | #include <iostream> |
主要思路就是使用二叉堆的一个贪心(pq)
把这个障碍物前面的全部奖励都放到pq里,然后用一个弹出一个,避免后面重复用,还有一个就是降低算法复杂度
其实还有一个对于算法复杂度的一个判断
其实push pq不用担心时间复杂度的问题,因为用过的我们都会push掉,所以每个奖励我们只会遍历一次,所以差不多是O(nlogn+mlogm)
https://codeforces.com/contest/2037/submission/293963686
1 | #include <iostream> |
二分搜索vector记得这么写
1 | ll idx=lower_bound(enc.begin() + 1, enc.begin() + m + 1,make_pair(ban[i].first,0LL))-enc.begin()-1; |
状压dp的整体思想就是将状态用一个数表示出来,进而方便状态转移。
1 | double dp[25][33000]; // 状压dp数组 |
那么问题就来了,怎么进行状态转移(在这题里)?
1 | for(int i=1;i<=(1<<n)-1;++i){ // 枚举所有状态 |
https://www.luogu.com.cn/record/191940029
1 | #include <iostream> |
前面status和点的idx位置放反了,导致了RE