- 博客(30)
- 资源 (1)
- 收藏
- 关注
原创 BZOJ 4636 蒟蒻的数列 - 排序+线段树/set
排序真是门博大精深的学问。。。先说线段树,大概就是按照大小排个序,小的排在前,然后直接覆盖上一层,线段树set之后维护一下就好了。只不过范围太大,得动态开节点。还得注意:线段树动态开节点的pushdown的写法:子树有可能未建立,不能直接传递下标,于是先建树,调用set函数建树+传递下标一回了事。#include<iostream>#include<cstdlib>#include<cstrin
2017-09-29 23:48:38 352
原创 POJ 1947 Rebuilding Roads - 树形DP
还是那句话。。。DP真恶心。。。这道题大概就是添加子树时由于子树和根节点有边相连,于是每一种情况都要+1,然后再取minDP方程真的很好写啊。。。就是边界和循环太恶心了 注意就是dp[x][0]是没有任何意义的,因为至少根节点会被选取,所以下限个数为1。然后就是需要注意若当前根节点不为整体棵树的root,则必须断掉来路,ans+1。#include<iostream>#include<cstri
2017-09-29 23:34:59 181
原创 POJ 2486 Apple Tree - 树形DP
本来想的是三维,0表示不返回,1表示返回,2表示返回+不返回 后来转念一想2状态不是完全浪费了吗,和0完全等同 想成一个自动机,大概就是0是结束态,1是接受态(对应上面两种不返回/返回状态),1+1->1,1+0->0 有两种情况1+1>11+0->0 这里还需要注意一下由于两个子树并无顺序的先后,因此还需继续讨论先后次序问题(三个讨论的具体内容见代码)其次就是子树通过根节点联系,所以
2017-09-28 00:00:54 198
原创 BZOJ 4510 Radio Contact - 记忆化搜索
#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1005;char path1[maxn],path2[maxn];long long dp[maxn][maxn],INF;int x1[max
2017-09-26 11:00:38 229
原创 BZOJ 3585 mex - 莫队+(分块/树状数组+二分/乱搞/主席树)
首先注意到大于n的数可以忽略,因其对答案绝无影响。 自己想出来了两种方法:1.分块大法好 就是把n分块,如果数添加之前不存在则把数填进去,块的计数++,统计时扫一遍块,找到第一个未填满的块,在其中找数 复杂度:O(qn√+qn√)O(q\sqrt{n}+q\sqrt{n}) (其实我也不太会算) 用时:13768ms#include<iostream>#include<cstdlib>
2017-09-26 00:06:10 278
原创 BZOJ 4195 [Noi2015]程序自动分析 - 并查集
NOI那年怎么全是大水题。。。要是我能在考场上见到一回就好了233这里需要注意一个问题,不能采用合并取反的数,因为取反意为不等,而x!=y,y!=z而x==z可以成立,一定要记住,没事别取反,总想搞个大新闻。。。#include#include#include#include#includeusing namespace std;const int maxn=100
2017-09-25 22:27:08 209
原创 BZOJ 4196 [Noi2015]软件包管理器 - 树链剖分
NOI怎么会出现这么裸的题。。。然而树剖写挂了这件事绝对不能忍。。。#include#include#include#include#includeusing namespace std;const int maxn=100010;struct tree{ int val,set;}t[maxn<<2];struct edge{ int to,nex
2017-09-25 22:24:57 149
原创 BZOJ 4385 Wilcze doły - 单调队列
看到这个数据规模,大概只能是O(n)了,选择一段忽略,很明显应该是选择一段内的最大值,考虑到单调队列。这道题需要用到双指针的思想。通过left和right两个指针固定一段数,其中被覆盖的肯定是最大的一段m,通过单调队列维护覆盖掉那一段的最大值。每次right右移需要保证left要取到最大,于是加上right节点后判断 区间和 - 单调队列维护的最大值 是否大于p,若超出p左移left指
2017-09-25 21:29:00 237
原创 POJ 1155 TELE - 树形DP
一道类似于背包的题,一眼便能看出是树形DP树形DP大概的思想大概就是虚树思想:先选定一个子节点,然后以此节点作为左儿子和右边一个儿子合并共同记为左儿子,其他右儿子一个个向左合并。dp[i][j]意为编号为i的节点的所有子树共同选定j个用户所获得的利润,利润为负则是亏本。一开始肯定都要赋-INF 的初值DP方程很好写啊:for(int j=m;j>=0;j--)//枚举根节点能取
2017-09-24 11:02:02 248
原创 BZOJ 1821 [JSOI2010]Group部落划分 - 最小生成树
一步步的思考->戳这里: http://blog.csdn.net/vmurder/article/details/42000843?utm_source=tuicool&utm_medium=referral大概就是建一个最小生成树,小边则一定要放到一个部落里面,未选的边则是不同部落,需要寻找未选的边里的最小值即为答案。由此应该从小到大贪心,如果边的两端不在一个部落则相连,边的两端在一个部落里则
2017-09-22 11:03:25 227
原创 BZOJ 1858 [Scoi2010]序列操作 - 线段树
大概考的就是一个tag标记的先后顺序和相互影响的问题这道题涉及到两个tag,一个是set,一个是翻转rev,假设先rev,set后入,set直接覆盖掉rev即可;假设是先set再rev,rev直接修改set标记。 pushdown的顺序: 因为有set函数保证之前的rev已清空,如果有rev标记则一定是后来的rev,所以先进行set,然而这里的set还应该覆盖掉子节点的rev,否则子节点的rev
2017-09-22 10:51:16 214
原创 BZOJ 4152 The Captain - Dijikstra
思路、证明什么的都在代码的注释里。需要说明的一点是STL堆默认为大顶堆,一定要记住。。。。#include#include#include#include#include#include using namespace std; const int maxn=200005<<1; typedef pair node; struct edge{
2017-09-22 10:24:06 213
原创 BZOJ 1975 [Sdoi2010]魔法猪学院 - k短路(手写堆)
大概就是一道k短路的裸题,然后恶心得要手写堆,学习了一下写法,发现好简单233注意就是当搜索到终点时不可continue,终点存在自环,可以从终点出发再次搜到终点。#include#include#include#include#include#include#define INF 1e20 using namespace std; const int
2017-09-22 10:20:38 198
原创 BZOJ 1045 [HAOI2008] 糖果传递 - 中位数
大概就是设第i个小朋友向第i+1个小朋友递了Xi个糖果,所以应该有以下方程: a1+xn−x1=averagea_1+x_n-x_1=average a2+x1−x2=averagea_2+x_1-x_2=average a3+x2−x3=averagea_3+x_2-x_3=average … an+xn−1−xn=averagea_n+x_{n-1}-x_n=average然后对于每一
2017-09-18 23:49:12 422 3
原创 BZOJ 4419 [Shoi2013]发微博 - set
大概就是加好友则双方互加到对方的set里,加之前减去对方set的tag;删好友从对方set删去,加上对方set的tag。(根据差分的的思想)进出一次队列得到的正分数减去负分数恰是其得分。千万注意最后一定要弹出set中所有元素(不知道sb地WA了多少次。。。)#include#include#include#include#include#include usi
2017-09-18 09:55:27 329
原创 BZOJ 1013 [JSOI2008]球形空间产生器 - 高斯消元
列n个距离公式,消去二次方项,然后大模拟列个方程,gauss消元解一下即可。我原来背的gauss消元的板子竟然会爆double。。。于是找的hzwer学长的板子抄了抄。。。#include#include#include#include#include#includeusing namespace std;const int maxn=25;const
2017-09-18 09:49:40 411
原创 BZOJ 3262 陌上花开 - CDQ分治
最近又研究了一下cdq分治,发现比树套树好写多了啊。。。首先cdq分治只能优化掉一维,对于一个三维问题,cdq分治先二分第一维,然后第二维通过sort后由左到右saomi
2017-09-17 21:47:49 218
原创 BZOJ 2140 稳定婚姻 - Tarjan_SCC
和稳定婚姻、匹配没有任何关系啊有木有。。。大概就是把婚外情的家庭编号用单向边连接(男方编号指向女方编号),如果这些编号存在自环,则其家庭之间已经出现满足出轨条件的状况了。#include#include#include#include#include#include#include using namespace std; const int maxn=4005
2017-09-13 23:11:08 163
原创 BZOJ 2208 [Jsoi2010]连通数 - Tarjan_SCC/Floyd+bitset优化
首先进行Tarjan缩点,将自环缩成一个点,已知自环中点相互连通,现在只需求环与环之间的联通情况。这里需要反向建图,利用从子节点更新父节点的思想,把to的点信息传给from。最后是一个
2017-09-13 23:01:33 486
原创 BZOJ 3211 花神游历各国 - 线段树
是一道。。。很奇葩的题。想了二十分钟合并递推lazy标记,结果发现答案这么狗血大概就是,对于每个数,最多log次就成1(或本身为0),然后再sqrt就没有意义了,对答案没有任何影响,于是记录一下最大值,遇到最大值#include#include#include#include#include#includeusing namespace std;const i
2017-09-09 20:33:24 252 1
原创 BZOJ 4034 [HAOI2015]树上操作 - 树链剖分
大概是一道裸题。注意处理给所有子树add时可以采用给入时间和出时间的区域线段树统一加add的方法,因为子树包含且仅包含在这一段区域内。#include#include#include#include#include using namespace std; const int maxn=100005; struct edge{ int to,next;}
2017-09-08 23:06:46 640
原创 BZOJ 4562 [Haoi2016]食物链 - 计数DP+拓扑排序
好像弱到连拓扑排序都忘记了是什么了。。。大概就是通过路径删入度,删到入度为零进队。而这道题正好利用了这样的思想,对于每一种生物都是先需要统计其上的所有方案数,然后将方案数传给子节点,最后输出汇点方案数即可。主要需要特判孤立点(即入度出度均为零的点),这种点不能算作一条链,初始值赋为零。#include#include#include#include#include#i
2017-09-08 23:02:43 296
原创 BZOJ 3555 [Ctsc2014]企鹅QQ - Hash
Hash初入门大概就是正序建立一个hash值,逆序建立一个hash值,然后尝试删去每一位,计算所有去掉这一位的串的hash值,相等即为整串只相差这一位。#include#include#include#include#include using namespace std; const int maxn=30005;const int maxm=205; int n,
2017-09-08 22:57:59 180
原创 BZOJ 3172 [Tjoi2013]单词 - ac自动机
大概是fail树的一道裸应用,首先要注意fail指针的特点,即对于每个trie树上节点fail指针指向的节点与根节点形成的串一定是该节点与根节点之间形成的串的最长后缀,而判断一个串在树上总共出现了几次,其数目等于end指针被fail指针指向或间接指向的个数,即统计fail树上关于每个串end节点的子树中有多少元素,由此建立fail数跑一下节点size即可。#include#include#
2017-09-08 22:46:58 179
原创 BZOJ 1010 [HNOI2008]玩具装箱 - 斜率优化
利用斜率优化必须要明确的一点就是,在不等式右边有关于i的项必须要单调,对于此题,右边正是两个状态的ans差值,于是需要证明ans单调性。戳这里(推导+证明)->http://blog.csdn.net/ep1c_heret1c/article/details/55655108注意这道题很明显更把f[j]+j和f[k]+k看作一个变量会简单一些,而我sb地推了两大页A4纸还是错的。。
2017-09-06 23:01:26 143
原创 BZOJ 1096 [ZJOI2007]仓库建设 - 斜率优化
听说是挺模板的一道题,然而我还是理解了好半天(太菜了233)数学推演过程在这->http://www.cnblogs.com/ljh2000-jump/p/6015002.html(发照片好麻烦就不发了233)大概斜率优化的整体过程是这样(针对于单调的那种):1.写出dp方程;2.推导当前状态i有关前面节点的式子,得到一个无关于i的类似于斜率形式的多项式。这里需要保证不等式另一端必
2017-09-06 20:56:02 196
原创 BZOJ 2152 聪明可可 - 点分治/树形DP
点分治的话好像是很裸的一种,总结一下点分治的两种做法:1.利用大树和子树之间的关系计算并容斥;2.在父亲节点上直接利用处理虚树的办法合并子树。这道题网上的第一种做法貌似很普遍,其实第二种更好些一些,大概就是计算一下经过分治点的边数满足题意的有多少个,注意节点本身还有一个长度0的路径。#include#include#include#include#include
2017-09-06 20:50:50 220
原创 BZOJ 4129 Haruna’s Breakfast - 带修树上莫队+分块
感觉关于树的不管是啥都200+行。。。一口老血。。。首先树上分个块(大概就是BZOJ1086王室联邦的套路,此处应有链接,可惜这道题还在坑里233),然后每次暴力移动点,尤其是关于lca的处理需要很注意(见下图):(假装有图)然后这里需要求mex值。对于mex值暴力当然会TLE,于是需要分块。将n个数分成sqrt(n),查询时从头查看哪个块数未满,然后在块中暴力寻找数,
2017-09-03 20:44:25 191
原创 BZOJ 3295 [Cqoi2011]动态逆序对 - 树状数组套主席树/树状数组套treap
首先预处理,对于一个输入的数列求逆序对个数利用树状数组nlogn即可解决。然后考虑删点的问题。每次删点需要在总ans中删去此节点前比此数大的数的个数和之后此数小的个数。对于当前的节点,如果需要定点查询一段区间中比一定值c大或小的点的个数,只需要在线段树(或平衡树)上操作即可。而对于这道题,需要讨论每个点,即每个点均需建立一棵线段树。每次查询之后需要在每棵线段树上进行修改操作,单次复杂度lo
2017-09-03 20:23:53 215
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人