数据结构
克莉丝汀娜
此时一名自称平民的玩家路过
展开
-
hdu 5172 GTY's gay friends (区间最值)
GTY 有n个朋友站成一排,每个朋友有一个值a[i](1 先判断区间[L,R]内的和是否等于1~R-L+1全排列的和,用前缀和实现。.若相等,由于数值可能会有相等的,所以还需要对区间内元素进行判重。 如何进行判重呢?用pre[i]记录数a[i]上一次出现的位置,然后对于区间[L,R]内的每一个数判断其pre是否都小于L。这里用线段树查询区间内pre的最大值,看其是否小于L即可。原创 2015-03-14 15:16:21 · 447 阅读 · 0 评论 -
hdu 5437 Alisha’s Party (优先队列)
题目大意:n个客人,k次开门:每次已到达人数为t[i]时开门,让q[i]个人进入(礼物价值高的优先进入,相同则先到达的优先),k次之后,若还有剩下的客人,则再开一次门,按规则全部进入。q次询问:第q[i]个进入的客人姓名。 1、将k次开门按照人数从低到高排一下序。 2、按照先后到达次序,依次将客人放入队列中,队列中的元素满足:价值高的靠前、价值相同的先到达的靠前。 3、每当队列中原创 2015-09-15 15:27:43 · 366 阅读 · 0 评论 -
hdu 5441 Travel(离线+并查集)
给一个无向带权图,再给出q个询问x,统计图中满足下面条件的点对个数:(a,b)和(b,a)为不同点对 1、存在a到b路径。 2、路径上边权均不超过x 比较容易想到下面的解法: 1、将q个询问从小到大排序。 2、依次访问每个询问x,每次将边权值不超过x的边的两个顶点进行合并。 3、统计每一个合并后的块中顶点个数num,结果累加num*(num-1) 但是这样做会原创 2015-09-13 20:20:43 · 643 阅读 · 2 评论 -
sdut 2880 Devour Magic
打错一个变量,调了一个晚上。。。。给跪了。 题目大意:一条线上有n个单元,每个单元含有一定数量的mana,初始值为0,每经过一个时刻,每个单元的mana会增加1。 现有m次操作(按时间顺序给出),每次给出t,l,r,表示在t时刻取走区间[l,r]内的所有mana。 问最终能获得多少mana。 分析:典型的成段更新,区间查询问题。 使用线段树维护区间和。更新时,使用两个标记原创 2015-05-08 20:32:55 · 411 阅读 · 0 评论 -
spoj 375 Query on a tree
题目传送门 题目大意:给一个n个结点的树以及它的n-1条边,两个操作:1、更改其中的边权。2、询问结点a到b的路径中最大的边权值 #include #include #include using namespace std; #define maxn 10005 #define lson i<<1,l,m #define rson i<<1|1,m+1,r struct Edge {原创 2015-03-15 20:14:21 · 300 阅读 · 0 评论 -
链式前向星
我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了. 用len[i]来记录所有以i为起点的边在数组中的存储长度. 用head[i]记录以i为边集在数组中的第一个存储位置. 那么对于下图:转载 2015-03-15 15:06:32 · 398 阅读 · 0 评论 -
hdu 3966 Aragorn's Story
树链剖分的入门题。 题目大意:n个结点的树,每个结点有一个值。两种操作:1、将结点a-b路径上的结点值都加上或减去一个值。 2、询问结点a的值。 建树之后,将树状数组初始化为0,假设每个结点的值也都为0。然后进行更新。 设结点i建树之后的序号为id[i],初始值为A[i],则在id[i]位置增加A[i],在id[i]+1的位置减少A[i],这样在询问结点的值时,只需用树状数组的求一下前原创 2015-03-17 21:49:03 · 447 阅读 · 0 评论 -
hdu 1754 I Hate It (单点更新,区间最值)
#include #include #include #include using namespace std; #define lson i<<1,l,m #define rson i<<1|1,m+1,r #define maxn 200005 int Max[maxn<<2]; void PushUp(int i) { Max[i]=max(Max[i<<1],Max[i<<1|1]原创 2015-03-14 10:54:12 · 382 阅读 · 0 评论 -
hdu 1166 敌兵布阵 (单点更新,区间求和)
复习线段树。 线段树(Segment Tree)是一种二叉搜索树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 对于线段树中的每一个非叶子节点[a,b],它的左子树表示的区间为[a,(a+b)/2],右子树表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树。叶节点数目为N,即整个线段区间的长度。 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数原创 2015-03-14 10:34:22 · 372 阅读 · 0 评论 -
hdu 1496 Equations (整数Hash)
给定a、b、c、d,问a*x1^2+b*x2^2+c*x3^2+d*x4^2=0的在[-100,100]上非0解的个数 直接枚举会超时。 将等式变换一下:a*x1^2+b*x2^2=-(c*x3^2+d*x4^2) 预先枚举x1,x2,计算等式左边可能出现的值,然后枚举x3,x4,计算等式右边的值,看之前是否出现过该值,结果累加该值出现次数即可。 由于值可能为负数,需要处理原创 2015-11-28 17:49:38 · 513 阅读 · 0 评论