![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 77
HouseFangFZC
oo
展开
-
Codeforces Round #310 (Div. 1) A B C D题
本题解包含题目:555ACase of Matryoshkas555BCase of Fugitive555CCase of Chocolate555DCase of a Top Secret原创 2015-07-10 09:55:06 · 984 阅读 · 0 评论 -
HDU 5033 Building
题意:地面上有n座楼 你分别站在m个位置上 问每个位置上能看见多大角度的天空思路:很明显能想到在站的位置两边维持单调性 因此我们可以将站位和楼的位置排序 从左到右维护一遍 再从右到左维护一遍 这里可以利用单调栈 对于新扫描到的位置 如果是楼 那么栈中比它矮的楼就没用了可以出栈 如果是站位 可以这样判断 如果可以看见栈底的楼(最高的楼)那么前面的矮楼一定不会影响后原创 2014-09-24 10:26:26 · 886 阅读 · 0 评论 -
2014多校联合十(HDU 4972 HDU 4973 HDU 4974 HDU 4975)
HDU 4972 A simple dynamic programming problem题意:篮球比赛有1、2、3分球 现给出两队的分差序列(5:3 分差2 3:5分差也是2) 问有多少种可能的比分思路:比较简单的想法题 可以类一张表“从分差x到分差y一共有几种情况” 很容易发现只有1->2和2->1的时候会多一种情况 其他均是一种 所以只需要统计这种特殊分差即可 注原创 2014-08-26 15:35:12 · 1054 阅读 · 0 评论 -
HDU 4967 Handling the Past
题意:你有一个栈 一些操作发生在栈上 包括进栈、出栈、询问栈顶 每个操作有一个独一无二的时间 当操作读进来时 要把之前处理的本该在本操作之后的操作全撤销 接着完成现在的操作 再把撤销的操作重做一遍 每次询问操作输出栈顶元素思路:由于时间唯一 那么可以用时间来对应插入的元素以及操作的类型 所以首先离散化时间(这里不去掉重复也行)然后我们把push当作+1 pop原创 2014-08-20 17:07:31 · 952 阅读 · 0 评论 -
HDU 2492 Ping pong
题意:一串数字 问 有几种这样的组合(x,y,z)使得x>y>z或x思路:对于一个数字 比如 f 它计算出的ans值为 ( beforef.lessthanf * afterf.biggerthanf )+( beforef.biggerthanf * afterf.lessthanf )易知 beforef.biggerthanf = locationf -原创 2014-07-15 10:00:41 · 746 阅读 · 0 评论 -
HDU 1892 See you~
题意:一块矩形空间 一开始每个格子都是1 有4种操作: S操作将(x1,y1)-(x2,y2)所画出的矩形中的数求和 A操作是在(x,y)加z D是在(x,y)减z 注意不能减成负数 M是移动思路:裸二维树状数组… POJ上有楼教主出过的题代码:#include#include#includeusing namespace std;#defi原创 2014-07-14 23:41:05 · 835 阅读 · 0 评论 -
ZOJ 3324 Machine
题意:一段区间最开始元素都是0 每次操作可以令一段连续区间+1或-1(在加过的前提下才能减) 每次操作输出整段区间有多少段连续的0思路:一看区间操作首先考虑线段树 本题n比较大 但是操作数很小 而且每次操作最多影响一段区间(可用两个数字表示区间头尾) 那么就想到了离散化我和网上题解的离散方式不同 我的更暴力更无脑- -b为了保证区间连续性 不能只在线段树原创 2014-07-14 23:30:41 · 1141 阅读 · 0 评论 -
HDU 1829 A Bug's Life
题意:n只虫子 m种交配方式 并给出m对交配 问 是否存在基… 0.0思路:简单的带权并查集 比POJ上那道食物链基础 而且用二分染色可以水过(由于性别只有两种…)带权并查集可以利用权值维护不同集合间的“关系”代码书写时注意getf函数中利用fa[x]更新x和根的关系 merge时注意fy权值利用x、y的权值的计算方法代码:#include原创 2014-07-14 23:53:10 · 806 阅读 · 0 评论 -
2014多校联合三 (HDU 4888 HDU 4891 HDU 4893)
HDU 4891 The Great Pan签到题 他怎么说你就怎么做就好了 注意做乘法时候会爆intHDU 4893 Wow! Such Sequence!题意:n个数一开始都是0 你有三种操作 1操作在k位置加d 2操作输出[l,r]区间的和 3操作把[l,r]内的所有数变成离它最近最小的斐波那契数思路:操作1、2就是线段树基本 那么3怎么搞? 为了不超时显然要延迟更新 那么如果更新到[l,r]区间我们如何更改值呢其实问题可以被巧妙的存储数据解决我们记val为点上的值原创 2014-07-29 21:25:16 · 1563 阅读 · 4 评论 -
ZOJ 2112 Dynamic Rankings
题意:允许单点修改的区间第K值为题思路:树状数组套主席树 详见注释按照kuangbin大神的代码学习 虽然还是理解得不透彻TAT代码://树状数组套主席树#include#include#includeusing namespace std;#define N 60010 //数组和哈希表大小#define M 10010 //操作数#de原创 2014-07-28 20:25:25 · 1219 阅读 · 0 评论 -
HDU 5039 Hilarity
题意:一棵树上有些边是1有些是0 问 有几条简单路径路过奇数个1 树上的边的1和0可以修改思路:不会做… 看题解才找到思路… TAT首先要明确一点 对于u->v这条路径 它的奇偶是可以通过root->u和root->v计算的 因为如果从root出发的两路径不相交 那么两路径上的1相加即可判断u->v 如果相交 假设相交部分有x个1 那么对于u->v的1的个数即原创 2014-09-26 13:56:55 · 1130 阅读 · 0 评论 -
HDU 5029 Relief grain
题意:一棵树 m次染色 每次染色一条路径 颜色不会覆盖会积累 问每个点覆盖次数最多的颜色是什么思路:树上路径操作不是树链剖分就是LCT 对于每次染色 相当于让那种颜色的权值+1一般的熟练剖分都是将树剖成线段然后放在线段树上 这题只是剖成线段 然后对于路径的染色 就变成了对多个线段的染色由于剖分已经使树变成了线性的结构 因此我们可以利用“头加尾减”的方式维护原创 2014-09-27 10:36:12 · 1342 阅读 · 5 评论 -
HDU 3830 Checkers
题意:有三个棋子 可以隔一个棋子跳 不能隔两个跳 问状态u到状态v最少跳几步思路:对于一个状态三个棋子的位置可以设为 x y z (小到大)只有当y-x=z-y的时候 跳的方法为两种 即 y跳过x 或 y跳过z在上式等式不成立时 短的一边可以跳许多次 直到大小关系改变那么这样就形成了二叉树的结构 我们将y向左右跳的状态分别作为原状态的儿子 将两边其原创 2014-10-04 22:06:03 · 1530 阅读 · 0 评论 -
ZOJ 3606 Lazy Salesgirl
题意:n(10^5)个客人来到商店 给出了来的时间和买东西的单价 售货员每隔w分钟会睡觉 如果客人来的时候她在睡觉就把她叫醒但是不买东西 买东西的客人的购买个数为1、2、3、1、2、3…循环 问 w为多大时 卖出的东西平均价格最高思路:容易想到将客人按来的时间排序 然后算出他们的间隔时间 w必为其中某个间隔时间 即枚举n个w的可能如果我们将间隔排序 那么对于某原创 2015-01-24 12:56:40 · 920 阅读 · 0 评论 -
CodeForces 501D Misha and Permutations Summation
题意:n(2*10^5)个元素的排列有n!种 用Perm(x)表示字典序第x的序列(从0开始) 用Ord(排列y)表示排列y的字典序 现在输入排列p和q 求 Perm([Ord(p)+Ord(q)]%n!)思路:容易想到 对于第i位p[i] 如果它是第d小的数字 那么说明比它小的d-1个数字所产生的全排列都已经计数过了例子 35142 第4位是4 它是第2小的原创 2015-01-12 21:08:02 · 1445 阅读 · 0 评论 -
HDU 5147 Sequence II
题意:n(5*10^5)个不同的数字组成的序列a 寻找满足如下约束条件的数字组数: i1思路:明显考察的是nlogn的算法 我们发现其实ai1和ai2可以放在一起考虑 同理ai3和ai4 这两组并没有相互影响我们来看答案是怎么构成的 假设枚举i3的位置 那么我们希望知道“i3后面有几个数大于ai3” 这个可以通过树状数组处理同理假设我们知道i2也希望知道“i2前面原创 2014-12-21 18:53:26 · 812 阅读 · 0 评论 -
CodeForces 484E Sign on Fence
题意:n(10^5)个模板形成的栅栏 q(10^5)个询问 每个询问要求在[u,v]木板区间内摆放一个宽度为w的矩形 问矩形最大的高是多少思路:对于每个询问 可以通过logn的二分来将求解最大h的问题转化为当前h‘情况下的判定问题为什么可以二分呢 因为如果我们将木板排序 从大到小的依次放置它们的位置上 那么对于某一时刻 线段上连续的1就代表了矩形的宽 同时这时原创 2014-12-03 21:56:06 · 781 阅读 · 0 评论 -
HDU 4126 POJ 4006 Genghis Khan the Conqueror
题意:n(3000)个点的图 q(10^4)次操作 每次操作从原图更改一条边的权值 问q次操作后最小生成树的平均值是多少思路:先求最小生成树 然后讨论 如果更改的不是树边 则最小生成树不变 如果是树边 就要选择原图中的非树边和更改后的这条边其中较小的一个形成新树难做的只有“是树边”这种情况 我们考虑 原图中的非树边与原树一定可以形成一个环 那么我们可以这样理解原创 2014-11-30 11:41:27 · 1355 阅读 · 0 评论 -
CodeForces 487E Tourists
题意:n(10^5)个点的图 旅行者在每次旅行都要买纪念品 每次旅行为u->v的任意简单路径 购买的纪念品为路径上最便宜的纪念品 有q次询问 每次询问要么改变一个点的纪念品价格 要么询问一次旅行所买的纪念品价格思路:很明显要先做点双连通(一个连通块内随便走) 然后缩点 形成了一棵树 这棵树上的路径具有“割点-非割点-割点-非割点…”这种规律然后因为是树上路径的问题原创 2014-11-27 15:11:56 · 2238 阅读 · 0 评论 -
CodeForces 487B Strip
题意:n(10^5)个人分组 每组最少L个人 每组的差异为组中人最大价值-最小价值 要求差异均不超过S 问最少分几组思路:假设已经知道组的区间[l,r]那么计算差异就是简单的rmq问题 可以用线段树搞我们可以用dp[i]表示到i位置产生的最少组数假设从i位置开始分一组 会影响到哪些dp呢 我们可以利用二分+rmq找到这个组最远延伸到哪里 从L到最远点这个区间的d原创 2014-11-26 11:36:08 · 1846 阅读 · 0 评论 -
HDU 5002 Tree
题意:一棵树 支持删边加边、路径权值加值、路径权值改值、路径求第二大的数字和其个数思路:LCT的第二题 题意已经把功能都告诉了 比较裸要注意的是权值加值和改值两个操作的标记下放问题 要先down改值 再down加值对于路径的操作通过mroot变换树的形态再access拿出路径比较方便 不要像我上一篇一样搞lca代码:#include#include#in原创 2014-10-18 10:09:17 · 1333 阅读 · 1 评论 -
HDU 4010 Query on The Trees
题意:一棵树 支持合并、分离、路径加权值、路径权值最大值思路:LCT入门题 也是我的第一道… 代码来源于kuangbin巨巨 我只是整理出自己的风格留作模版…LCT比较好的入门资料是——《QTREE解法的一些研究》LCT基本做法就是先dfs建树 然后根据输入做上述4个操作对于合并 就是把u转到树根 然后接在v上对于分离 就是把u转到splay的根原创 2014-10-17 17:51:56 · 1014 阅读 · 0 评论 -
HDU 3727 Jewel
题意:原创 2014-06-02 15:11:30 · 802 阅读 · 0 评论 -
POJ 1442 Black Box
题意:给你个序列和一串询问 询问前a[i]个数字第i小的是几思路:动态的第k值问题 由于区间只增不减所以是水题利用平衡树解决这类问题treap是方便编写的类似平衡树的产品treap方便实现BST的功能 splay更适合于去维护区间代码:#include#include#include#include#includeusing name原创 2014-07-23 21:55:28 · 1024 阅读 · 0 评论 -
HDU 3473 Minimum Sum
题意:一段固定不变的数字 m次询问 每次询问选择一个x值 使得区间[l,r]中每个元素与x的差的绝对值的和最小思路:x值明显选择[l,r]中数字的中位数 那么题目就变成了[l,r]中第(r-l+1+1)/2小的数是几 由于数字是静态的 所以划分树可解那么ans = num(x) - num(>x) * x 由于sum之间可由前缀和相互求出 num也可以通过原创 2014-07-21 16:15:27 · 946 阅读 · 0 评论 -
HDU 4747 Mex
题意:给出一段数字a 定义mex(l,r)表示a[l]...a[r]中最小的不连续的数字 求出所有mex(l,r)的和思路:首先可以想到由l开始到n的所有数字的mex值必然是递增的 那么就可以求出以1开始到n的所有数字的mex 从前到后扫一遍即可 这时可以求出[1,r]所有区间的mex和 利用线段树即可接着考虑如何求[2,r]、[3,r].... 由[1,r]原创 2014-07-16 10:44:44 · 836 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers
我只是来练splay的…ga代码:原创 2014-06-03 19:23:12 · 694 阅读 · 0 评论 -
ZOJ 3602 Count the Trees
题意:有两棵树 问原创 2014-04-04 16:46:23 · 710 阅读 · 0 评论 -
CodeForces 400D Dima and Bacteria
题意:有n个点 它们有自己的type 给出m条边 首先要求判断可否用0费用在同样type的点中走 如果可以 用type为点建图求任意两点最短路思路:type只有500种 最后一步可以用floyd做然后就是如何解决第一个问题 我的方法是并查集每次利用费用为0的边合并集合 如果一个type的所有点都有一个共同的father那么这种type就满足条件原创 2014-03-07 19:15:47 · 967 阅读 · 0 评论 -
USACO Section 3.3 Home on the Range
题意:边长为n的正方形棋盘内有一些坏的点 求出边长为k(n>=k>=2)的内部不含坏点的正方形有几个思路:本以为用二维树状数组可以搞定 可是准确算一下复杂度为O( n^3 * log2(n)^2 ) 还是TLE了正确思路应该是dp 求出每个点左边和上面距离坏点的距离 O( n^2 )再枚举每个点当小正方形的右下角的点 然后判断是否能构成边长为k的正方形 O(原创 2014-02-17 18:50:46 · 648 阅读 · 0 评论 -
POJ 3468
题意:树状数组区间更新区间求和总结树状数组:1、单点更新 区间求和(单点求值)最简单最基础的操作 数组中存的东西就是要求和的数字2、区间更新 单点求值维护查分序列 例如要求a[i] 数组中存的东西应该是d[i] (d[i] = a[i] - a[i-1])那么 a[i] = d[1] + d[2] + d[3] + … + d[i]如果要区间[l,原创 2014-02-14 16:48:17 · 655 阅读 · 0 评论 -
CodeForces 390E Inna and Large Sweet Matrix
题意:在n*m的空间内执行2种操作 每次令一个矩形内所有元素增加v 或 查询一个矩形内的数字的和减去它四个角方向的矩形内数字的和 (操作2看下图 +的部分减去-的部分)- - - -0000000- - - -- - - -0000000- - - -0000 ++++++00000000 ++++++0000- - - -0000000- - - -思路原创 2014-02-14 16:11:36 · 769 阅读 · 0 评论 -
CodeForces 387E George and Cards
题意:有一串数字 主人公可以从这串数字中找出一个连续的子集扔掉其中最小的数字并得到与子集中元素个数相等数量的香肠 现在给出这串数字最后的状态 问 主人公将原串扔成目标串的样子的同时最多拿到多少香肠思路:为了拿到尽量多的香肠 每次选出的子集元素要尽量多 也就是要删除的元素要尽量小 这就提供了一个思路 从小往大删除元素 这个思路是有指导性的第一步然后问题就变成原创 2014-02-01 11:29:49 · 1170 阅读 · 0 评论 -
CodeForces 385C Bear and Prime Numbers
题意:N个数 每个数x[i]对能整除的素数p贡献1 (即p得一分) M个询问 每个询问输出[L,R]区间内所有素数的得分之和思路:数据这么大明显离线处理M个询问 将N个数字的素数因子全都找出来并计算完贡献得分即可简化处理询问综上思路及x[i]的大小可知必须先打素数表 然后枚举N个数 找出所有素数因子 计算贡献得分最后每个询问[L,R]就是 sum(R) -原创 2014-01-27 19:20:21 · 1054 阅读 · 0 评论 -
CodeForces 444C DZY Loves Colors
题意:一段区间a一开始是1、2、3、4……n这样的 每次1操作可以将[l,r]覆盖成x 同时得到abs(a[i]-x)的价值 2操作查询[l,r]的价值思路:线段树 又是一道加深线段树理解的题操作2是简单的求和 线段树基本操作 难点在操作1用cov表示该区间的值(如果为0说明是混合区间) 用val表示该区间的价值和那么在更新时就不仅仅是找到 tree[原创 2014-07-15 21:10:07 · 1383 阅读 · 0 评论 -
ZOJ 2334 HDU 1512 Monkey King
题意:猴子们打架 认识的猴子不会打架 两只猴子打完以后就认识了 A认识B B认识C A也认识C 每次打架由两伙猴子进行 分别选出自己的最高战斗力 在战斗之后两只猴子战斗力减半 给出m次打架 输出打架后这一伙猴子里的最强战斗力思路:判断两只猴子是不是一伙的 用到并查集快速找出一伙猴子中的最强战斗力用到堆 但打完架两伙猴子合并时堆需要nlogn复杂度 因此用左偏树代替堆原创 2014-07-16 15:54:37 · 1140 阅读 · 0 评论 -
HDU 1890 Robotic Sort
题意:将一列数字排序 排序规则是 每次找到最小值的位置loc 将1~loc所有数字颠倒 然后删掉第一位 直到排好序 排序要求是稳定的思路:这题要做的是 寻找区间最小值位置 翻转区间 的操作 因此可以想到用splay只需要每个节点记录一个small 就可以实现找到最小值位置翻转区间操作就是将splay的超级头转到最上面使之成为根 再把loc转到根下面 这时根的右儿子的左儿子就是需要翻转的区间 用一个rev延迟更新 然后将loc转到最上面是指成为根 删掉根 如此循环原创 2014-07-17 09:55:02 · 1837 阅读 · 0 评论 -
HDU 4417 Super Mario
超级玛丽题目重做! 题意见http://blog.csdn.net/houserabbit/article/details/37968189新思路:如果我们将原串数字按大小排序 每次扫描到这个数字就在它对应的位置上+1并且将询问按h排序 依次做每个询问那么题目就变成了 对于每个询问 将原串数字一个一个的放进去直到h的大小 然后求R前1的个数减去L-1前1的个数原创 2014-07-20 17:16:30 · 836 阅读 · 0 评论 -
HDU 3436 Queue-jumpers
题意:n个人站成一排 一开始是从1到n有序的 现在有三个操作 Top操作是将一个人排到队首 Query操作是询问某个人现在排第几 Rank操作是询问排某个位置的人是谁思路:将队伍扭来扭去… 很像splay的旋转吧(哪像了!!)这是个不错的splay题…首先 n很大 但是操作不多 想到离散化离散化还有个技巧 我们发现只有top和query操作对单人进行 rank和人没什么关系所以要把top和query操作的人单独拿出来 那么其他的人就可以用区间的形式来表示了我们只需要开原创 2014-07-19 18:50:14 · 1054 阅读 · 0 评论 -
HDU 4286 Data Handler
题意:n个数字一开始排成一串 有两个指针L和R 指向了这串数字的一个区间的端点 现在有7种操作1、使一个指针左移2、使一个指针右移3、在L后插入一个数字X4、在R前插入一个数字X5、删除L所指元素6、删除R所指元素7、翻转[L,R]区间问 m次操作后 整串数字是什么样的思路:splay经典维护区间的操作 区间更新(翻转操作) 删除节原创 2014-07-20 20:40:18 · 1150 阅读 · 0 评论