
-------------数据结构-------------
CHN_JZ
爆0 forever
展开
-
[并查集]BZOJ 1050——[HAOI2006]旅行comf
1050: [HAOI2006]旅行comf题目描述给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000)。给你两个顶点S和T,求一条路径,使得路径上最大边和最小边的比值最小。如果S和T之间没有路径,输出”IMPOSSIBLE”,否则输出这个比值,如果需要,表示成一个既约分数。 备注: 两个顶点之间可能有多条路径。解题思路非常水的题目,为什么我原创 2017-06-30 13:44:30 · 2242 阅读 · 2 评论 -
[树状数组]51 Nod 1463——找朋友
题目描述给定:两个长度为n的数列A 、B一个有m个元素的集合K询问Q次每次询问[l,r],输出区间内满足|Bi-Bj|∈K 的最大Ai+Aj解题思路注意这题M的范围是10离线一下,对于每个新加的元素用树状数组暴力维护就可以了。#include<cstdio>#include<algorithm>using namespace std;const int maxn=100005;struct原创 2017-10-29 18:42:57 · 668 阅读 · 0 评论 -
[二分+差分]BZOJ 4326——NOIP2015 运输计划
题目梗概给出一棵有边权的树,并有m个从x到y的路径。将一条边的边权改为0,使所有路径的最大值最小。解题思路因为要使最大值最小,所以我们二分答案。对于大于答案的路径,我们要修改它。那么就是把这些路径的交集中最大的边改为0。求路径交集差分一下就可以了,在差分的时候只需要LCA就可以了。#include<cmath>#include<cstdio>#include<cstring>#include<原创 2017-10-12 20:12:02 · 997 阅读 · 0 评论 -
[二分+树状数组]51 Nod 1685——第K大区间2
[二分+树状数组]51 Nod 1685——第K大区间2题目描述定义一个长度为奇数的区间的值为其所包含的的元素的中位数。 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少。解题思路二分枚举答案x。考虑如何验证中位数>=x的区间总数是否>=K。构造s[i]s[i]表示前i个数有多少个数>=x>=x。如果一个区间的中位数>=x>=x肯定有(s[R]−s[L−1])∗2>R−L+1(s原创 2017-10-23 18:37:30 · 624 阅读 · 0 评论 -
[树链剖分]bzoj 4034—— [HAOI2015]树上操作
题目描述有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a 。操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。操作 3 :询问某个节点 x 到根的路径中所有点的点权和。解题思路树链剖分的裸题。更改一棵子树的值,就是在DFS序上更改一段区间。询问时,每条重链其实也可以看成一段区间,构造DFS先遍历重儿子就可以原创 2017-10-15 20:55:36 · 416 阅读 · 0 评论 -
[树状数组]BZOJ 2028——[SHOI2009]会场预约
题目梗概有两种操作:一种是插入一段区间,并删除与这段区间相交的区间,返回删除区间的个数。另一种是返回目前的区间数。解题思路有一个非常重要的特性是在任何时候区间的末端随区间的始端递增而递增。于是考虑树状数组维护始端个数的前缀和,维护这个就可以二分查找小于等于某个点最近的始端。知道始端的位置后,我们可以得到相应的末端,如果形成相交就删去这个区间(其实就是删去始端)。因为始末端的单调性,当查找出的区间不形原创 2017-10-25 17:01:59 · 609 阅读 · 0 评论 -
[树状数组]51 Nod 1711——平均数
题目描述LYK有一个长度为n的序列a。你只要告诉他所有区间(n*(n+1)/2个区间)中第k大的平均数就行了。解题思路显然要二分,考虑如何验证。sum[R]−sum[L−1]>=x∗(R−L+1)——>sum[R]−x∗R>=sum[L−1]−x∗(L−1)sum[R]-sum[L-1]>=x*(R-L+1)——>sum[R]-x*R>=sum[L-1]-x*(L-1)那么就是求sum[i]−x∗i原创 2017-10-25 17:48:02 · 513 阅读 · 0 评论 -
[堆]51 Nod 1461——稳定桌
题目描述有一张桌子,有n个腿。第i根腿的长度是li。现在要拿掉一些腿,使得桌子稳定,拿掉第i根腿需要di的能量。稳定的条件是,假如拿掉若干条腿之后,桌子还有k个腿,那么长度最长的腿的数目要超过一半。比如桌子有5根腿,那么至少要有三根腿是最长的。另外,只有一根腿的桌子是稳定的,两个腿的桌子想要稳定,必需长度是一样的。你的任务是拿掉若干腿,使得桌子稳定,并且所消耗的能量要最少。解题思路考虑枚举长度,每个原创 2017-10-25 18:02:59 · 765 阅读 · 0 评论 -
[最大生成树+LCA]NOIP 2013——货车运输
[最大生成树+LCA]NOIP 2013——货车运输题目梗概给出一张有权无向图。每次询问x->y的所有路径,最小值边权最大的路径。解题思路构造一棵最大生成树(可能是多棵)。每次在树上求一条路径的最小值就可以了。#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>using namespace std;cons原创 2017-10-17 13:52:21 · 716 阅读 · 0 评论 -
[Dsu on tree]CodeForces 600 E
题目描述给出一个树,树的每个节点有一个颜色。询问每个节点颜色最多的颜色编号和。解题思路树上启发式合并?考虑暴力,对于每个节点暴力遍历,之后删除该子树的贡献。不然发现有些删除没有必要,贪心的思想,对于每棵子树保留重儿子的贡献。所以操作为:遍历所有轻儿子不保留贡献,遍历重儿子保留贡献,遍历轻儿子增加贡献,得到该树答案。时间复杂度:考虑每个节点遍历的次数,显然是到根节点的轻边个数加重链个数+1,所以效率就原创 2017-12-19 19:32:27 · 427 阅读 · 0 评论 -
[左偏树]BZOJ 2809——[Apio2012]dispatching
题目描述在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿。在这个帮派里,有一名忍者被称之为 Master。除了 Master以外,每名忍者都有且仅有一个上级。为保密,同时增强忍者们的领导力,所有与他们工作相关的指令总是由上级发送给他的直接下属,而不允许通过其他的方式发送。现在你要招募一批忍者,并把它们派遣给顾客。你需要为每个被派遣的忍者 支付一定的薪水,同时使得支付的薪水总原创 2017-11-26 21:06:41 · 543 阅读 · 0 评论 -
[主席树]BZOJ 3524——[Poi2014]Couriers
题目描述给一个长度为n的序列a。1≤a[i]≤n。 m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2。如果存在,输出这个数,否则输出0。解题思路直接上主席树。构造权值线段树,询问时不停遍历节点数最多的一边就可以了。但是要注意:最后停下的节点并不是出现次数最多的节点但对于这道题,如果有解这种方法一定正确。#include<cstdio>using原创 2017-11-26 21:12:57 · 549 阅读 · 0 评论 -
[Splay]BZOJ 1208——[HNOI2004]宠物收养所
题目描述最近,阿Q开了一间宠物收养所。收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物。每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值。这样他就能够很方便的处理整个领养宠物的过程了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者原创 2017-11-27 20:20:42 · 591 阅读 · 0 评论 -
[分块+并查集按秩合并]#519. 「LibreOJ β Round #2」数学上来先打表
题目梗概给你一个图,每个点有点权,最开始没有边。有一些操作:添加一条 x 与 y 之间的双向边。回到第 x 次操作后的状态。(注意这里的 x 可以是 0,即回到初始状态)查询 x 所在联通块能到的点中点权第 y 小的值,如果不存在,那么输出 −1。解题思路对于第2个操作,将询问建成树后DFS。对于第3个操作,对于每个联通块分块维护前缀和,对于当前块暴力查询一个点是否出现。在建边时,需要按秩合原创 2017-10-11 21:42:39 · 1338 阅读 · 0 评论 -
[二维树状数组]BZOJ 1452—— [JSOI2009]Count
题目梗概给出一个N*M的方格,每个方格有一个数字。每次更改某个格子上的数字或询问一个子矩阵的某值的个数。解题思路裸的二维树状数组,对每个值分别开数组记录就可以了。#include<cstdio>#include<cstring>using namespace std;const int maxn=25,maxm=125,tt=45989;struct jz{ int x[maxm][原创 2017-10-06 15:17:34 · 701 阅读 · 0 评论 -
[并查集]51 Nod 1525——重组公司
题目梗概普通的并查集问题?多了一种区间合并的操作。解题思路还是很水。维护每个点前面最近的没合并的节点是谁就可以了。#include<cstdio>using namespace std;char nc(){ static char buf[100000],*l=buf,*r=buf; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);原创 2017-10-18 19:13:57 · 658 阅读 · 0 评论 -
主席树——总(mu)结(ban)
以poj2104为例。 主席树就是可持久化线段树,也叫作函数式线段树,然后。。。 该干嘛干嘛,贴代码 我们先考虑每次询问都是对于1~n,我们肯定会想到离散数字,然后建一个线段树,然后寻找。 如果我们能对每个前缀【1~i】(1<=i<=n)都能建一颗线段树,那么遍历的时候不断a[R]-a[L-1]不就好了。 然后主席树就可以做到。为什么呢?因为你会发现相邻的两颗线段树有很多节点是重复的,共用原创 2017-05-01 21:14:33 · 525 阅读 · 0 评论 -
BZOJ 1878 [SDOI2009]HH的项链——离线+树状数组||莫队算法
1878: [SDOI2009]HH的项链题目描述HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此他的项链变得越来越长。有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答。。。因为项链实在是太长了。于是,他只好求助睿智的你,来解决这个问题。输入第一行:一原创 2017-04-23 14:56:25 · 815 阅读 · 0 评论 -
BZOJ 1588 [HNOI2002]营业额统计——双向链表
1588: [HNOI2002]营业额统计题目描述营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低原创 2017-04-19 21:32:01 · 655 阅读 · 1 评论 -
BZOJ 1015 [JSOI2008]星球大战——并查集+离线处理
1015: [JSOI2008]星球大战starwar题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系。某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。 但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被原创 2017-04-16 19:38:42 · 646 阅读 · 1 评论 -
BZOJ 1036 [ZJOI2008]树的统计——树链剖分
1036: [ZJOI2008]树的统计Count题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节原创 2017-03-30 17:56:39 · 633 阅读 · 0 评论 -
Poj 1741——treap的启发式合并
TreeDescription Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist(u,v)=The min distance between node u and v. Give an integer k,for every pair (u,v)原创 2017-03-10 18:47:35 · 1282 阅读 · 2 评论 -
BZOJ 3224 Tyvj 1728 普通平衡树——treap
3224: Tyvj 1728 普通平衡树Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数,因输出最小的排名) 4. 查询排名为x的数 5. 求x的前驱(前驱定义为小于x,且最大的数) 6. 求x的后继(后继定义为大于x,且最小的原创 2017-03-06 20:43:10 · 899 阅读 · 1 评论 -
[左偏树]CODE[VS] 1063——合并果子
Ps:博主又来水blog辣题目梗概不需要了吧。 二叉哈夫曼树。解题思路直接上代码 今天复习堆QuQ,额、 于是很想码左偏树,发现竟然没有水左偏树的blog,所以来一发不要建议。 看到CODE[VS]有道合并果子++,数据大了100倍,那只能用单调序列了。#include<cstdio>#include<algorithm>using namespace std;const int ma原创 2017-07-25 11:33:49 · 638 阅读 · 0 评论 -
[K叉哈夫曼树]BZOJ 4198—— [Noi2015]荷马史诗
题目概述并不是很想写概述啊。这不是权限题,来个链接大家自己看下吧:题目传送门解题思路相信大家看来这道题之后都不难联想到哈夫曼编码的原理。Ps:不知道哈夫曼编码,问度娘去吧。这么看来这道题转变为另外一个问题:求一棵K叉哈夫曼树的最小值,并使树的深度最小。首先考虑解决K叉问题,如果是二叉,我们选最小和次小,如果是K叉显然是选择前K小的数合并。但是又存在一个问题,最后剩下的节点个数不一定能被k-1整除,这原创 2017-08-04 21:44:29 · 1547 阅读 · 0 评论 -
[并查集+启发式合并]BZOJ 2733——[HNOI2012]永无乡
Ps:又水听博主解释一下:昨天模拟赛遇到启发式的裸题,愣是打成左偏树的合并,惭愧惭愧。于是今天找到裸题练习一下。题目梗概有n个节点,每个节点有一个独一无二的权值。 合并一些节点。 询问一个节点所在联通块的权值第k大的节点,不存在则输出-1。解题思路什么SB题 这显然是平衡树的一道模板题,并且涉及到启发式合并。 启发式合并听着高大上其实是非常暴力过程。 当两棵平衡树合并时,把节点数较少的平衡原创 2017-07-28 14:31:53 · 840 阅读 · 0 评论 -
[左偏树+lazy思想]BZOJ 4003——[JLOI2015]城池攻占
题目梗概一棵有根树,每一个节点都是一个城池,有一个防御值si。有若干个战士,第i 个战士初始攻击力为 ai,初始攻击的城池为 ci。如果攻击力大于等于城池的防御值,则攻击成功,战士继续攻击父节点,否则攻击失败。攻击完第i 个城市后战士的攻击力会加上一个数或者乘以一个数(每一个城池属性不同)。每一个战士都是独立的,问每一个战士攻占了几个城池。解题思路先来说说大致思想,我们考虑从叶子节点开始处理,在每个原创 2017-08-06 21:25:13 · 828 阅读 · 0 评论 -
[线段树]HDU 4942——Game on S♂play
题目梗概给出一棵树,定义一个节点的有趣值为该节点为根的树的权值和。现在可以旋转一个节点,询问任意子树的有趣值之积。解题思路不管树怎么旋转,这棵树的中序遍历是不变的。维护每个节点控制范围和有趣值。用线段树维护有趣值的积。#pragma comment (linker,"/STACK:102400000,102400000")#include<cstdio>#include<cstring>#de原创 2017-09-28 10:26:15 · 731 阅读 · 0 评论 -
[树状数组]code[vs] 1082——线段树练习 3
ps:博主又A这种水题显然是为了水blog有新姿势。题目梗概区间加,询问区间和。解题思路什么垃圾,直接线段树。 树状数组也可以区间加的啊,代码短小,常数小。 当然与普通树状数组有所不同。 设a[i]=w[i]−w[i−1]a[i]=w[i]-w[i-1],这样修改区间[L,R][L,R]显然只需要修改a[L],a[R+1]a[L],a[R+1],[1,x][1,x]的原创 2017-07-24 14:55:58 · 615 阅读 · 0 评论