摘要: "传送门" 不得不承认noip的题出的是真的好 n=300000,m=300000的极限数据不由得想到某种nlogn的做法 这道题乍一看和二分没有一点关系,然而我们仔细想想后发现,对于一个时间t1,如果t1之内可以完成,那么t2肯定也能完成! 满足单调性,因此我们可以二分时间,那么如何check呢? 阅读全文
posted @ 2018-08-14 11:49 Patrickpwq 阅读(179) 评论(0) 推荐(0) 编辑
摘要: "传送门" Solution: 就是树链剖分入门题啦~ cpp // luogu judger enable o2 include define N 30005 define M 200005 define lson now 1; build(l,m,lson); build(m+1,r,rson) 阅读全文
posted @ 2018-08-13 13:09 Patrickpwq 阅读(119) 评论(0) 推荐(0) 编辑
摘要: "传送门" Solution: 我们只需要采用和树链剖分近似的思想——把整个树的dfs序整理出来,排成线型。 这样一个节点的子树肯定是连续的一段,于是乎就可以用树状数组维护单点修改+区间查询的任务了。 cpp include include define N 100005 using namespa 阅读全文
posted @ 2018-08-13 11:11 Patrickpwq 阅读(108) 评论(0) 推荐(0) 编辑
摘要: " 传送门 " Solution: 我们考虑把所有能够互相翻到的牌归到一个集合里去 ,不难想到可以用并查集来维护这些集合。由于前面的骨牌可能太长以至于影响后面骨牌的统计答案,所以我们要离线询问,从后往前做。 并且再维护一个单调栈,用来存并查集的祖先们。 维护后缀和(即到达终点的所需花费)这样的话 对 阅读全文
posted @ 2018-08-11 23:23 Patrickpwq 阅读(203) 评论(0) 推荐(0) 编辑
摘要: "传送门" Solution: 既然是删掉k/c个,那么k=mini,那么删除的还是mini,把c+1个划分到上个区间也是无意义的。 但如果长度为2c的话就能删除2个,但一定不如化成2个c长度的区间优秀。假如前c个的最小值是mini1,次小值是mini2,后c个的最小值是mini3,假如mini2m 阅读全文
posted @ 2018-08-11 23:09 Patrickpwq 阅读(211) 评论(0) 推荐(1) 编辑
摘要: " 传送门 " Solution: maxn数组用来存储“从终点到某点间的最大卖出价”,而minn数组用来存储“从起点到某点间的最小买入价”。两遍spfa跑完之后枚举每一对maxn与minn找到最大的差值即可 写的时候注意逻辑,思路一定要清晰,不然很久都调不出来 cpp include define 阅读全文
posted @ 2018-08-11 20:39 Patrickpwq 阅读(182) 评论(0) 推荐(1) 编辑
摘要: " 传送门 " 对于这道题,我们不难想到,对于两个点,我们可以求出他们的lca,然后顺着链暴力往上修改。 但是这样时间复杂度是很不乐观的,最多可以达到n^2。 这里介绍一种可以用来修改树上路径的方法——子树前缀和。 设定一个修改数组change。如果要对x到y路径上的所有点权值+k,lca为z。那么 阅读全文
posted @ 2018-08-11 10:26 Patrickpwq 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 夜很深 写着写着题有些感慨 18.8.10,似乎就是在去年的这个时候认识了OI。 那是初一升初二的暑假,有一天妈妈突然告诉我,她打听到有个地方可以教编程,你要去吗? 我当然欣然地接受了,男孩子,或多或少对这方面感兴趣。 然后大概就是特别兴奋地在openjudge上刷了50道水题吧...和许多新手类似 阅读全文
posted @ 2018-08-10 23:25 Patrickpwq 阅读(252) 评论(4) 推荐(0) 编辑
摘要: "传送门" 首先,肯定是先把所有满足条件一的点预处理出来,我们采用一遍dfs+一个统计来完成这件事。 然后就是求最短路了,跑一遍spfa即可。 cpp include define N 10005 define M 200005 using namespace std; int n,m,first[ 阅读全文
posted @ 2018-08-10 09:35 Patrickpwq 阅读(167) 评论(0) 推荐(0) 编辑
摘要: "传送门" 一开始没在意数据范围...就用一个5行的dfs瞎做,搞了80分。 正解是带权并查集,只需要维护一下到根节点的距离就可以了。。。。 cpp include define N 200005 using namespace std; int n,father[N],to_root[N],ans 阅读全文
posted @ 2018-08-09 22:33 Patrickpwq 阅读(106) 评论(0) 推荐(0) 编辑
摘要: "传送门" Solution: 并查集暴力搞。 挺像kruskal找最小生成树的,按边权从小到大排序,枚举最小边,然后不停的加比这条边大的边,直到s,t连通。 cpp include define N 505 define M 5005 using namespace std; int n,m,s, 阅读全文
posted @ 2018-08-08 22:59 Patrickpwq 阅读(86) 评论(0) 推荐(0) 编辑
摘要: "传送门" 题目要求任意两点间至少有两条没有公共边的路, 也就是说所要求的图是一张边双连通图。 将一张有桥图通过加边变成边双连通图, 至少要加(leaf+1)/2 条边。 因此对于本题, 我们求出所有桥, 将桥删去后得出所有的边双连通分量, 将它们缩为点后找出叶子数, 进而求出答案 求图的桥: 跟求 阅读全文
posted @ 2018-08-07 23:29 Patrickpwq 阅读(91) 评论(0) 推荐(0) 编辑
摘要: " 传送门在这儿 " 讲的真好!我还是写线段树。 阅读全文
posted @ 2018-08-07 21:41 Patrickpwq 阅读(72) 评论(0) 推荐(0) 编辑
摘要: " 传送门 " Solution: 图上的点分为两种: 1.隔离后对图的连通性有影响的 2.没有影响的 情况2是很简单的,也就是样例中的1,2,5点,易知答案是(n 1) 2 情况1,其实就是图的 割点 。 我们考虑如何求图的割点—— 先回顾low,dfn的定义 定义 DFN(u)为结点 u 搜索的 阅读全文
posted @ 2018-08-07 11:48 Patrickpwq 阅读(143) 评论(2) 推荐(0) 编辑
摘要: "传送门" 就是一个二维树状数组单点修改+区间查询的模板题,代码特别好实现,可以来练练手。 cpp include include include using namespace std; int trash,n,tree[1050][1050]; inline int lowbit(int x) 阅读全文
posted @ 2018-08-05 22:48 Patrickpwq 阅读(141) 评论(0) 推荐(0) 编辑
摘要: "传送门" 就是stars的变式。 把e,s当成一个点的横坐标,纵坐标后,经过画图会发现,所要求的点,其实就是一个点的左上方。 按y从大到下排序,然后树状数组维护一下类似桶的东西即可。 cpp include include include include using namespace std; 阅读全文
posted @ 2018-08-05 09:27 Patrickpwq 阅读(75) 评论(0) 推荐(0) 编辑
摘要: " 传送门 " Solution: 由于数字的大小可能非常大,而且都是未知的,所以只能采用离散化的方式先将数组离散化。 每次把这个数的位置加入到树状数组中,因为是排完序之后,所以之前加入的一定比后加入的大 然后再查询当前这个数前面位置的数。 cpp include define N 40005 us 阅读全文
posted @ 2018-08-04 21:40 Patrickpwq 阅读(319) 评论(0) 推荐(0) 编辑
摘要: " 传送门 " 由于输出中的y还是单调递增,甚至还不用排序了。 我们用树状数组维护一个类似桶的东西即可,在update,注意是i=x;i include include using namespace std; int n,tree[32015],level[32015]; inline int l 阅读全文
posted @ 2018-08-04 20:21 Patrickpwq 阅读(100) 评论(0) 推荐(0) 编辑
摘要: "传送门" 每个点最多走一次 因此我们用0,1表示一个点去没去过,这样的话,假如有5个点,10100就可以表示去过第一个点,去过第三个点,其他没有去过。 因此状态转移:dp[state][i]=min(dp[state][i],dp[state'][j]+dis[i][j]) 最短路用floyd搞搞 阅读全文
posted @ 2018-08-04 09:55 Patrickpwq 阅读(90) 评论(0) 推荐(0) 编辑
摘要: j " 传送门 " Solution: 类似的,我们首先预处理出一行的 只关系是否会自己炸到自己的 所有合法状态(i&(i 2)) 由于当前行与前两行都有关系 因此我们设dp[i][j][k]为 当前第i行 状态为j i 1行状态为k 所以枚举当前行的状态 上一行的状态 上上行的状态 状态转移方程 阅读全文
posted @ 2018-08-02 21:54 Patrickpwq 阅读(75) 评论(0) 推荐(0) 编辑
摘要: 去掉最后一位 | (101101 10110) x 1 在最后加一个0 | (101101 1011010) x 1011011) x 101101) x | 1 把最后一位变成0 | (101101 101100) x | 1 1 最后一位取反 | (101101 101100) x^1 把右数第 阅读全文
posted @ 2018-08-01 22:13 Patrickpwq 阅读(252) 评论(0) 推荐(0) 编辑
摘要: "传送门" PS:昨天被dalao深深的鄙视了不会状压dp。。。这几天一定要好好练 Solution: 我们发现,当前行的状态,只与上一行,以及自身内部有关,因此我们的dp数组很好确定,dp[i][state]代表第i行,状态为state的方案数。 ans=sigma(dp[m][state]) 因 阅读全文
posted @ 2018-08-01 12:06 Patrickpwq 阅读(84) 评论(0) 推荐(0) 编辑
摘要: 题目大意:有一个W行H列的广场,需要用1 2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法? (w,h 1 如果前一行连续两个位置为0,那么这两个连续位置可以横放 即00 11 如果前一行该位置为1,显然该位置不能再放,于是应该把该位置设置为0 ,即1 0 对于一个当前行的可行状态s,用dfs 阅读全文
posted @ 2018-08-01 10:31 Patrickpwq 阅读(645) 评论(0) 推荐(1) 编辑
摘要: " 传送门 " Solution: 与上一题十分类似的,我们考虑维护一个节点的区间从左到右包含最左端点的最大值,以及从右到左的最大值,以及整体的最大值,以及当前区间的权值和。 不过方便一点,我们不用再去维护区间左右端点的值,因为有了区间的权值和,父节点的lmax=max(lson.lmax,lson 阅读全文
posted @ 2018-07-31 16:07 Patrickpwq 阅读(69) 评论(0) 推荐(0) 编辑
摘要: " 传送门 " Solution: 考虑在区间维护五个值: 一个是le 代表从左端点开始向右的最大01序列 一个是ri 代表从右端点开始向左的最大01序列 一个是all 代表整个区间最大的01序列(可以不含左,右端点) xl 代表区间左端点的值 xr 代表区间右端点的值 这样之后,每次push_up 阅读全文
posted @ 2018-07-31 15:35 Patrickpwq 阅读(243) 评论(0) 推荐(0) 编辑
摘要: " 传送门 " 只需要对懒标记做文章,每次xor1,并且我们可以发现,一个区间xor1后权值和变为了l r+1 sum,知道这两个这道题就可做了。 cpp include define N 200005 using namespace std; int n,m,a[N]; struct node { 阅读全文
posted @ 2018-07-31 15:27 Patrickpwq 阅读(152) 评论(0) 推荐(0) 编辑
摘要: "传送门" Solution: 一辆车的载重,取决于他到终点上的路的载重最小值,最小值越大,装的就越多 考虑如何找路径,如果bfs或者dfs的话,TLE。 这时想到,我们可以做一颗最大生成树(按照权值从大到小排序),在生成树的基础上,两点之间都是联通的,而且载重也是最优的。 这时考虑如何在生成树上找 阅读全文
posted @ 2018-07-31 14:46 Patrickpwq 阅读(89) 评论(0) 推荐(0) 编辑
摘要: "传送门" Solution: 并查集,维护种类。 father维护可追溯的根节点,num维护与根节点的关系,我们定义0表示x与根节点同类,1表示x吃根节点,2表示根节点吃x。 当getfather(X)==(Y) 若D==1,而num[X]!=num[Y], 则此话为假。(D==1 表示X与Y为同 阅读全文
posted @ 2018-07-31 12:06 Patrickpwq 阅读(125) 评论(0) 推荐(0) 编辑
摘要: "传送门" 关于如何把多叉树转化为二叉树,有个口诀,叫做左儿子不变,右儿子兄♂弟。 详细的不多说,可以去参考一下相关资料。 等转化为二叉树了过后,让我们来琢磨一下。 左儿子:原根节点的孩子。 右儿子:原根节点的兄 ~~♂贵~~ 。 也就是说,不能直接套用第一题的方程,但是可以对dp数组进行相同的定义 阅读全文
posted @ 2018-07-30 17:10 Patrickpwq 阅读(182) 评论(0) 推荐(0) 编辑
摘要: " 传送门 " 这道题是个很好做的二叉树 首先考虑给DP数组下定义,一般来说树形DP的DP数组的第一维都是当前节点的编号。 这道题光一维肯定是不够的 ,那么加维,发现dp[i][j]表示当前节点为i,保留j个节点的最大苹果数量比较ok。 那么方程就显而易见了,dp[i][j]=max(dp[i][j 阅读全文
posted @ 2018-07-30 17:06 Patrickpwq 阅读(135) 评论(0) 推荐(0) 编辑
摘要: Problem: 在SD食堂,所有的座位是一行一行的排列。现在有N个座位排成一行,依次编号1,2,…,N,每个座位只能坐一个人,现在L想数一下有多少个人坐着,一个一个数太慢了,L决定只选择M段连续的座位,对每段分别数出人数。由于食堂噪音十分嘈杂,L无法专心,可能有输错了。但是L认为没有数漏,最多是重 阅读全文
posted @ 2018-07-30 16:59 Patrickpwq 阅读(102) 评论(0) 推荐(0) 编辑
摘要: Problem: 有 n 个不同的数列成一个队列,现在可以若干次选择两个数交换位置,每个数只能被交换 一次。现在 L想知道能得到多少种不同的队列。 输入 第一行是一个整数 T,表示有 T组数据 接下来 T行,每一行是一个整数N表示数量 输出 T行,每行一个正整数表示这组数据的答案(模1e9+7的值) 阅读全文
posted @ 2018-07-30 14:37 Patrickpwq 阅读(92) 评论(0) 推荐(0) 编辑
摘要: [传送门][1] Solution: 考虑倍增,维护up和w数组,up[i][j]代表i节点向上跳2^j能到达的节点,w[i][j]代表i节点及其以上2^j的和,一遍dfs,常规倍增处理即可。 特别地,w[i][0]的值不是val[father],而是val[i] include define N 阅读全文
posted @ 2018-07-29 23:35 Patrickpwq 阅读(91) 评论(0) 推荐(0) 编辑
摘要: [传送门][1] 题意:给出区间[1,n],下面有m组数据。l r,v区间[l,r]之和为v,每输入一组数据,判断此组条件是否与前面冲突 ,如果此条件冲突,则忽视它,最后输出与前面冲突的数据的个数. Solution: 带权并查集维护区间。 可以这么考虑,当几个区间能够拼起来的时,比如[1,3],[ 阅读全文
posted @ 2018-07-29 16:14 Patrickpwq 阅读(68) 评论(0) 推荐(0) 编辑
摘要: [传送门][1] [1]: http://poj.org/problem?id=1988 题意:现在有n个立方体,n个坑。有p种操作,分为M与C。对于M操作:给出x,y,需要把x立方体所在的坑里的立方体全部搬到y立方体所在的坑上。对于C操作,给出x,需要输出x立方体下面的立方体个数。 Solutio 阅读全文
posted @ 2018-07-29 11:46 Patrickpwq 阅读(75) 评论(0) 推荐(0) 编辑
摘要: [ 传送门 ][1] [1]: http://acm.hdu.edu.cn/showproblem.php?pid=3635 题目大意:有n个龙蛋,分别坐落在n个城市。现在有m个操作。操作分为T,Q。对于T:给出x,y,把x所在的城市中的蛋全部移到y所在城市去。对于Q:给出x,我们需要输出x所在的城 阅读全文
posted @ 2018-07-29 11:28 Patrickpwq 阅读(70) 评论(0) 推荐(0) 编辑
摘要: 先强调一下网络流 及最大流的通俗概念吧 (这里引用几个大佬的说法) 算了...自己戳进去看吧 懒得复制了(我不确定大佬后面写的能不能看懂 反正我是看不懂) https://blog.csdn.net/wzw1376124061/article/details/55001639 (看一下开头对网络流 阅读全文
posted @ 2018-07-28 16:38 Patrickpwq 阅读(338) 评论(0) 推荐(0) 编辑