
字典树-线段树-划分树
文章平均质量分 79
菜鸟起航
这个作者很懒,什么都没留下…
展开
-
hdu 4287 Intelligent IME
简单字典树#include#include#includechar s[5100][10];struct tree{ struct tree *next[10]; int num;//记录以此节点结尾的字符串的个数}*root;void insert(char str[])//建字典树{ int len=strlen(str); tree原创 2013-04-11 12:02:10 · 562 阅读 · 0 评论 -
hdu 4122 (线段树)
题意:月饼商店从2000年1月1日0时开始开m个小时,只能在整点的时候才能做月饼,给出每个时间点做一个月饼的费用,做月饼的时间不计,有n个订单,取货的日期和数量,商店有冷藏库,容量无限大,月饼的冷藏时间有限,冷藏是要花钱的,求出这n个订单总共最少得花多少钱。思路:对于每个订单ti都是在ti-t—ti时间段内找出做月饼花费最小时间点,可以先求出任意时间点做月饼满足最后一个订单的费用(不考虑冷藏时原创 2013-10-29 19:31:29 · 1045 阅读 · 0 评论 -
hdu 3804(树链剖分+线段树)
题意:给出一棵树,Q个询问x,w,x到1的路径上不超过w的最长边是多少。思路:题目读完了就知道用熟练剖分处理,然后可以用线段树求,线段树学的不是很好,就问了lyf怎么处理数据,他说把所有的询问按照权值的大小排序,边的大小也按权值排序,然后对每个询问把小于等于该权值的边加到树上就可以了。#pragma comment(linker, "/S原创 2013-10-25 18:30:11 · 1052 阅读 · 0 评论 -
poj 3237(树链剖分+线段树)
题意:给一棵树,三种操作。将第i条边的权值改为v,将a到b的路径上的边的权值全部取反,求a到b路径上边的权值的最大值。思路:明显的树链剖分,加上线段树的操作。因为有取反的操作所以每个区间要记录最大值和最小值。查询两点间的路径时,用求公共祖先的方式去求。#include#include#includeconst int N=101000;const原创 2013-10-13 19:27:45 · 1040 阅读 · 0 评论 -
hdu 3966 (树链剖分+线段树)
题意:给出一棵树,每个节点有一些敌人,有三种操作,I:x,y,路径上的所有点的人数+w。D:x,y,路径上的所有点的人数-w。Q:节点x的人数。思路:如果是线性的线段树可以做,所以要树链剖分,剖分后的每条链是线性的,更改区间时用找公共祖先的方式,将两点找到同一条链上,同一条链上的两点间可以直接线段树更改。#pragma comment(linke原创 2013-10-09 16:09:01 · 1575 阅读 · 2 评论 -
hud 4718 The LCIS on the Tree(树链剖分+线段树区间合并)
题意:给出一棵树,有Q个询问,x到y之间的路径所有边组成的序列,求该序列的LCIS。思路:hdu 3308的加强版。先进行树链剖分,树链剖分后建线段树,树链剖分后一条链上的点在线段树中编号是连续的,所以只能在线段树上查询一条链上的区间信息,所给的点肯定不全是在一条链上的,所以我们求出的是一些区间,而这些区间还要合并起来求最大LCIS,在树上操作的时候是从度数大的点向上求的,有一条路径求的是下降原创 2013-10-09 12:07:34 · 1382 阅读 · 0 评论 -
hdu 2846
字典树的变形,常规字典树用来求前缀的,所以把每个单词拆成len个词建树,为了避免abab这样的查ab时会出现两次,每次加一个标记,如果该节点上次的建树的单词与本次相同就不更新,否则更新#include#include#includestruct tree{ struct tree *son[26]; int count; int flag;}*root;原创 2013-07-27 15:12:28 · 874 阅读 · 0 评论 -
hdu 1754
简单线段树#include#define N 200002int start,end,a[N];struct tree{ int left,right,maxnum;}p[N*3];int max(int a,int b){ if(a>b)return a; return b;}void insert(int l,int r,i原创 2013-05-13 14:05:37 · 825 阅读 · 0 评论 -
hdu 1556
线段树,求被多少个区间覆盖#include#includestruct tree{ int left,right,count;}p[300100];void build(int l,int r,int k){ int mind=(l+r)/2; p[k].left=l; p[k].right=r; p[k].count=0; if(l==原创 2013-05-10 14:07:43 · 759 阅读 · 0 评论 -
hdu 4217
线段树模板题 #include#include#include#define N 263000struct tree{ int left,right,count;}p[N*3];void build(int l,int r,int num){ int mid=(l+r)/2; p[num].left=l; p[num].right原创 2013-05-08 22:17:37 · 765 阅读 · 0 评论 -
poj 2503
字典树模板题目 #include#include#includestruct tree{ struct tree *son[26]; int count; char str[20];}*root;void insert(char *p,char s[]){ int i,k,j; tree *cur=root,*next原创 2013-05-08 08:12:33 · 733 阅读 · 0 评论 -
hdu 1166 敌兵布阵
线段树简单题 #include#define N 50005int a[N],n,c,cnt;struct op{ int left,right,cont;}p[N*3];void insert(int l,int r,int i){ p[i].left=l;p[i].right=r; if(l==r) { p[i].cont=原创 2013-04-18 18:09:42 · 519 阅读 · 0 评论 -
hdu 4791 长沙现场赛A题
题意:打印纸张,随着张数的增加,价格会降低,给出m个询问打印的张数,求最小的花费。思路:找到张数所在的区间,最大的花费就是该区间的价格*张数,如果要打印多余的张数,就在后面的区间找,因为后边的区间都是张数大于目标张数,所以去区间的最小值,应为价格是递减的,张数是递增的,所以要找区间的张数*价格的最小值,用线段树就可以。。。#include#includeconst in原创 2013-12-02 07:38:21 · 1634 阅读 · 0 评论