2017暑假
xzxxzx401
这个作者很懒,什么都没留下…
展开
-
[bzoj2152]聪聪可可——点分治
bzoj 2152 聪聪可可点分治题意给定一棵带权树,需要统计路径长度为3的倍数的路径条数。思路重学点分治。 主要操作就是找重心,那个getrt函数。mx[x]表示x最大的儿子的size,注意这个最大的儿子包括他父亲。所以最后那句mx[x]=max(mx[x], n-sz[x]);就是统计他父亲那边的size。getdis和calc函数都是暴力计算,getdis(x,f)是统计x的子树中的dis情原创 2017-09-22 15:27:17 · 187 阅读 · 0 评论 -
HDU 6133 Army Formations
HDU 6133 Army Formationsdsu on tree题意给你一棵n个节点的二叉树,每个节点有一个提交任务的时间,每个节点总的提交任务的罚时为:提交这个节点和其子树所有的任务,每个任务提交时间的总和为该点的罚时。求每个节点提交完所有任务的最小罚时思路树上启发式合并。考虑有这样一个数据结构, 可以动态往一个多重集里面添加数字, 删除数字, 并查询多重集中元素的sumofsum. 这个原创 2017-09-05 16:21:07 · 226 阅读 · 0 评论 -
Codeforces 600E Lomsat gelral
Codeforces 600E Lomsat gelral树上启发式合并题意一棵树,每一个点有一个颜色,统计以每一个节点为根的子树中出现次数最多的颜色的编号,如果有多个颜色,统计他们的和。思路学习了一下dsu on the tree,安利一下良心博客1,博客2,以及CF官方解答。 算法的大致过程: 首先将树轻重链剖分,在dfs的过程中先dfs轻儿子,再dfs重儿子。 假设某一个点的儿子都已原创 2017-09-05 15:34:01 · 306 阅读 · 0 评论 -
HDU 6166 Senior Pan
HDU 6166 Senior Pan二进制枚举题意给一个有向图,给一个点集,求点集内点的最近距离。思路假设最近点对是a,b。那么a,b肯定至少有一个二进制位不同。那么我们按位枚举,只需要枚举20位,肯定又一次枚举可以将a和b分开到两个集合。每次枚举跑一次spfa。取所有的最小值。链接到cf835E和多猪试毒问题。代码不难写#include<cstdio>#include<cstdlib>#in原创 2017-08-24 00:14:47 · 454 阅读 · 0 评论 -
HDU 6162 Ch’s gift
HDU 6162 Ch’s gift线段树,离线题意给一棵树,每次询问:uv两点间的路上(包括uv),点权在ab之间的所有点点权和。思路 由于没有修改操作,一个显然的想法是离线处理所有问题 将询问拆成1-x,1-y,1-LCA(x,y),则处理的问题转化为从根到节点的链上的问题。 解决这个问题,我们可以在dfs时向treap插入当前的数,在退出时删除这个数,并且每次维护在该点上的答案原创 2017-08-23 16:30:22 · 225 阅读 · 0 评论 -
bzoj 2243: [SDOI2011]染色
bzoj 2243: [SDOI2011]染色树链剖分,线段树题意给定一棵有n个节点的无根树和m个操作,操作有2类:将节点a到节点b路径上所有点都染成颜色c;询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。请你写一个程序依次完成这m个操作。思路这种东西。。感觉很套路啊,学会了之后根本不难写,顶多是代码太多写丑了需要原创 2017-08-16 00:17:48 · 230 阅读 · 0 评论 -
HDU 6171 Admiral
HDU 6171 Admiral搜索,双向宽搜题意自己读题吧。不过有两点注意:每次只能把0数字和其他数字交换;每个数字的可交换范围是左上,正上,正下,右下。思路不会搜索啊。。。%%% 因为起始状态与终止状态都很明确,考虑双向宽搜。关于状态的表示与检查:作为6进制数哈希,用个map记录状态与达到该状态对应的步数。因为是双向搜索,所以开两个map记录。双向宽搜就是从初始状态搜,记录到map1;从终止状原创 2017-08-25 15:13:00 · 382 阅读 · 0 评论 -
HDU 4614 Vases and Flowers
HDU 4614 Vases and Flowers线段树题意两个数n,m, n表示花瓶数量0~n-1,开始全为空。接下来有m组,每组有数k,a,b;当k=1时, 从a位置开始插花,b为花数量,当花瓶有花时,跳过当前,直到找到空花瓶再插入,输出插入第一支花的位置和最后一支花的位置,花可以没插完,当一支都没有插入则输出Can not put any one.;当k=2时,清空【a,b】的花瓶,并输出在原创 2017-08-21 23:48:57 · 188 阅读 · 0 评论 -
HDU 5869 Different GCD Subarray Query
HDU 5869 Different GCD Subarray Query线段树,离线题目长度n的序列, m个询问区间[L, R], 问区间内的所有子段的不同GCD值有多少种。思路区间gcd收敛非常快,首先暴力处理所有区间gcd及位置,复杂度nlogA。 %%%for(int i=1;i<=n;i++){ int cur=num[i], pos=i; for(int j=0;j<原创 2017-08-14 20:46:09 · 221 阅读 · 0 评论 -
POJ 3667 Hotel
POJ 3667 Hotel线段树题意设计数据结构,维护一段序列,初始全1,支持2种操作:将一段区间置1从头查找第一段长度不小于k的序列,并将这k个位置置0思路线段树维护序列。维护前缀1(pre),后缀1(suf),区间最大连续1(sum)。更新时取左右中长度大的更新。 找不小于k时有坑,必须按照下面步骤一步步来:如果跟节点的区间最大连续1小于k,那么无解如果左子区间sum大于等于k,递原创 2017-08-14 02:00:29 · 153 阅读 · 0 评论 -
Codeforces 375D Tree and Queries
Codeforces 375D Tree and Queries数据结构,dsu on tree题意给一棵树,每个节点有颜色,给一些查询(k,v),问k及其子树中,出现大于等于v次的颜色有多少种。思路dsu on tree。复杂度O(nlog2n)O(nlog^2n),dsu的nlogn加上树状数组的logn。dsu的过程中用树状数组维护出现t次的颜色的种数。dfs完一个节点处理他的所有询问。代码#原创 2017-09-06 12:55:30 · 340 阅读 · 0 评论 -
Codeforces 246E Blood Cousins Return
Codeforces 246E Blood Cousins Return数据结构,dsu on tree题意一棵树,每一个点有一个颜色(字符串),每一次询问以某一个点为根的子树中与其距离为k的点有多少种颜色。思路dsu on tree。因为第二次dfs时每个深度的信息都要记录,就对每一个深度开一个set,记录这个深度下出现过的颜色即可。 dfs完一个节点,将它的深度加上询问的深度,就是实际深度,查原创 2017-09-06 14:20:43 · 300 阅读 · 0 评论 -
Codeforces 570D Tree Requests
Codeforces 570D Tree Requestsdsu on tree题意给一棵树,每个节点有一个字母。一些查询Q(x,d),查询x及其子树中,与根节点距离为d的所有字母是否可以构成回文串。思路两种思路,dfs序+树状数组或dsu on tree。dfs序+树状数组 我们可以跑一遍dfs序,这样子树在dfs序中连续。dfs时同时处理出距根所有距离的节点。然后离线询问,按深度排序,开26个原创 2017-09-06 23:48:53 · 301 阅读 · 0 评论 -
HDU 5458 Stability
HDU 5458 Stability树链剖分,巨麻烦题意给一个图,可能有重边与自环。有一些操作:删去某条边,保证边一定存在;查询两点之间的桥数。保证任意时刻图至少是一棵树。思路老谭看一眼觉得是缩点,可能还要剖分,就丢给我。我敲完水题就开始了。。爆炸。。。思路很清晰,两点之间的双联通分量一定对答案没有贡献,剩下的一条路贡献1。又最后保证联通,至少是树,所以思路很明显(有个NOI题,棘手的操作),先得到原创 2017-09-02 16:27:31 · 238 阅读 · 0 评论 -
后缀自动机模板
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <ctime> #include <vector> #include <queue> #include <stack>原创 2017-08-06 15:47:11 · 562 阅读 · 0 评论 -
Codeforces 842D Vitya and Strange Lesson
Codeforces 842D Vitya and Strange Lesson01字典树,数据结构题意给出长度为 n 的非负整数序列,求该序列异或 x 以后的 mex 值。思路求mex可以用trie来搞。把整个序列的trie建出来后,假如要全局异或一个x,若x的从高到低第i位为1,则trie的第i层的所有节点都要翻转左右儿子。 知道了这点后,我们就可以通过打标记实现翻转来快速异或一个值,而不需原创 2017-08-30 23:56:14 · 524 阅读 · 0 评论 -
Codeforces 842C Ilya And The Tree
Codeforces 842C Ilya And The Tree树上gcd题目有一棵根节点为1的树,每个结点都有权值。求每个结点从根节点到它的路径上的点的最大gcd(最多可以把一个路径上的一个点权值变成0)。思路关于区间gcd。。有个结论:就是可以‘暴力’,因为区间gcd收敛非常快,无论是在线段树搞,还是这次这题。都是暴力。线段树处理区间gcd的一题开始写树形dp,dp开两个记录当前节点的路径最大原创 2017-08-30 15:41:56 · 383 阅读 · 0 评论 -
HYSBZ 1483 梦幻布丁
HYSBZ 1483 梦幻布丁模拟链表,链表启发式合并题意N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色.思路暴力建出布丁的链表,记录每种颜色的起始位置,结束位置。合并时将一个颜色的链表遍历,全改成另一种颜色,统计对ans的影响。并将链表连起来。为了防止退化,统计出每个颜色的size,进行原创 2017-09-23 21:02:50 · 293 阅读 · 0 评论 -
HackerEarth The Grass Type
HackerEarth The Grass Typestd::map的启发式合并,树上问题题意一棵树,每个节点有一个int。问每个节点u的子树中,两个不同节点(a,b)满足val[a]*val[b]=val[u]的pair(a,b)有多少个。思路map的启发式合并,dfs时将子树的结果合并到根上,并查询pair即可。复杂度O(nlog2n)O(nlog^2n)。代码#include<bits/std原创 2017-09-07 13:58:40 · 285 阅读 · 0 评论 -
HDU 3255 Farming
HDU 3255 Farming线段树,扫描线题意二维坐标的田地,在上面按矩形区域种植。有可能一个格子种了多种作物,那么按价值最大的算。求总价值。 实际就是求立方体体积并。把作物价值想成高度。思路按价值离散化,一层层求。每次将价值大于当前考虑价值的边加入边表,在编表里面跑矩形面积并,乘个高度即可。代码#include<cstdio>#include<cstring>#include<algor原创 2017-08-29 19:14:36 · 210 阅读 · 0 评论 -
POJ 2114 Boatherds
POJ 2114 Boatherds点分治题意给一棵带边权的树,给一系列询问,问是否存在一条路径,使得路上权值和恰好为K。思路点分治。 100个询问,每次做一遍点分治。点分治记录所有路径长度,在二分查找是否有满足条件的长度。代码#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>using namespa原创 2017-09-22 23:45:41 · 215 阅读 · 0 评论 -
HDU 1828 Picture
HDU 1828 Picture扫描线,矩形周长并题意求矩形周长并思路没有想象的难。根面积一样的离散化,线段树保存:struct Stree{ int cov;//被完全覆盖的次数 int len;//被覆盖的长度 int num;//区间内线段的数量 int lp, rp;//被覆盖的左端点和右端点}stree[MAXN<<3];保存区间内线段的数量,更新时通过原创 2017-08-29 15:11:33 · 198 阅读 · 0 评论 -
CodeForces 703D Mishka and Interesting sum
CodeForces 703D Mishka and Interesting sum线段树,区间异或性质题意给一个长度为n的序列,m次询问。询问一段区间中,出现了偶数次的数的异或和。思路首先异或的性质:a xor a=0a\ xor\ a=0。即区间中出现偶数次的数对异或值没有贡献。然后a xor b xor a=ba\ xor\ b\ xor\ a=b。所以求偶数次数的异或值转化为求区间出现过数的原创 2017-08-13 15:32:06 · 179 阅读 · 0 评论 -
bzoj 2434: [Noi2011]阿狸的打字机
bzoj 2434: [Noi2011]阿狸的打字机线段树,AC自动机应用题意初始字串为空,首先给定一系列操作序列,有三种操作:在结尾加一个字符在结尾删除一个字符打印当前字串然后多次询问第x个打印的字串在第y个打印的字串中出现了几次。思路%%%1 %%%2操作字符串的过程实际是构建Trie的过程。新建字母相当于新加节点,打印字串相当于给标记,删除字母相当于回到爸爸节点。因为Trie保存的是原创 2017-08-13 04:23:29 · 182 阅读 · 0 评论 -
BZOJ 2333 [SCOI2011]棘手的操作
BZOJ 2333 [SCOI2011]棘手的操作线段树,离线,图论题意给你N个点,每点开始时是独立的,有点权。 设计数据结构支持:加边,将点x,点y连通修改单点权值、修改整体权值、修改某一点所在连通块的权值查询单点权值、查询整体最大权值、查询某一点所在连通块的最大权值思路%%%因为两个连通块合并后就不会被拆开,所以考虑离线。处理出最后的树,进行dfs序,对每个点重新标号。这样就把连通块变原创 2017-08-12 16:57:07 · 234 阅读 · 0 评论 -
HDU 4913 Least common multiple
HDU 4913 Least common multiple复杂线段树 传送门:HustOJ题意给你一些数,每个数都是xi=2ai∗3bix_i=2^{a_i} * 3^{b_i}的形式。问你每个这些数的每个子集的最小公倍数之和。思路先膜%%% 线段树。 等价于求所有子集里面最大的a和b。 如果只有a,那么做法是按a排序,然后递推计算。因为算到a[i]时,它肯定是目前最大的。最大为a[i]原创 2017-07-24 02:28:37 · 238 阅读 · 0 评论 -
Gym 101190E (NEERC2016) Expect to Wait
Gym 101190E (NEERC2016) Expect to Wait扫描线 传送门:HustOJ题意给你n个共享单车的 [借/还,数量,时间]。有q个查询,每个查询表示若初始有m个单车,那么所有人的等待时间总和是多少。思路%%%首先得看出来这是个扫描线。。。 然后跟普通扫描线不同的是:从y轴扫下来时,x的长度只增不减。所以不需要用线段树维护边,只要扫一遍边集,每次加一下面积就可以了。原创 2017-07-19 16:24:44 · 296 阅读 · 0 评论 -
Gym 101194F Mr. Panda and Fantastic Beasts
Gym 101194F Mr. Panda and Fantastic Beasts2016acm-icpc 中国赛区总决赛 F题 后缀自动机题意给n个字符串,找第一个字符串的一个最短子串,使得它不是2到n任何一个字符串的子串。输出字典序最小的。思路SAM。算半个裸题? %%%把2到n用特殊字符连接起来(‘z’+1),拼成一个字符,构建sam。然后用第一个字符串跟他匹配,每次失配时更新答案。sa原创 2017-08-07 16:30:36 · 1175 阅读 · 1 评论 -
HDU 4975 A simple Gaussian elimination problem
HDU 4975 A simple Gaussian elimination problem网络流,残余网络判环题意有一个矩阵,给你它的每行的行和以及每列的列和,矩阵中每个元素值0~9。问你能否还原这个矩阵?输出无解/唯一解/多解。思路网络流。矩阵建图模型。个人感觉与这题有些像。读入时如果发现非法,比如行和超过9*列数,比如所有行和与所有列和不相等,直接gg。每行用一个点表示,每列用一个点表示。源连原创 2017-07-22 00:15:22 · 269 阅读 · 0 评论 -
HDU 4971 A simple brute force problem
HDU 4971 A simple brute force problem网络流,最大权闭合子图 传送门:HustOJ题意给你一些问题,一些项目。解决每个问题有花费,完成每个项目有奖励。问题之间有关系,解决有的问题必须先解决其他某些问题,还有的问题之间是相互依赖的,即必须一起解决。问你最大收益是多少。思路%%%最大权闭合子图问题。具体有论文:网络流模型的应用。说一下建图方式:超级源,向每个项目原创 2017-07-21 18:50:12 · 232 阅读 · 0 评论 -
线段树基础合集
线段树基础合集codevs上的一些题,是线段树入门(裸)题,比较全面。 包括: 1080:单点修改,区间求和 1081:区间add,询问单点值 1082:区间add,区间求和 4919:复杂一点的区间修改,区间求和 4927:区间add,区间set,区间求和另外还有我不会的5037,大佬说是分块做?CodeVS-1080裸地基本线段树,当个板子吧。#include <原创 2017-07-15 15:47:17 · 272 阅读 · 0 评论 -
HDU4973 A simple simulation problem
HDU4973 A simple simulation problem线段树分治 传送门:HustOJ题意设计数据结构,支持操作: 初始时给定n,表示序列123…n D l r:将序列下标lr之间的数复制一份,比如12345 D 2 4,变为12233445,在D 1 4变为112222333445。 Q l r:查询下标lr之间的数中,出现次数最多的数的出现次数。思路是个线段树分治的题原创 2017-07-21 17:17:30 · 344 阅读 · 0 评论 -
CodeChef ROBOTDAG Robots in a DAG
CodeChef ROBOTDAG Robots in a DAGSAP板子#include<cstdio>#include<cstring>#include<queue>#include<iostream>#include<algorithm>using namespace std;const int MAXN=200007;const int oo=0x3f3f3f3f;cons原创 2017-07-29 23:33:18 · 257 阅读 · 0 评论 -
POJ 2886 Who Gets the Most Candies?
POJ 2886 Who Gets the Most Candies?线段树基本应用 传送门:HustOJ题意约瑟夫问题。一群人标号1~N。给你k,第一次k号出来。每个人还都有一个数字,表示他出去以后下一个出去人的是谁。数字正表示向号大的方向数,负表示向号小的方向数。 第x个出去的人(x从1开始数)获得的糖果数是x的约数个数。问谁获得的糖果数最多。思路线段树维护约瑟夫环,像上一题一样。每个叶原创 2017-07-16 16:14:41 · 226 阅读 · 0 评论 -
CodeChef - MEXDIV Mex division
CodeChef - MEXDIV Mex division思维,递推计数题意给你一个序列,让你对他进行划分。使划分后的每个集合的mex值都不大于k。 mex函数是定义在自然数集合上的,表示不再这个集合里面的最小自然数。思路不会递推计数啊。。。f[i]表示前i个数的划分方案。现在我已经算好前i-1,对于i,把它加进去后,如果不影响,那么方案数乘2,表示i-1和i之间可以加分割也可以不加。如果影响原创 2017-08-01 19:08:38 · 212 阅读 · 0 评论 -
CodeChef - ANCESTOR Ancestors in Two Trees
CodeChef - ANCESTOR Ancestors in Two Trees数据结构,dfs序题意给你两颗树,都是n个节点,1是根。问你对于2~n的所有点,在两颗树中的共同祖先有几个。思路dfs序的应用吧。其实求出两个树的dfs序,就是公共区间覆盖的问题。具体做法是,求出第一棵树的dfs序,然后对第二颗树dfs,每到一个点u,就在线段树或树状数组中记录这个编号在第一棵树的节点所掌握的区间。若原创 2017-08-01 19:16:24 · 221 阅读 · 0 评论 -
CodeChef - WIQ Waiting in a Queue
CodeChef - WIQ Waiting in a Queue数据结构题意一个队列里面有1到n,n个任务。每个任务有个准备时间,有个持续时间。从1时刻开始检查队列中的任务,遇到一个任务,如果他没准备好,那么把它移到队尾。如果他准备好了,那么做它,完事后就移除。思路代码#include<cstdio>#include<cstring>#include<iostream>#include<ve原创 2017-08-01 19:19:38 · 382 阅读 · 0 评论 -
HDU 5930 GCD
HDU 5930 GCD线段树上二分题意设计数据结构支持:单点修改查询整个区间以及每个子区间有多少种不同的区间gcd思路线段树上的二分。%%%大体思路是这样:初始区间给定后,可以计算出每个gcd有多少个区间,用g数组记录一下。(因为最大的数字不超过1000000) 线段树维护区间gcd。每次修改,假设修改pos处的值,先计算所有受pos影响的区间的gcd与个数,在g数组上减去这些;在线段树单原创 2017-08-12 02:11:35 · 514 阅读 · 0 评论 -
HDU 6069 Counting Divisors
2017多校4-3 Counting Divisors数论题意给你l,r,k。对于每个l到r之间的数i,统计iki^k的因子个数。求和。思路 设n=pc11pc22...pcmmn=p_1^{c_1}p_2^{c_2}...p_m^{c_m},则d(nk)=(kc1+1)(kc2+1)...(kcm+1)d(n^k)=(kc_1+1)(kc_2+1)...(kc_m+1)。 枚举不超过r√原创 2017-08-04 17:11:01 · 186 阅读 · 0 评论 -
HDU 6070 Dirt Ratio
2017多校4-4 Dirt Ratio线段树,二分法题意给你一个数列,求一个子区间,使得:区间内不同数字种类/区间内所有数字个数最小。输出最小值。思路 二分答案midmid,检验是否存在一个区间满足size(l,r)r−l+1≤mid\frac{size(l,r)}{r-l+1}\leq mid,也就是size(l,r)+mid×l≤mid×(r+1)size(l,r)+mid\times l原创 2017-08-04 16:51:47 · 207 阅读 · 0 评论