最后的日记
凌乱
·
·
个人记录
- P2448 【无尽的生命】
对于有相同性质的连续的数,我们可以把它们合并成一个数,那样就可以节省空间了,也不用超时了
- P3149【排序】
下次可不要再对着这种题(这种出错了的题)死磕了,你忘了你csp是怎么没的吗。
终于学会了分析题目了,再接再厉,有些时候我们要从正反两面去思考问题,也许会有不一样的收获。
- P6040【课后期末考试滑溜滑溜补习班】
嗯,对单调队列理解更深了一些,用不用单队看方程,什么时候出队,什么时候进队也都看方程,嗯,加油!
- 启发式合并:
- CF600E 【Lomsat gelral】
- U41492 [树上数颜色]
要点: 要搜轻儿子,不记录,最后搜重儿子,记录,再搜轻儿子维护重儿子的信息向上合并(本质为优化后的暴力)
//dush为暴力搜索的代码
void dush(int u,int f,int val,int x=0){
mp[dep[u]][c[u]]+=val*d[u];
//暴力 维护 信息
tu(u){
vv;
if(v!=f&&v!=x) dush(v,u,val,x);
// 重儿子 节点的子树 不搜(其信息存在,并未撤销)
}
}
// dfs2用来 遍历每个节点
void dfs2(int u,int f,int is){
tu(u){
vv;
if(v!=f&&v!=son[u]) dfs2(v,u,0);
}
//都先搜 轻儿子
if(son[u]) dfs2(son[u],u,1);
//然后搜重儿子
dush(u,f,1,son[u]);
// dush准备 暴搜信息 向上合并
for(int i=qhd[u];i;i=q[i].nt)
ans[q[i].id]=mp[q[i].dep][q[i].col];
// 用信息 记录答案
if(!is) dush(u,f,-1);
// 若 该节点 为 轻节点 则 信息 回溯(撤销)
}
- P6041 【ACOI2020】布丁暗杀计划
map与hash_table
1. map是所有哈希里最稳定的,增删改查什么的都是log
2. hash_table 的查询 是 O(1) 的 挺快的
3. 并没怎么搞懂原理,反正有这么个东西 有点快,当然也有缺点
#include <ext/pb_ds/hash_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
gp_hash_table <int,int>g;
cc_hash_table <int,int>c;
//cc应该会更快 更稳一些。。。
看不太懂,关于头文件,可以去我的电脑 搜索 pbds 也可以 强记
- CF570D Tree Requests
-
关于DSU on tree(启发式合并 上树)
1. 一般题目格式:一个树,n个点,多个询问,离线操作,询问每个子树内的相关情况,最大,小值,众数等等
2. 起始时间复杂度为 nlogn 其为遍历时间
3. 我们需要尽可能的是查找时间即维护信息的时间为O(1)
-
关于 map与hash——table
1. 数组 14.95s
2. map 16.14s
3. cc_hash_table 23.59s
4. gp_hash_table 25.00s
hash_table 知道就好 能不用就不用,为什么被淘汰不是没有原因的
-
当询问同一系列深度时可以建立n个vector对应不同深度,按dfs序加入容器,这样容器中就是递增的了,当询问u节点的子树时,找id[u]~di[u]范围内的就好了
莫队算法:
一个叫做莫涛的大神发明的一种极致优化美丽的暴力算法
应用范围:
-
区间或是上树的两点轨迹的多次离线查询
具体操作:
-
先分块,再储存所有的询问,根据具体问题选择排序方式(都差不多)这是一种基于分块的排序,所以先分块
-
然后根据排序后的询问 设置两个或者三个指针 l,r,t 开始我们的暴力,指针的优先级为 l,r,t
- 具体分为: 区间,上树,(区间或者上树)加最简单的修改,还有回滚莫队
特别鸣谢巨佬和巨佬二号
斜率优化:
what:单调性优化的一种特殊情况
how:yy(j)=kk(i)xx(j)+zz(i) 写通式然后根据线性规划的知识o(1)转移
目前见到的题目:
- 模板
- P【2900】土地征用对于有两个属性的,先排序,再删除个别没用的元素,然后就是一个x递增y单减的序列就可以优化了
- P【5785】任务安排对于有些题目目标斜率不单调,维护凸包然后二分即可
DP的各种优化:关于DP的各种优化
网络流:加油