数据结构:技巧
文章平均质量分 91
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
2016 UESTC Training for Data Structures E - 卿学姐与城堡的墙 树状数组求逆序对、离散化
这样排序相当于把右边v上的交点也移到uv内部去了;所以已经处理成交点只在uv内部了然后for i = 1 ~ Nadd(seg[i-1].order, 1);ans += i - get(seg[i-1].order);扫完就可以输出了☺☺另外这里附上一个比较好的讲树状数组求逆序对原理的博客原创 2016-05-01 00:02:26 · 1502 阅读 · 0 评论 -
UESTC 1594 老司机的奇幻漂流 并查集+食物链
题意:三个东西构成一个食物链关系,A->B, B->C, C->A,给出m条关系,问是否有矛盾。并查集 食物链每个点有三个成员A、B、C,当X和Y是同类时, _merge(X, Y), _merge(X+n, Y+n), _merge(X+2*n, Y+2*n);当X攻击Y时, _merge(X+n, Y), _merge(X+2*n, Y+n), _merge(X, Y+2*n);每次判断是否 if(x > n || x < 1 || y > n || y < 1){原创 2017-05-16 19:28:49 · 962 阅读 · 0 评论 -
UESTC 1603 BanG Dreamer 小根堆、贪心+set<pair<int, int>>+low_bound
题意:给出一个序列,要求划分成尽可能少的堆序列。一个序列S={s1,s2,...,sn}S={s1,s2,...,sn}是一个“堆型序列”当且仅当,存在一个有nn个结点的二叉树,其每个结点与该序列的元素一一对应,而且对于该二叉树的每个非根结点sisi和它的父节点sjsj,满足sj≤sisj≤si并且j<ij<i。子序列的定义是,其是某个序列删除掉任意数量元素之后,所剩下的部分。并且不改变其原有的顺序。小根堆、贪心+set<pair<int, int>>+low_bound用set维护,set中存储原创 2017-05-16 19:14:21 · 813 阅读 · 0 评论 -
UESTC 1592 An easy problem B 线段树区间合并
题意:区间更新把该区间内所有的数异或1,区间查询该区间内最长连续1的长度。线段树区间合并每个节点维护十元组int summid[4*MAXN][2], suml[4*MAXN][2], sumr[4*MAXN][2], ans[4*MAXN][2], lazy[4*MAXN], rev[4*MAXN];summid[Ind][k]表示该区间的中间的最长连续k(0|1)的长度,suml[Ind][k]描述该区间从左端点开始的最长连续k(0|1)的长度,sumr[Ind][k]表示从该区间右端点结束原创 2017-05-16 18:06:18 · 863 阅读 · 0 评论 -
UESTC 1597 An easy problem C 线段树+延迟操作+一次函数
题意:N个数排成一列,有三种操作。1.给一段区间内的每个数乘上一个非负整数。2.给一段区间内的每个数加上一个非负整数.3.询问一段区间的和模上P的值。线段树+延迟操作+一次函数用2个lazy数组,分别为lazya[i], lazyb[i],表示 lazya[i] * x + lazyb[i],即用一个一次函数,或者说一次系数和常数项 来表示每个节点lazy数组的情况。每次pushdown的时候,如果lazya或者lazyb有至少其中一个值需要向下传递,则都一起操作。先把 lazya的值传递给原创 2017-05-16 18:11:23 · 955 阅读 · 2 评论 -
Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C. Destroying Array 双向链表+反向做+优先队列
双向链表+反向做+优先队列反向做,按着反的顺序把元素一个一个的添加进去,用priority_queue 维护当前最值,用双向链表维护当前区间的状态,L[i]表示以i为端点的区间的区间左端点,R[i]表示以i为区间端点的右端点对于每个点 j, 当只R[i + 1] != 0 时, 右边有区间,可以把两个链表合并成一个, R[i] = R[i + 1], L[i] = i; 当只L[i - 1] != 0 时, 左边有区间,可以把两个链表合并成一个原创 2016-10-03 21:55:21 · 1037 阅读 · 0 评论 -
2016 UESTC Training for Data Structures K - 郭大侠与甲铁城 树状数组+离线操作
树状数组+离线操作先把查询去区间储存下来然后按做端点排序每次查询一个区间, 必须按照前面留下的lastRight到到这个区间的右端点扫一遍, 如果当中有一个value上次出现的位置不在这里, 则把前面的value从树状数组中去掉, 去掉的时候用add(last[value], -1), 并更新last[value]。 把答案放在ans[maxn]里全部处理完在按照查询出现的顺序输出ans[i] = get(R) - get(L - 1);原创 2016-05-01 00:03:17 · 1221 阅读 · 0 评论 -
2016 UESTC Training for Data Structures R - Japan 树状数组求逆序数
与2016 UESTC Training for Data Structures E - 卿学姐与城堡的墙 树状数组求逆序对、离散化 那题很相似,不过这里不计左右边界上的点又因为这里(1≤M≤10000, 1≤N≤10000) 所以不用离散化,所以直接对右边排序如果a.vy != b.vy 则 return a.vy < b.vy如果a.vy != b.vy 则 return a.uy < b.vy uy小的往上拉,大的往下拉,这样在计算的时候就不会算到这个交点了原创 2016-05-01 00:04:37 · 1682 阅读 · 1 评论 -
2016 UESTC Training for Data Structures Q - 昊昊爱运动 II 线段树+延迟操作+bitset
每次把一个区间变为一个定值线段树+延迟操作+bitset延迟操作,在查询或者改造的时候再向下传并标记好先用memset全部标记为false表示值没有传下去;在建树的时候就要一次把标记改为true了然后改造的时候重新标记为false, 向下传的时候把false改为true,然后false也传下去;返回的时候维护 另外每个节点用bitset维护,push_up的时候 Top[Ind]=Top[Ind<<1] | Top[(Ind<<1)+1]; //这样自然就把原来的Top[Ind]去掉原创 2016-05-01 00:04:22 · 1707 阅读 · 0 评论 -
2016 UESTC Training for Data Structures O - 卿学姐种美丽的花 树状数组+等差数列
树状数组+等差数列更的时候 Ax = A0 + (x-x0)*(-1)所以Ax求和并加上初始值就是新的val[x]了,这个最后加上初始值直接输出就行sum(Ax) = sum(A0+x0) - sum(x更新的次数)然后A0 + x0用一个树状数组维护,在更新点add(x0, A0+x0); 并在更新结尾的地方 add(x0+y0, -(x0+y0)),这样用树状数组地方get()的时候就不会对后面没有更新到的地方有影响了用另一个数组维护x出现的次数,在更新点add(x0, 1); 并在更新结尾原创 2016-05-01 00:04:00 · 1610 阅读 · 0 评论 -
UESTC 1600 艾尔大停电 线段树+扫描线、矩形面积并、浮点数的离散化
题意:在一个二维平面上给出n个矩形,求这些矩形的总覆盖面积。线段树+扫描线、矩形面积并、浮点数的离散化线段树+扫描线的经典例题,这里就不重复描述了。请注意浮点数的离散化,用unique会有一定的误差,所以建议用最朴素的方法进行离散化。线段树每个节点维护的是一个区间[x, x+1]而不是一个区间端点。复杂度 O(nlogn)原创 2017-05-16 19:42:27 · 2055 阅读 · 0 评论