
数据结构
文章平均质量分 54
zz_ylolita
这个作者很懒,什么都没留下…
展开
-
用树状数组求区间最值
注意bit数组存放的是一个区间的最值。更新最值的时候要传递更新。查找的时候也要注意。如果已经不是在一个区间段上了,应该和num[]比。原创 2014-08-08 23:52:31 · 2073 阅读 · 0 评论 -
poj2182
题目大意:有n头牛,给出从第二头牛开始每头牛前面有多少头牛编号比自己小。求牛的编号。分析:每次最后一头牛的编号为当前可用编号中排在第a[i]+1的数。-------->线段树 O(nlogn)维护一个区间内还有多少个数可以用(因为要求可以用的第k个数)。#include #include #include #include using namespace std;st原创 2015-09-01 23:30:57 · 1259 阅读 · 0 评论 -
uva11992区间修改线段树
数据范围很大,但是可以每行建一个线段树,化为线性的set的优先级高于addpushdown的时候相当于在add和sett中对一个整个的区间进行“赋值”一样,所以还要加上改sum,min1,max1的部分三个询问可以一起做。。。#include #include #include #include #include using namespace std;#define原创 2015-08-22 03:55:58 · 478 阅读 · 0 评论 -
树链剖分
http://www.cnblogs.com/kuangbin/archive/2013/08/12/3253734.htmlhttp://www.cnblogs.com/kuangbin/p/3253741.html原创 2015-12-30 00:03:53 · 381 阅读 · 0 评论 -
CF620E - New Year Tree
题目大意:给一颗树,根节点为1,每个节点都有颜色(对子树操作,dfs序+线段树 (对树上的链操作用树链剖分)表示颜色(col两个区间颜色数的合并为 or ,总颜色统计为二进制上出现的1的个数#include #include #include #include using namespace std;#define MAXN 400100#define LL long原创 2016-01-22 22:56:35 · 719 阅读 · 0 评论 -
bzoj1588[HNOI2002]营业额统计
好裸的题,好坑的数据= =详见讨论版#include #include #include #include using namespace std;#define MAXN 500010#define INF 0x7fffffffstruct node{ int ch[2],f,v;}tr[MAXN];int a,tmp,x1,x2,ans;int n,root,t原创 2016-02-03 12:42:51 · 1081 阅读 · 0 评论 -
bzoj3223: Tyvj 1729 文艺平衡树
splay的经典操作:翻转区间-->交换左右子树,注意打标记降低翻转次数如何找到要操作的区间[l,r]:将当前排名(size)为l-1 +1 的节点转到根,将当前排名为r+2的节点转到根的右子树的根节点,则根的右子树的根节点的左子树为所求区间,直接打标记就可以了。注意1.标记是在每一次访问到一个新的节点是就要pushdown的2.区分一个节点的排名和这个节点的值:这个节点的排名是它原创 2016-02-03 19:01:53 · 2597 阅读 · 0 评论 -
bzoj1036-树链剖分模板
剖分后的树有如下性质: 性质1:如果(v,u)为轻边,则siz[u] * 2 性质2:从根到某一点的路径上轻链、重链的个数都不大于logn。总之两个dfsdfs1(int x,int f) //f是x的父亲枚举和x相邻的点的时候注意不等于f 才可以递归 要维护的东西: dep[x] x节点深度 siz[x] 以x节点为根原创 2016-03-18 23:39:11 · 1384 阅读 · 0 评论 -
bzoj1500: [NOI2005]维修数列
splay鼻祖级的题目??(雾。。Insert:把第pos个数(有哨兵节点)转到root,把第pos+1个数转到root的右儿子,然后对c[]建树然后把这棵树插到root右儿子的左儿子处Delete:把第pos个数转到root,把第pos+tot+1个数转到root右儿子,删掉root右儿子的左儿子(变成0);注意回收空间,所以还要把这棵子树遍历一边。Make-Same:像上面原创 2016-02-04 18:32:48 · 573 阅读 · 0 评论 -
poj2182 Lost Cow
根据题目给出的数列的性质,每次可以求出最后一头牛的编号也就是在当前有的数列1 2 3 .... n 中找到第a[i]+1小的数可以用树状数组或者线段树,记录的是已经删除了的数的个数还有的数的个数为 区间长度-区间记录的数字这个是单调的(不严格),所以可以用二分查找优化然后更新一下就可以了#include #include #include #inclu原创 2016-07-21 14:36:35 · 589 阅读 · 0 评论 -
单调栈
傻逼zzy...poj2796注意一下最后答案可能是0,所以res的初始值要赋为-1#include <iostream>#include <cstdio>using namespace std;int n,top;long long res;int ans;long long s[100005], a[100005];int L[100005]...原创 2018-08-24 19:52:28 · 191 阅读 · 0 评论 -
hdu6430 Problem E. TeaTree 权值线段树 合并 暴力
新学到的权值线段树和它的合并,数组版的动态开点,以及如何估算线段树数组要开多大敲开心~应该还要学怎么分裂。。。关于权值线段树的讲解看这里:https://www.cnblogs.com/Mychael/p/8665589.htmlhttps://blog.youkuaiyun.com/Stupid_Turtle/article/details/80445998不过这题也可以直接bitset...原创 2018-08-30 00:26:39 · 371 阅读 · 0 评论 -
bzoj1293【SCOI2009】生日礼物
想了很久都没有想到。。。看了hzw的题解恍然大悟居然只是枚举起始位置,然后要取这个位置之前(之后)与它最近的k种珠子的位置的最大值作为这一个起始位置的答案,最后这些答案取min找最近的珠子:因为题目中已知Ti的珠子位置按升序排序,所以用静态链表把每一种珠子存起来,这样是尾插法,遍历的时候从大到小。同时为了方便,也需要将所有坐标排序,和遍历的顺序一样从大到小枚举起始位置,这样找之前最近比较方原创 2015-08-24 22:09:14 · 1138 阅读 · 0 评论 -
lca倍增算法
HDU2586要注意只有简单边相连的图是一棵树,树有n-1条边原创 2014-08-17 23:22:40 · 3203 阅读 · 0 评论 -
vijos P1790拓扑编号
描述H国有n个城市,城市与城市之间有m条单向道路,满足任何城市不能通过某条路径回到自己。现在国王想给城市重新编号,令第i个城市的新的编号为a[i],满足所有城市的新的编号都互不相同,并且编号为[1,n]之间的整数。国王认为一个编号方案是优美的当且仅当对于任意的两个城市i,j,如果i能够到达j,那么a[i]应当优美的编号方案有很多种,国王希望使1号城市的编号尽可能小,在此前提原创 2014-10-26 22:46:49 · 1141 阅读 · 0 评论 -
tarjan求lca
program lcastat;var ans,ans1:int64; w:array[1..10000000]of longint; father,head:array[1..10000000]of longint; i,n,p,l:longint; vis:array[1..10000000]of boolean; edge:array[1..1000原创 2014-10-04 21:56:05 · 602 阅读 · 0 评论 -
线段树
使用线段树的做法:给线段树每个节点增加一个域cover。cover=1表示该结点所对应的区间被完全覆盖,cover=0表示该结点所对应的区间未被完全覆盖。如下图的线段树,添加线段[1,2][3,5][4,6]原创 2014-12-12 17:05:43 · 396 阅读 · 0 评论 -
vijosp1697平面几何——带权并查集
一、一些概念 xor:亦或,相同为0,不同为1 or:或,有一个为1则为1 本题中用0代表平行,1代表垂直 way[i]表示i与i的father[i]是垂直还是平行(值为0或1) 题目中读入的平行垂直关系和way[]表示的都是两个直线之间的平行垂直关系,因此都用xor运算 二、并查集的程序段 1、找父亲 function getfather(x:longint):longint;原创 2015-03-01 17:22:07 · 576 阅读 · 0 评论 -
vijos1112小胖的奇偶(并查集,区间转两端线段)
program xiaopang;const maxn=65533;//maxn最好大一点,65533可以var father,hash:array[1..maxn shl 2]of longint; ch:char; l,i,x,y,n,ans:longint;label 1;function h(x:longint):longint; //hash,需要学习!注意数组也要原创 2015-03-04 23:07:06 · 942 阅读 · 0 评论 -
二维树状数组
//二维树状数组//即行lowbit,列lowbitvar c:array[0..1030,0..1030]of longint; n,m,x,y,k,x1,y1,x2,y2:longint;function lowbit(x:longint):longint;begin lowbit:=x and(-x);end;procedure modify(x,y,delta:long原创 2015-03-25 16:37:49 · 372 阅读 · 0 评论 -
线段树
hdu3308//线段树,求区间最长上升连续序列长度,有更新program tt;type point=record l,r,lmax,rmax,max:longint; end;var tree:array[1..400000]of point; n,m,t1,a2,b,l,i:longint; a:array[0..100000]of longint;原创 2015-03-25 16:51:27 · 445 阅读 · 0 评论 -
splay__poj3580
这真是很让人难过的一道题。。。。。但是我要硬着头皮写完splay TwT题目要求实现一种数据结构,支持6种操作: add x,y D:第x个数到第y个数之间的数每个加D; reverse x y:第x个数到第y个数之间全部数翻转; revolve x y T:第x个数到第y个数之间的数,向后循环流动T次,即后面T个数变成这段子序列的最前面T个,前面的被挤到后面。 Insert x P:在第x原创 2015-04-04 20:49:08 · 805 阅读 · 0 评论 -
线段树的标记lazy_tag
1.当同时需要维护乘法和加法时,乘法优先级高于加法,并且每次传乘法标记时,要把加法标记同时乘上乘法标记。 2.在查找(find)的时候标记下传原创 2015-04-05 15:24:35 · 1245 阅读 · 0 评论 -
bzoj1798 AHOI2009seq
双标记线段树因为乘除有优先级关系,所以每访问到一个节点就把这个节点的标记往下传。pushdown中退出的条件是该点为叶子节点(p*2+1>tot)但是要注意tot的计算,是在build中节点编号最大的那个为tot(因此WA了好几次。。)program seq;type point=record l,r,sum,mul,add:int64;//tag end;原创 2015-05-14 19:44:07 · 1217 阅读 · 1 评论 -
hdu5992 Finding Hotels ——KDtree
每一个点有三个属性:(x,y,c)每次查询要在log的时间内完成,查找距离(x,y)点最近的已知点,并且已知点的花费c要小于等于给定的一个数。一开始想,如果直接用二维的kdtree来做,直接在query找的时候忽略花费>c的点不就好了,但是发现这样不满足kdtree BST的性质,是没有办法往下走的。那就得考虑把c也作为一维坐标,所以应该是三维kdtree.可以手动定义如果花费大...原创 2018-10-31 00:58:46 · 299 阅读 · 0 评论