
-数据结构
文章平均质量分 84
virgoDd
Good afternoon,good evening and good night
展开
-
POJ 2991 Crane(线段树·向量旋转)
题意 有一个Crane由n条线段连接组成 每个连接点处均可以任意旋转 给你n条线段的长度 然后又m次旋转操作 给你p和r 将第p和第p+1条线段之间的角度旋转为r 即第p条线段绕p的终点逆时针旋转r度后能够与第p+1条重合 问每次旋转后最后一条线段的终点坐标可以发现 旋转第p+1条线段时 p+1后面的所有线段也一起旋转了 可以把Crane分解为n个向量 这些向量原创 2015-08-16 15:16:48 · 1000 阅读 · 0 评论 -
XTU1238 Segment Tree (线段树·区间最值更新)
题意 对一个数组有四种操作1: 将区间[ l, r] 中的所有值都加上c2:将区间 [l, r] 中所有比c大的值改为c3:将区间 [l, r] 中所有比c小的值改为c4:输出区间 [l, r] 中所有数的最小值和最大值对每个操作4输出对应最小值和最大值基础的线段树 在湘潭卡了好久没写出来 线段树维护三个值 区间最大值 maxv, 区间最小值minv, 区间增加的值add 操作1是原创 2015-07-05 10:18:01 · 1174 阅读 · 2 评论 -
UVa 514 Rails(栈)
Rails There is a famous railway station in PopPush City. Country there is incredibly hilly. The station was built in last century. Unfortunately, funds were extremely limited that time.原创 2014-09-02 09:50:30 · 668 阅读 · 0 评论 -
HDU 4006 The kth great number(优先队列·第K大数)
题意 动态查询第K大的数用小数在前优先队列维护K个数 每要插入一个数时 若这个数小于队首元素那么就不用插入了 否则队首元素出队 这个数入队 每次询问只用输出队首元素就行了#include#includeusing namespace std;int main(){ int n, a, k; char op[5]; while(~scanf("%d%原创 2015-04-14 13:05:56 · 1324 阅读 · 0 评论 -
HDU 1166 敌兵布阵 (树状数组·线段树)
题意 中文动态区间和问题 只会更新点 最基础的树状数组 线段树的应用树状数组代码#include using namespace std;const int N = 50005;int c[N], n, m;void add(int p, int x){ while(p <= n) c[p] += x, p += p & -p;}int原创 2015-04-14 12:54:32 · 826 阅读 · 0 评论 -
HDU 4027 Can you answer these queries?(线段树 区间不等更新)
题意 输入n个数 然后有两种操作 输入0时将给定区间所有数都变为自己的开方 输入1输出给定区间所有数的和虽然是区间更新 但每个点更新的不一样 因此只能对单点进行更新 其实一个点最多被更新7次 2^64开平方7次后就变为1了 如果某个区间的数都变为了1 那么对这个区间的开方就不用考虑了 另外要注意给你的区间可能是反的#include #define lc p<<原创 2015-04-19 09:34:08 · 1725 阅读 · 0 评论 -
HDU 3974 Assign the task(树 并查集)
题意 公司中有n个员工 除了boss 每个员工都有自己的上司 自己下属的下属也是自己的下属 当给一个员工分配任务时 这个员工会把任务也分配到自己的所有下属 每个员工都只做最后一个被分配的任务 对于每个C x 输出员工x正在做的任务 没有就输出-1把员工的关系数建成类似并查集的结构 把每个直接分配任务的员工的任务和任务分配时间保存起来 查询时只要找这个员工所有父节点中最原创 2015-04-22 21:48:27 · 1422 阅读 · 0 评论 -
HDU 1540 Tunnel Warfare(线段树 区间合并 最大连续区间)
题意 有n个连在一起的地道 接下来有m个操作 D x 炸掉x号地道 炸掉后x所在的区间就不连续了 Q x 查询输出包括x的最大连续区间长度 R修复最后一个被炸的地道 注意输入R时可能并没有需要修复的地道线段树的区间合并问题 线段树要维护3个信息 len 对应区间的最大连续长度 ll 对应区间最左端的一段连续长度lr 对应区间最右端的一段连续原创 2015-04-22 14:25:48 · 1232 阅读 · 1 评论 -
POJ 2528 Mayor's posters(离散化 线段树 贴海报)
题意 在墙上贴n张海报 输入每张海报的的左右端点坐标 问最后可以看到多少张海报 能看到一点也是能看到先把线段树初始化为0 输入一张海报 就把那个区间变成这张海报的序号 最后判断墙上有多少个不同的序号就行了但是海报坐标的端点值高达10000000 直接用线段树会超时 但是注意到海报最多只有10000张 也就是最多有20000个不同的坐标 于是可以利用离散化的知识 把原创 2015-04-18 19:06:56 · 2067 阅读 · 0 评论 -
Codeforces 527C Glass Carving(Set)
题意 一块w*h的玻璃 对其进行n次切割 每次切割都是垂直或者水平的 输出每次切割后最大单块玻璃的面积用两个set存储每次切割的位置 就可以比较方便的把每次切割产生和消失的长宽存下来 每次切割后剩下的最大长宽的积就是答案了#include using namespace std;const int N = 200005;typedef long long LL;set原创 2015-03-18 23:26:44 · 1389 阅读 · 0 评论 -
hiho一下 37 (无序二分·k小数)
题意 中文可以先排序然后输出第k个 复杂度为O(N*logN) 但有更快的方法 其实二分时只要能保证mid左边的数都比mid小 mid右边的数都比mid大就能进行划分了 对于k不在的区间就不用管了 于是可以用到快排的思想#include using namespace std;const int N = 1000005;int a[N];int main(){原创 2015-03-16 12:49:06 · 1348 阅读 · 0 评论 -
UVa 536 Tree Recovery(先序,中序求后序)
题意 给你二叉树的先序序列和中序序列 求它的后序序列先序序列的第一个一定是根 中序序列根左边的都属于根的左子树 右边的都属于右子树 递归建树就行了#include using namespace std;typedef struct TNode{ char data; TNode *lc, *rc;} node, *BTree;void build(B原创 2015-01-23 20:25:47 · 924 阅读 · 0 评论 -
POJ 2828 Buy Tickets(线段树·插队)
题意 n个人排队 每个人都有个属性值 依次输入n个pos[i] val[i] 表示第i个人直接插到当前第pos[i]个人后面 他的属性值为val[i] 要求最后依次输出队中各个人的属性值从头到尾看的话 队列是动态的 无法操作 但是反过来看时 pos[i]就可以表示第i个人前面还有多少个人了 然后想到了用线段树做就简单了 线段树维护对应区间还有多少个空位 每次把i放原创 2015-07-13 12:25:10 · 781 阅读 · 0 评论 -
POJ 2886 Who Gets the Most Candies?(线段树·约瑟夫环)
题意 n个人顺时针围成一圈玩约瑟夫游戏 每个人手上有一个数val[i] 开始第k个人出队 若val[k] 0 时向左数val[k]个 第m出队的人可以得到m的约数个数个糖果 问得到最多糖果的人是谁约瑟夫环问题 n比较大 直接模拟会超时 通过线段树可以让每次出队在O(logN)时间内完成 类似上一道插队的题 线段树维护对应区间还有多少个人没出队 那么当我们知道出队的人原创 2015-07-13 20:23:47 · 1151 阅读 · 0 评论 -
HDU 2871 Memory Control(线段树·区间合并·Vector)
题意 模拟内存申请 有n个内存单元 有以下4种操作 Reset 将n个内存单元全部清空 New x 申请一个长度为x的连续内存块 申请成功就输出左端 Free x 将x所在的内存块空间释放 释放成功输出释放的内存始末位置 Get x 输出第x个内存块的起始位置Reset 和 New 都是基本的区间合并知识 比较简单 Free和Get需要知道内层块的原创 2015-08-16 21:32:22 · 920 阅读 · 0 评论 -
HDU 3265 Posters(线段树扫描线·矩形框面积并)
题意 把一些矩形海报挖去一部分小矩形贴在指定位置 问最后海报覆盖的面积一个矩形框可以分割成4个独立的小矩形 然后就能用扫描线求面积并了#include #include using namespace std;const int N = 100005, M = N << 2;typedef long long ll;struct SLine{ int x, y1原创 2015-08-15 17:56:37 · 881 阅读 · 0 评论 -
HDU 1828 Picture(线段树扫描线·周长并)
题意 给你一些矩形的左下和右上的坐标 求这些矩形的周长并也先来看点图 和面积并类似 求周长并也可以对每条竖边从左往右进行扫描 每次周长增加了多少呢 可以发现y方向上对周长增加的量就是扫描线上线段的总长度的改变量 x方向增加了线段段数 * 2 倍的与下一条竖边间的距离 因为每一段都会对应两个横边那么我们需要维护线段的总长度len和线段的段数num len和原创 2015-08-14 14:04:24 · 1483 阅读 · 0 评论 -
HDU 3634 City Planning (离散化)
题意 给你n个矩形 每个矩形都有自己的value 你可以任意改变矩形的表里关系 被覆盖的地方的value取最表层的 求总value的最大值刚看了扫描线 感觉这个可以用扫描线做就直接写了 其实直接离散化就行了 因为最多也就20个矩形 那坐标最多也就40个 那我们对坐标进行离散化 然后将矩形按value从小到大一个个的放 暴力更新覆盖格子的value 最后直接将2n原创 2015-08-14 09:32:37 · 945 阅读 · 0 评论 -
HDU 1542 Atlantis(线段树扫描线·面积并)
题意 给你一些矩形的左下和右上的坐标 求这些矩形的面积并最基础的扫描线 理解了就是个水题了 先看一些图吧 恩 看完了有什么感觉没有 那些红色的线就可以当作传说中的扫描线 就像从左到右扫描嘛 可以发现 矩形有竖直边的地方就有这些线 这些线把把拼在一起的矩形切原创 2015-08-12 21:10:56 · 1071 阅读 · 0 评论 -
POJ 2299 Ultra-QuickSort(归并排序·树状数组·逆序对)
题意 给你一个数组求其中逆序对(ia[j])的个数 我们来看一个归并排序的过程:给定的数组为[2, 4, 5, 3, 1],二分后的数组分别为[2, 4, 5], [1, 3],假设我们已经完成了子过程,现在进行到该数组的“并”操作:a: [2, 4, 5]b: [1, 3]result:[1]选取b数组的1原创 2015-04-10 20:27:30 · 802 阅读 · 0 评论 -
HDU 3397 Sequence operation(线段树·成段更新·区间合并·混合操作)
题意 给你一个只有0, 1的数组 有这些操作 0. 将[a, b]区间的所有数都改为0 1. 将[a, b]区间的所有数都改为1 2. 将[a, b]区间的所有数都取反 即与1异或 3. 输出区间[a, b]中1的个数 即所有数的和 4. 输出区间[a, b]中最大连续1的长度对于所有的3, 4操作输出对应的答案单个的操作都很简单 但搞在一起就原创 2015-08-12 10:12:46 · 910 阅读 · 0 评论 -
HDU 3308 LCIS (线段树·单点更新·区间合并)
题意 给你一个数组 有更新值和查询两种操作 对于每次查询 输出对应区间的最长连续递增子序列的长度基础的线段树区间合并 线段树维护三个值 对应区间的LCIS长度(lcis) 对应区间以左端点为起点的LCIS长度(lle) 对应区间以右端点为终点的LCIS长度(lri) 然后用val存储数组对应位置的值 当val[mid + 1] > val[mid] 的时候就要进行区间合并操原创 2015-08-11 09:01:24 · 1267 阅读 · 0 评论 -
ZOJ 3447 Doraemon's Number Game(Java优先队列·BigInteger)
题意 给你一个数组 你每次可以从中删掉2到k个数 然后把删掉的数的积加入到原数组 直到最后只剩一个数 求这样能得到的最大值和最小值的差每次选的数值越小 选的数量越少 最后得到的结果肯定越大 因为这样大的数可以乘以最大的倍数 运算的次数也是最多从而使+1的次数最多 这显然是有利于最后结果的增大的同理 每次选的数越大 选的数越多 最后得到的结果越小这样最大值就是原创 2015-07-29 20:40:22 · 1037 阅读 · 0 评论 -
POJ 1436 Horizontally Visible Segments (线段树·区间染色)
题意 在坐标系中有n条平行于y轴的线段 当一条线段与另一条线段之间可以连一条平行与x轴的线不与其它线段相交 就视为它们是可见的 问有多少组三条线段两两相互可见先把所有线段存下来 并按x坐标排序 线段树记录对应区间从右往左当前可见的线段编号(1...n) 超过一条就为0 然后从左往右对每条线段 先查询左边哪些线段和它是可见的 把可见关系存到数组中 然后把这条线段对应区间的原创 2015-07-15 15:58:17 · 823 阅读 · 0 评论 -
POJ 2823 Sliding Window(单调队列)
题意 长度为n的数组上有个长度为k的滑窗从左向右移动 求每次移动后滑窗区间的最小值和最大值 输出两行 第一行所有最小值 第二行所有最大值可以用线段树来做 但是单调队列更简单 单调递增队列: 队尾单调入队(入队元素大于队尾元素时直接入队 否则队尾出队直到队尾元素小于入队元素或者队列为空) 队首队尾都可以出队求最小值时 先判断队首元素是否在滑窗之内 不在队首就出队 然后原创 2015-07-06 12:28:21 · 2683 阅读 · 0 评论 -
UVa 439 Knight Moves(BFS应用)
题意 求国际象棋中骑士从一个位置移东到另一个位置所需最少步数基础的BFS应用#include using namespace std;int x[] = { -2, -1, -2, -1, 1, 2, 1, 2};int y[] = { -1, -2, 1, 2, -2, -1, 2, 1};int d[15][15], sx, sy, ex, ey;pair q[105],原创 2015-01-23 18:20:47 · 854 阅读 · 0 评论 -
UVa 673 Parentheses Balance(括号配对 栈)
题意 判断输入的括号序列是否是配对的栈的基础应用 栈顶元素与输入的字符匹配就出栈咯 注意括号序列可以为空STL栈#include using namespace std;int main(){ int cas; char c; cin >> cas; getchar(); while(cas--) { stac原创 2015-01-23 16:54:03 · 1129 阅读 · 0 评论 -
HDU 1081 To The Max(DP)
题意 求一个n*n矩阵的最大子矩阵和HDU 1003 max sum 的升级版 把二维简化为一维就可以用1003的方法去做了 用mat[i][j]存 第i行前j个数的和 那么mat[k][j]-mat[k][i]就表示第k行 第i+1个数到第j个数的和了 再将k从一枚举到n就可以得到这个这个宽度为j-i的最大矩阵和了 然后i,j又分别从1枚举到n就能得到结果了 和1原创 2014-09-02 09:51:57 · 577 阅读 · 0 评论 -
UVa 699 The Falling Leaves(递归建树)
题意 假设一棵二叉树也会落叶 而且叶子只会垂直下落 每个节点保存的值为那个节点上的叶子数 求所有叶子全部下落后 地面从左到右每堆有多少片叶子和上一题有点像 都是递归输入的 一个节点(设水平位置为p) 则它的左右儿子节点的水平位置分别为 p-1 p+1 也是可以边输入边处理的 输入完也就得到答案了 注意每个样例后面都有一个空行 包括最后一个#includ原创 2014-09-24 12:48:14 · 1596 阅读 · 0 评论 -
POJ 3282 Ferry Loading IV(模拟,队列)
题意 汽车通过渡船过河 渡船开始在左边 输入按车辆来的顺序输入河两岸的车 渡船每次运输的汽车的总长度不能超过渡船自己本身的长度 先来的车先走 求轮船至少跨河多少次才能将所有的车辆都运完简单模拟 建两个队列 分别装左边的车 和右边的车 算出两边各至少需要运输多少次就行了#include#include#includeusing namespace std;原创 2014-09-02 09:51:45 · 679 阅读 · 0 评论 -
UVa 839 Not so Mobile(树的递归输入)
题意 判断一个树状天平是否平衡 每个测试样例每行4个数 wl,dl,wr,dr 当wl*dl=wr*dr时 视为这个天平平衡 当wl或wr等于0是 下一行将是一个子天平 如果子天平平衡 wl为子天平的wl+wr 否则整个天平不平衡容易看出 输入是递归的 所以我们可以直接递归 边输入边判断#includeusing namespace std;bool so原创 2014-09-24 09:17:07 · 1590 阅读 · 0 评论 -
UVa 548 Tree(建树,递归遍历)
题意 给你一个树的中序遍历和后序遍历 某个节点的权值为从根节点到该节点所经过节点的和 求权值最小的叶节点的值 如果存在多个 输出值最小的那个把树建好就好说了 递归递归dfs msun保存最小叶节点权值 ans保存答案原创 2014-09-23 20:22:28 · 1388 阅读 · 0 评论 -
UVa 122 Trees on the level(建树,层次遍历)
题意 建树并层次遍历输出 (data,pos) pos表示改节点位置 L代表左儿子 R代表右儿子 建树很简单 开始在根节点 遇到L往左走遇到R往右走 节点不存在就新建 走完了就保存改节点的值 输出直接bfs就行了了 #include#include#includeusing namespace std;const int maxn = 300;char原创 2014-09-23 10:26:45 · 1202 阅读 · 0 评论 -
UVa 133 The Dole Queue
The Dole Queue In a serious attempt to downsize (reduce) the dole queue, The New National Green Labour Rhinoceros Party has decided on the following strategy. Every day all dole applican原创 2014-09-02 09:50:08 · 553 阅读 · 0 评论 -
UVa 11988 Broken Keyboard(链表的应用)
Broken Keyboard (a.k.a. Beiju Text)You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem with the keyboard is that sometimes the "home" key or the "en原创 2014-09-02 09:50:48 · 513 阅读 · 0 评论 -
UVa 156 Ananagrams(STL,map)
Ananagrams Most crossword puzzle fans are used to anagrams--groups of words with the same letters in different orders--for example OPTS, SPOT, STOP, POTS and POST. Some words however do原创 2014-09-02 09:50:32 · 520 阅读 · 0 评论 -
UVa 12657 Boxes in a Line(双向链表的应用)
Boxes in a LineYou have n boxes in a line on the table numbered 1 . . . n from left to right. Your task is to simulate 4kinds of commands:• 1 X Y : move box X to the left to Y (ignore this if X原创 2014-09-02 09:50:55 · 562 阅读 · 0 评论 -
UVa 679 Dropping Balls
Dropping Balls A number of K balls are dropped one by one from the root of a fully binary tree structure FBT. Each time the ball being dropped first visits a non-terminal node. It then k原创 2014-09-02 09:50:57 · 575 阅读 · 0 评论 -
POJ 3481 Double Queue(STL)
题意 模拟银行的排队系统 有三种操作 1-添加优先级为p 编号为k的人到队列 2-服务当前优先级最大的 3-服务当前优先级最小的 0-退出系统可以用stl中的map 因为map本身就根据key的值排了序 对应2,3 我们只需要输出最大或最小就行了并从map中删除该键值#include#includeusing namespace std;map a;in原创 2014-09-02 09:51:41 · 698 阅读 · 0 评论 -
UVa 514 Rails(模拟栈)
题意 n辆火车按顺序依次进站 判断给定的出战顺序是否可能用数组模拟模拟栈代表车站 车依次进站 每当栈顶火车序号与当前要出站的b[cur] 相等时 就让栈顶元素出栈 即top-- #include#includeusing namespace std;const int N = 2000;int b[N], c[N];int main(){ int l, cur原创 2014-09-16 15:20:58 · 1463 阅读 · 0 评论