省选
HT008_123
家人们点点关注叭
展开
-
[转载]省选学习算法(补坑记录)
Cpoy from hzwer @http://hzwer.com/1234.html 1.1 基本数据结构数组链表,双向链表队列,单调队列,双端队列栈,单调栈1.2 中级数据结构堆并查集与带权并查集hash 表自然溢出双hash1.3 高级数据结构树状数组线段树,线段树合并平衡树Treap 随机平衡二叉树Splay 伸展树Scapegoat Tree 替罪羊树块状数组,转载 2017-12-24 14:08:43 · 414 阅读 · 0 评论 -
P3332 [ZJOI2013]K大数查询
前言谁知道是CDQ分治还是整体二分呢? 首先,如果只有一个查询,我们可以在区间里二分答案。 但是对于修改和操作动态搞,二分可办不了。 树套树? 不想写这么麻烦的数据结构。 那就上我们的CDQ/整体二分吧。 把操作和结果等一起二分实现整体过程:当遇到的操作是询问操作时,查询线段树里的当前区间,并将当前区间所包含的数的个数as与查询的第k大相比较,如果小于k,那么把当前询问原创 2018-01-15 20:33:50 · 252 阅读 · 0 评论 -
[算法讲解] 树链剖分
引言如果给你一串数,查询区间的和(max或min),该如何做? 线段树(树状数组) 但如果这个问题换到树上,查询 u,v 路径上的和呢? 树LCA+暴力 如果数据随机,这种方法是可以过的! 可是你觉得出题人会这么好心吗? 所以我们引出树链剖分,将这类问题转化成由线段树可以解决的问题!定义deep[i]deep[i]deep[i] 为i节点的深度(根的深度为1) son...原创 2018-01-06 08:49:12 · 251 阅读 · 0 评论 -
HDU 2485 Destroying the bus stations(迭代加深搜索)
题目链接题目大意给你N个点M条边和一个参数K 问你最少删除几个点可以让1-n的最短路径>K解题思路首先,我们删除的点一定是在当前图上1-n最短路径上的点,否则没有意义。 N问题的难点在于我们没法确定到底删几个点和那几个点。 删除几个点这样有层次的问题,我们可以使用迭代加深搜索。迭代加深搜索所谓迭代加深搜索,即将深搜限制在一定的层数下的深搜。 基本的深搜原创 2018-01-16 09:34:11 · 221 阅读 · 0 评论 -
Splay之区间翻转问题
题目描述给你 n 个数 分别为 1,2,3,4–n 然后有 m 个操作,每个操作对应一段区间,将区间的数进行翻转。 比如 1,2,3,4,5 这段序列 操作区间为 2-4 翻转完成后的序列为 1,4,3,2,5输入格式第一行分别输入 n,m 第2行到m+1行每行输入两个数 对应操作的区间输出格式输出最后翻转完成后的序列数据范围n,mSpl原创 2018-01-04 16:07:25 · 2112 阅读 · 0 评论 -
[Luogu P1402] 酒店之王
Luogu 类型:网络最大流 建模分析: 首先,我们要拆人,却不能拆房间和菜,因为给我们的关系是人与房间和人与菜的关系,我们只能用人当做中间桥梁联系房间与菜。 那么思路就很清晰明了了。 源点向每个房间连一条容量为1的边 喜欢的房间向人的入点连一条容量为1的边 人的入点向出点连一条容量为1的边 人的出点向喜欢的菜连一条容量为1的边 菜向汇点连一条容量为1的边 跑网络最大流即可原创 2018-01-16 20:25:33 · 190 阅读 · 0 评论 -
BZOJ 4819:[Sdoi2017]新生舞会 01分数规划+费用流
题目题目分析:二分答案 mid 若C=(a’1+a’2+…+a’n)/(b’1+b’2+…+b’n)<=mid 则a1−mid∗b1+a2−mid∗b2+...+an−mid∗bn<=0a1−mid∗b1+a2−mid∗b2+...+an−mid∗bn<=0a_1-mid*b_1+a_2-mid*b_2+...+a_n-mid*b_n...原创 2018-01-19 15:54:05 · 265 阅读 · 0 评论 -
字符串算法之后缀数组
前言字符串算法一直是我最不愿碰的东西,包括DP。什么是后缀?”ababs” 中所有的后缀串为”ababs”,”babs”,”abs”,”bs”,”s” 我们按照字典序排列即为 ”ababs”,’abs”,”babs”,”bs”,”s” 而后缀数组就是用来求后缀的字典序的定义SA[i]为排名为i的后缀第一个字符在主串里的位置. 譬如上面的例子 SA[1]=1,原创 2018-01-17 17:15:51 · 273 阅读 · 0 评论 -
网络流与线性规划二十四题
前言网络流大法好 只刷了14道题目,剩下的真的做不动啦。1.飞行员匹配问题传送门 本题为二分图匹配问题,可以用网络流解决,也可以用匈牙利算法解决。 这题是一道SPJ,方案不唯一,样例好长时间不过,我以为我错了。。。#include #include #include #include #define il inlineusing namespace std;原创 2018-01-07 16:59:12 · 368 阅读 · 0 评论 -
P2944 [USACO09MAR]地震损失2Earthquake Damage 2
Luogu 类型:最小割 这题目有毒啊。。。 输入P,C,N P才是牧场的总数,弄成N,debug半天。 建模分析: 很明显是道最小割的题目,然而割掉的并不是边,而是点。 所以我们拆点。 先把双向的通道容量设为INF,以防道路被割。 我们直接把1出点设为起点。 对于确定没有损毁的农场,我们先从出点向T连一条INF边。 对于确定没摧毁的农场,拆点中间的边为INF 不确定的为1原创 2018-01-17 21:05:34 · 186 阅读 · 0 评论 -
郁闷的出纳员
出纳员没郁闷,我倒郁闷了。 Debug了3个小时?!首先,我们发现,对于增加和减工资操作是全局的性质的。 所以我们可以用一个变量来维护这个操作。怎么删除呢? 我们可以找到第一个大于退出工资的人,把他这人提到根上去。 然后小于退出工资的人全部集中在了根节点的左子树。可以先插入一个极大的虚根维护这个问题,否则全部都小于退出工资的情况不好搞。询问查询的是第几大,不是第几小~#include <io原创 2018-01-05 17:26:24 · 349 阅读 · 0 评论 -
[CQOI2015]网络吞吐量
这题我Debug了2小时,心情复杂。 这题建模不需要说了。 讲一下如何处理即可。 最短路? SPFA啊 先把原图存下来。 咋判断一个点是不是在最短路径上? 枚举点的邻接点 若dis[to]=dis[from]+cost即为最短路 拆点,注意1,n限制不算。 还有要开long long,inf要大一些 Luogu BZOJ COGS#include #include原创 2018-01-14 20:39:47 · 234 阅读 · 0 评论 -
初识 块状数组
问题 给出一个长串,然后给出n个操作,操作有两种,在某个位置插入一个字符,或者查询第x个位置上的字符是什么对于这个问题,我们有两种解决方案。1:数组查询 O(1) 但是插入最坏可以达到 O(len)2:链表插入 O(1) 但是查询最坏也可以达到O(len)所以如何优化这个问题。这里介绍一种数据结构——块状数组何为块状数组?普通的数组,每个节点都是连续的。原创 2018-01-04 20:47:15 · 431 阅读 · 0 评论 -
静态主席树
首先来考虑一个问题 给你N个数字 然后是M次询问 每次查询 l-r第k大的数是多少? n、m的范围都是 10^5最暴力的方法也就是把这些数拿出来,然后Sort输出结果 这样的复杂度是O(m×n logn) 现在想一下如何用线段树来解决 l-r 中k值的问题 建一棵线段树 每个节点 代表l-r 区间 数字的个数 要求第k小,也就是与个数相关,那么我们可以 以[l,r]区间内的数的个数来原创 2017-12-27 16:50:53 · 211 阅读 · 0 评论 -
[Cqoi2011]动态逆序对
主席树套树状数组。 主席树第一题。 链接 静态的逆序对问题很简单,用线段树或者是树状数组即可解决。 现在的问题是如何解决一道动态的逆序对问题? 我们先把所有的逆序对统计出来。 每次删除数,我们可以把这个数对于逆序对个数的贡献删除出去。 这个贡献如何统计呢? Front[i]记录i位置之前有多少个数比这个数大 Back[i]记录i位置之后有多少个数比这个数小 每次删除的贡献就是这两原创 2018-01-02 16:30:19 · 345 阅读 · 0 评论 -
替罪羊树
花了一个下午,总算是把替罪羊树学会了。 在一众平衡树里面,替罪羊树可谓是独树一帜233. 因为其他平衡树里面,基本思想都是通过旋转,更改节点关系来做到平衡树. 但我们的替罪羊树可不是纸样滴. 核心思想是,重建!!! 对,泥萌木有听错,是重建233. 如果一颗子树深度失衡,我们就可以用中序遍历的方法来得到一个有序序列。 然后,从中间把这个区间给提起来,从而做到深度最优。 感觉这个思想,原创 2017-12-24 17:31:59 · 466 阅读 · 0 评论 -
入门级FFT
写在前面(跟正文没有一点点毛线关系,可以直接略过) 本蒟蒻是个数学很差的人,对于数学上的问题,一般都是敬而远之。 一天,我与群中大佬讨论NOIP2017时,发生了如下对话 我:如果我是出题人,第一题我就搞成高精度的,卡掉一批人 大佬:如果a b数位长度超过10510^5还得搞FFT,真是毒瘤啊 我:为啥啊? 大佬:你傻啊,朴素的高精乘法复杂度可是O(lenA*lenB)的 我:…原创 2018-01-11 19:33:58 · 362 阅读 · 0 评论 -
BZOJ 3932 任务查询系统
链接 看一下问题,emmmmm 动态查询前K小 很明显就用主席树啦。 具体怎样实现呢? 以时刻为下标,优先级为区间建主席树。对于在一个区间[l,r]内存在的任务,在l处出现次数加1,在r+1处出现次数减1,把这些看作事件,将时刻i所有发生的时间加入i的线段树。然后就可以在T[x]上统计答案了。 给我们的时间不一定就是端点,所以要对输入的时间进行迁移。 查询的方法emmmmm 二分呗。原创 2018-01-03 11:28:42 · 255 阅读 · 0 评论 -
字符串匹配之马拉车算法
前言这个马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这是非常了不起的。 啥是回文串呢? 形如”aaa” “abba”这样正反读都一样的串叫做回文串。 回文串分两种,一种是偶数长度的回文串,关于中心线对称 另一种是奇数长度的回文串,关于中心原创 2018-01-12 10:07:04 · 375 阅读 · 0 评论 -
教辅的组成
类型:最大流 类似于二分图匹配,但是对于书要拆点,否则会多次用。#include #include #include #include #define il inlineusing namespace std;const int inf=0x7fffffff;const int maxm=110000;int head[maxm],to[maxm*2],cap[maxm原创 2018-01-12 11:08:09 · 261 阅读 · 0 评论 -
Count on a tree
树上的主席树。 从父节点建树。 容斥原理 root[a]+root[b]-root[lca(a,b)]-root[fa[lca(a,b)]] 上的第k大。#include <cstdio>#include <iostream>#include <algorithm>#define il inline#define ls l,mid#define rs mid+1,rusing nam原创 2018-01-03 16:35:11 · 208 阅读 · 0 评论 -
[ZJOI2010] 网络扩容
第一问很好解决,直接跑最大流即可。 第二问很明显是个费用流问题。 一个很明显的想法就是我们可以在原网络的基础上使最大流提升K跑出的最小费用即为答案。 建模方法: 首先保留原网络的残留网络,设费用为0 然后复制原网络,但是容量为inf,费用即扩容费用。 然后搞一个起点,向1连一条容量为K,费用为0的边。 然后在这个新图上跑最小费用最大流即可。 分析: 我们把原网络复制一遍,然后虚拟原创 2018-01-14 15:42:00 · 415 阅读 · 0 评论 -
P3163 [CQOI2014]危桥
类型:网络最大流 建模分析: 普通的边按图中说的建立就好。 由于是来回 我们需要 从源点向a1,b1分别建立一条容量为 2 * an 和 2 * bn的边。 从a2 ,b2 向汇点分别建立一条容量为 2 * an和2 * bn的边。 然后跑一下网络最大流 看看最大流是不是 2*(an+bn) 你以为这就完了? 不存在的,上述的建图方式如果在a1跑到 b2的话,是不对的,但是我们判断出原创 2018-01-14 16:40:34 · 160 阅读 · 0 评论 -
[POJ 2449] Remmarguts' Date (A*搜索)
题目传送门题意描述:给你N个点和M条单向边 给出起点和终点 求出从起点到终点的第K短路朴素做法:我们如果用BFS进行搜索的话,记录一下终点出队的次数,当出队K次时,当前的路程即为第K短路 但点数过大时,入队列的节点过多,时间和空间复杂度都较高。A*优化A*是在搜索中常用的优化,一种启发式搜索。 简单讲就是对点进行估计,然后跑优先跑最有可能得出最终答案的点。 它原创 2018-01-20 09:18:26 · 249 阅读 · 0 评论