
数据结构
文章平均质量分 78
Neutralzz
这个作者很懒,什么都没留下…
展开
-
HDU 3397 Sequence operation (线段树区间合并入门)
维护8个数组,区间和,区间连续1和0的最多的范围,左区间最多连续1和0的范围,右区间最多连续1和0的范围,和一个懒标记数组c[],-2为全0,-1为全1,1为互换(就是^1)。代码:#include#include#include#include#define lson l, m , rt<<1#define rson m+1,r, rt<<1|1using na原创 2015-08-10 12:50:13 · 254 阅读 · 0 评论 -
Hdu 5316 Magician (线段树区间合并)
解析:关键是处理奇偶的问题。正如官方题解所说,本题的子序列实际上可以根据起始数值下标的奇偶性分为四类。对于每一类,如果你熟悉线段树,那么可以看出这个问题是可以进行区间合并的。即如果知道一个区间[L, R]两个子区间 [L,mid], [mid+1,R]的信息,我们可以推出[L,R][L,R]的信息。维护四个值,表示起点终点的下标的奇偶性。[code]:#include#i原创 2016-07-10 20:02:19 · 273 阅读 · 0 评论 -
Hdu 5318 The Goddess Of The Moon (dp+矩阵快速幂)
解析:dp[i][j]表示前 i 个数,以 第 j 个数结尾的方案数。因为每一层的转移都是相同的,所以处理出一个转移矩阵,通过快速幂即可快速求得结果。[code]:#include#include#include#include#includeusing namespace std;typedef long long LL;const LL INF = 0x3f3f3f3f原创 2016-07-10 20:09:59 · 333 阅读 · 0 评论 -
Hdu 5324 Boring Class (cdq分治)
解析:因为是最小字典序,所以从右往左DP。dp[i] = max(dp[j]+1) i =L[j],R[i]因为这是三维上的问题,自然的就能想到cdq分治了。在一个区间[l,r]内,先对[mid+1,r]递归,按L[]排序后建立一个对R的线段树,来计算[mid+1,r]的影响,再递归[l,r]。这里说的比较笼统,不过熟悉cdq分治的同学应该能立马明白我说的什么吧![code]:原创 2016-07-10 20:33:45 · 388 阅读 · 0 评论 -
Hdu 5338 ZZX and Permutations(线段树+贪心)
解析:首先用set维护被Cirlcle Notation切开的不连续的各个段。然后从i开始,(p[i]为i的位置)找到其在set中的左右端点,左边的最大值为value_l,右边p[i]+1的值为value_r。若value_l>value_r,则{p[value_l],p[value_l]+1,...,p[i] }为一个CircleNotation,并再用set维护剩下的段。若原创 2016-07-13 20:42:45 · 290 阅读 · 0 评论 -
HDU 5293 Tree chain problem(树形DP+树链剖分)
题意:一颗n节点树上有m条链,每条链有权重,求一个链的集合使权重和最大且两两不相交。解析:令dp[i]为以i为根的子树的最大权重和。如果i不在链上,则有dp[i] = sigma(dp[k]) k为i的子节点如果i在某一条链(u,v,w)上,那么dp[i] = w + sigma(dp[k]) k为链上所有节点的子节点。对于该值,我们可以统计统计链上节点的所有子节点dp的和 - 链上节原创 2016-07-06 09:55:18 · 430 阅读 · 0 评论 -
HDU 5296 Annoying problem (树状数组+dfs序+倍增)
题意:一颗n节点的带权无向树,一个初始为空的集合S,有两种操作:1 x 如果S中没有x,加入x ;2 x 如果S中存在x,删除x。每次操作完后求出使S集合连通的最小边权和。解析:设root为S集合的LCA。点i的左右时间戳为L[i],R[i],ans为当前的权重和。当前集合S中添加节点x,如果x不在root的子树中,那么ans += dis[x]+dis[root]-2*dis[lca(x原创 2016-07-06 10:15:30 · 381 阅读 · 0 评论 -
HDU 5735 Born Slippy (分块+树上可持久化)
官方博客讲的很清楚:点击打开链接在这里贴一下做树上可持久化的代码仅供参考。[code]:#include#include#includeusing namespace std;typedef long long LL;const int maxn = (1<<16)+5;const int sqrn = (1<<8)+5;const int MOD = 1e9+7;原创 2016-07-27 14:56:43 · 403 阅读 · 0 评论 -
Codeforces 689D Friends and Subsequences(RMQ+二分)
题意:大小为n的序列a和b中,求(l,r)的个数,使得max(a[l..r]) = min(b[l...r])。解析:在固定l后,随着r的增加,max(a[l..r]) - min(b[l...r])是不减的。所以可以通过二分求得max(a[l..r]) = min(b[l...r])的两个边界。[code]:#include#include#include#includeu原创 2016-07-09 08:52:54 · 655 阅读 · 0 评论 -
Light OJ 1394 Disable the Wand (数位DP)
解析:dp值设为pair 同时记录个数和sum,套模板。[code]:#include#include#include#includeusing namespace std;typedef long long LL;typedef pair PLL;PLL dp[35][35][35][3][7];int s1,s2,ideal[32];int bit[35],to原创 2016-04-23 21:29:35 · 434 阅读 · 0 评论 -
Codeforces 665E Beautiful Subarrays (Trie树)
题意:找出异或和>=k的连续子序列个数。官方题解:http://codeforces.com/blog/entry/44466[code]:#include#includeusing namespace std;typedef long long LL;const int maxn = 1e6+5;const int ML = 30;struct Nod{ in原创 2016-05-04 15:36:10 · 319 阅读 · 0 评论 -
Light OJ 1415 Save the Trees (dp+块状数组)
解析:设dp[i]为考虑前i棵树的最小收益。那么dp[i] = min(dp[j]+max(h[j+1...i]));显然不能直接状态转移,但是又想不出logn的做法,于是就套上了块状数组。[code]:#include#include#include#include#includeusing namespace std;typedef long long L原创 2016-04-23 10:46:09 · 518 阅读 · 0 评论 -
HDU 4533 威威猫系列故事――晒被子 (线段树)
覆盖是分为两种的,从max(a1,b1)~min(a2,b2)和从min(a2,b2)~max(a2,b2)的覆盖。所以记录两种覆盖方式对应的区间面积值。如下图,对于第一部分的覆盖,假设有两个矩形的右上顶点分别是(a,a),(b,b)对于第一部分的覆盖,面积为(b-x1)*(b-y1) - (a-x1)*(a-y1) = (b^2 - (x1+y1)*b) - (a^2 - (x1+y原创 2015-08-10 13:30:55 · 1176 阅读 · 0 评论 -
HDU 1394 Minimum Inversion Number (BIT入门)
树状数组求序列逆序数略。关键是求出每次改变后的序列的逆序数。对于序列ai,...an,a1,...,ai-1变成ai+1,...an,a1,...ai,原先比ai小的数都是逆序数,比ai大的数不是逆序数现在恰好相反,所以结果就加上(n-ai)-(ai-1)代码:#include#include#include#include#define lowbit(k原创 2015-08-10 12:27:18 · 265 阅读 · 0 评论 -
ZOJ 3299 Fall the Brick (线段树)
思路:先离散化,对每个board从高到低排序,依次求每个board对应区间的brick数,求出后对应区间清零。这题卡内存,AC好不容易啊!!#include#include#include#include#include#include#define lson l ,m ,rt<<1#define rson m+1 ,r ,rt<<1|1using nam原创 2015-08-10 12:35:31 · 277 阅读 · 0 评论 -
HDU 2871 Memory Control (线段树神题)
神题。。综合了线段树的所有操作,很锻炼代码能力。初状态全为0ls,ms,rs记录区间连续的0,lv,rv记录其所属block的左右端点,c为其懒标记,cnt记录区间的block数,clr记录是否重置。代码:#include#include#include#define lson l , m , rt<<1#define rson m+1,r , rt<<1|1原创 2015-08-10 12:59:56 · 338 阅读 · 0 评论 -
POJ 2991 Crane (线段树)
关键点:向量(a,b)逆时针旋转p度后为(acosp-bsinp,asinp+bcosp)每段看成一个向量,最后结果为向量和。这样记录每段向量的两个值,和与y轴的夹角。prv[i]表示i和i+1的夹角。代码:#include#include#include#include#include#include#define lson l ,m ,rt<<1#d原创 2015-08-10 13:40:35 · 297 阅读 · 0 评论 -
Light OJ 1334 Genes in DNA (扩展KMP)
解析:假设D的当前位置为i,D[i...n-1]与G[0...m-2]的最长公共前缀长度为t,B[j] 为以D[j]结尾的与G[i]的后缀匹配的个数。那么以D[i]为首的满足条件的串的个数 = sigma(B[k]) , i+1t均可用KMP求得。对于B[],可以将字符串反向后,再用KMP和树状数组(或端点标记后累加)求得。[code]:#include#include原创 2016-02-18 18:40:55 · 256 阅读 · 0 评论 -
Light OJ 1360 Skyscraper (线段树+DP)
解析:设dp[i]为[0,i]层内的最大获利,最高层为bound。先将每一个广告按底层位置排序,然后按次序,当考虑第i个广告(l底层位置,r顶层位置,v获利)时,则有dp[j] = max(dp[j],dp[l-1]+v) ,r用线段树维护序列。[code]:#include#include#include#define lson l, mid ,rt<<1#d原创 2016-02-18 22:35:11 · 349 阅读 · 0 评论 -
HDU 4595 Similar Number (主席树)
解析:首先,求出对于每一个位置i,以第i个元素结尾的相似序列的最大长度和最小长度,用lb[i]和rb[i]记录对应的位置,形成一个三元组(i,lb[i],rb[i])。这个可以通过递推在O(n)内求出,然后将三元组映射成二维平面的线段(i是纵坐标,lb[i],rb[i]是左右端点的横坐标)。对于[l,r]的查询,就是对纵坐标[1,r]的所有线段中位于[l,r]的和。用主席树就可以实现。原创 2016-03-28 21:42:55 · 463 阅读 · 0 评论 -
Codeforces 689E Mike and Geometry Problem(离散化+懒标记)
题意:给出n个线段[li,ri],求任意k个线段所共同覆盖的点的总和。解析:对于每一条线段,区间[li,ri]加一,如果一个位置的值为m,那么最后的结果ans += C(m,k);如果只是离散化端点的话,没法求得中间部分被覆盖的点,所以在离散化时保证相邻两点中间留出一个1,对于中间的点,求出当前的值*(相邻两点实际距离-1)即是结果。[code]:#include#inclu原创 2016-07-09 09:03:10 · 452 阅读 · 0 评论