- 博客(54)
- 收藏
- 关注
原创 bzoj 2654: tree 二分+最小生成树
题意给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。 题目保证有解。 n<=50000,m<=100000分析感觉这是一道比较巧妙的题目。 有一个很重要的想法就是我们可以使得所有白色边同时加上或减去一个数来控制我们使用的白边数量,那么我们就可以通过二分这个数使得其恰好包含我们所需要的白边数量。 还有一个细节,就是如果取mid时白边数量代码#inc
2017-05-31 21:10:51 423
原创 bzoj 3790: 神奇项链 manachar+dp+树状数组
题意母亲节就要到了,小 H 准备送给她一个特殊的项链。这个项链可以看作一个用小写字 母组成的字符串,每个小写字母表示一种颜色。为了制作这个项链,小 H 购买了两个机器。第一个机器可以生成所有形式的回文串,第二个机器可以把两个回文串连接起来,而且第二个机器还有一个特殊的性质:假如一个字符串的后缀和一个字符串的前缀是完全相同的,那么可以将这个重复部分重叠。例如:aba和aca连接起来,可以生成串aba
2017-05-31 19:50:04 366
原创 bzoj 3329: Xorequ 数位dp+矩阵乘法
题意 T<=1000,n<=10^18分析式子画一下就变成了x^2x=3x=x+2x 容易发现其实就是要求[1,n]内有多少个数满足其二进制任意相邻的两位不同时为1. 第一问的话随便数位dp一下就好了。 第二问的话,把dp式列出来,会发现答案就是斐波那契数列的第n+2项,直接矩阵乘法快速幂即可。代码#include<iostream>#include<cstdio>#include<cs
2017-05-31 16:56:56 388
原创 bzoj 3195: [Jxoi2012]奇怪的道路 状压dp
题意小宇从历史书上了解到一个古老的文明。这个文明在各个方面高度发达,交通方面也不例外。考古学家已经知道,这个文明在全盛时期有n座城市,编号为1..n。m条道路连接在这些城市之间,每条道路将两个城市连接起来,使得两地的居民可以方便地来往。一对城市之间可能存在多条道路。 据史料记载,这个文明的交通网络满足两个奇怪的特征。首先,这个文明崇拜数字K,所以对于任何一条道路,设它连接的两个城市分别为u和v,则
2017-05-28 16:30:44 685
原创 bzoj 4726: [POI2017]Sabota? 树形dp
题意某个公司有n个人, 上下级关系构成了一个有根树。其中有个人是叛徒(这个人不知道是谁)。对于一个人, 如果他下属(直接或者间接, 不包括他自己)中叛徒占的比例超过x,那么这个人也会变成叛徒,并且他的所有下属都会变成叛徒。你要求出一个最小的x,使得最坏情况下,叛徒的个数不会超过k。 n<=500000分析没想到啊2333设f[i]表示i带头不叛变需要的最小x。 那么f[i]=max(min(f[
2017-05-28 15:20:13 363
原创 bzoj 3306: 树 dfs序+线段树
题意给定一棵大小为 n 的有根点权树,支持以下操作: 换根 修改点权 查询子树最小值 n,q<=100000分析一开始还以为是某种神奇的lct姿势,后来想了一下,发现如果当前根在x的子树外的话x的子树就还是原来的子树,否则x当前的子树就是除了x的根所在的子树外的其他部分。 那么直接上线段树就好了。代码#include<iostream>#include<cstdio>#includ
2017-05-28 14:50:13 485
原创 bzoj 4305: 数列的GCD 数学
题意给出一个长度为N的数列{a[n]},1<=a[i]<=M(1<=i<=N)。 现在问题是,对于1到M的每个整数d,有多少个不同的数列b[1], b[2], …, b[N],满足: (1)1<=b[i]<=M(1<=i<=N); (2)gcd(b[1], b[2], …, b[N])=d; (3)恰好有K个位置i使得a[i]<>bi 注:gcd(x1,x2,…,xn)为x1,
2017-05-28 14:18:09 412
原创 bzoj 4278: [ONTAK2015]Tasowanie&bzoj 1692: [Usaco2007 Dec]队列变换 后缀数组+贪心
题意给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T。1<=n,m<=200000,1<=A[i],B[i]<=1000分析先把两个串放一起求sa,然后用两个指针维护两个串分别归并到哪一位,每次选字典序较大的即可。 证明看这里代码bzoj 4278#include<iostream>#include<cstdio>#include<cstdlib>#i
2017-05-28 11:30:13 322
原创 bzoj 2671: Calc 数学
题意给出N,统计满足下面条件的数对(a,b)的个数: 1.1<=a分析%各种大爷们代码#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>using namespace std;typedef long long LL;const in
2017-05-27 22:23:53 319
原创 bzoj 4129: Haruna’s Breakfast 树上带修改莫队+分块
题意有一棵树,每个节点有点权,要求资瓷单点修改和查询一条链上的mex。 n,m<=50000分析一开始想到了树上带修改莫队+分块,但是觉得应该还有更简单的办法,结果发现就是这样。。。 权当是复习树上莫队和带修改莫队吧。 树上莫队就是把这棵树的括号序(注意不是欧拉序)求出来然后就变成序列莫队了。 带修改的话就是加多一维表示修改到哪里。 其他的就是裸的求mex了。 没想到打的这么顺手。。。一
2017-05-26 20:52:18 379
原创 bzoj 3550: [ONTAK2010]Vacation 单纯形
题意有3N个数,你需要选出一些数,首先保证任意长度为N的区间中选出的数的个数<=K个,其次要保证选出的数的个数最大。 N<=200,K<=10。分析裸的单纯形,对偶都不用。 话说不知道裸的费用流能不能跑过去。算了一下貌似是可以的。不过懒得打了。代码#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#in
2017-05-24 21:28:44 511
原创 bzoj 1131: [POI2008]Sta 树形dp
题意给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 n<=1000000分析刷道水题压压惊先。。。 只要先求出以1为根的深度和,然后每次换根的时候算一下深度的变化就好了。代码#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using
2017-05-24 20:51:45 301
原创 bzoj 3875: [Ahoi2014]骑士游戏 spfa+dp
题意【故事背景】 长期的宅男生活中,JYY又挖掘出了一款RPG游戏。在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽。 【问题描述】 在这个游戏中,JYY一共有两种攻击方式,一种是普通攻击,一种是法术攻 击。两种攻击方式都会消耗JYY一些体力。采用普通攻击进攻怪兽并不能把怪兽彻底杀死,怪兽的尸体可以变出其他一些新的怪兽,注意一个怪兽可能经过若干次普通攻击后变回一
2017-05-24 20:13:38 284
原创 bzoj 1420&&bzoj 1319: Discrete Root 原根+BSGS+exgcd+模线性方程
题意已知k,a,p,求x ^ k=a (mod p)的所有根(根的范围[0,p-1])分析一开始看成是一道裸的BSGS,后来发现不是,然后就没思路了。p是素数!!! 话说原根真的超级强大。我们先找到p的原根g,然后设x=gy,a=gzx=g^y,a=g^z,z显然可以用BSGS来求出。 那么可以得到gyk=gz(modp)g^{yk}=g^z(\mod p) 根据原根的周期性,我们可以得到yk
2017-05-24 18:45:08 449
原创 bzoj 2333: [SCOI2011]棘手的操作 离线+线段树
题意有N个节点,标号从1到N,这N个节点一开始相互不连通。第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 x v: 将第x个节点的权值增加v A2 x v: 将第x个节点所在的连通块的所有节点的权值都增加v A3 v: 将所有节点的权值都增加v F1 x: 输出第x个节点当前的权值 F2 x: 输出第x个节点所在的连通块中
2017-05-23 21:54:32 397
原创 bzoj 4896: [Thu Summer Camp2016]补退选 字典树+vector
题意X是T大的一名老师,每年他都要教授许多学生基础的C++知识。在T大,每个学生在每学期的开学前都需要选课,每 次选课一共分为三个阶段:预选,正选,补退选;其中”补退选”阶段最忙碌。在补退选阶段,学生即可以选课,也 可以退课。对于X老师来说,在补退选阶段可能发生以下两种事件: 1:一个姓名为S的学生选了他的课(姓名S将出现在X的已选课学生名单中) 2:一个姓名为S的学生退了他的课(姓名S将从
2017-05-22 19:25:51 505
原创 bzoj 3112: [Zjoi2013]防守战线 单纯形
题意分析直接上单纯形。。。代码#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const double eps=1e-7;int n,m;double b[1005],c[10005],a[1
2017-05-21 21:19:42 269
原创 bzoj 1061: [Noi2008]志愿者招募 单纯形
题意申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管。布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者。经过估算,这个项目需要N 天才能完成,其中第i 天至少需要Ai 个人。 布布通过了解得知,一共有M 类志愿者可以招募。其中第i 类可以从第Si 天工作到第Ti 天,招募费用是每人Ci 元。新官上任三把火,为了出色地完成自己的工作,布布希望用尽量少的费用招募
2017-05-21 14:20:41 454
原创 bzoj 3144: [Hnoi2013]切糕 最小割
题意给出一个n*m*h的点阵,每个点有权值。现在要在每个纵轴上选一个点,满足所有相邻(四连通)的纵轴选择的点的高度差不超过d。求最小权值和。 n,m,h<=40分析在apio讲课的时候听过一点点,但当时只听了建模的一部分,然后就掉线了。我们先考虑没有限制d的情况,先将其强制转换成最小割模型,那么就是把所有纵轴上的点连成一条线,然后把每个点拆成两个点,就可以直接最小割了。 现在加上d的限制,那么我
2017-05-21 10:55:06 244
原创 bzoj 3142: [Hnoi2013]数列 数学
题意小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨。股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N。在疯涨的K天中小T观察到:除第一天外每天的股价都比前一天高,且高出的价格(即当天的股价与前一天的股价之差)不会超过M,M为正整数。并且这些参数满足M(K-1)分析懒得打了,题解代码#include<iostream>#include<cstdio>#include<cs
2017-05-21 10:13:43 323
原创 bzoj 3140: [Hnoi2013]消毒 dfs+网络流
题意最近在生物实验室工作的小T遇到了大麻烦。 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a、b、c 均为正整数。为了实验的方便,它被划分为a*b*c个单位立方体区域,每个单位立方体尺寸 为1*1*1。用(i,j,k)标识一个单位立方体,1 ≤i≤a,1≤j≤b,1≤k≤c。这个实验皿已经很久没有人用了,现在,小T被导师要求将其中一些单位立方体区域进 行消毒操作(
2017-05-19 15:47:38 312
原创 bzoj 4881: [Lydsy2017年5月月赛]线段游戏 树状数组+set
题意给出一个n的排列,求将该排列划分成两部分,使得其分别为上升序列的方案有多少种。答案模998244353. n<=100000分析一开始yy出了一个dp方程,看形式应该是可以用数据结构来优化的。 实际上有更简单的方法。 首先把无解的情况判掉。若最长下降子序列大于2的无解。 我们可以在两两逆序对之间连边,那么答案就是2^联通块数量。 对于每个连通块,我们将其最大的元素仍到set里面。每加入
2017-05-19 11:46:45 371
原创 bzoj 2213: [Poi2011]Difference 乱搞
题意已知一个长度为n的由小写字母组成的字符串,求其中连续的一段,满足该段中出现最多的字母出现的个数减去该段中出现最少的字母出现的个数最大。求这个个数。 该段必须出现两个以上不同的字母。 1<=n<=1000000分析这题的话,自己yy出来了一个很棒的做法,然后对于如何处理最小出现次数不能为0的条件,借鉴了一下题解的方法。 我的方法就是把每一种字母出现的位置分别记录下来,然后每次枚举两个字母,设
2017-05-19 10:10:06 412
原创 bzoj 2819: Nim 树状数组+dfs序
题意给一棵树,要求资辞两个操作: Q x y询问x到y路径上的异或和是否为0. C x y将x的权值改为y n,q<=500000分析这题一眼过去的想法就是树剖嘛,结果log2发现会爆炸。。。 其实我们只要维护每个点到根的路径异或和就好了。 那么考虑每修改一个点会影响到哪些点,显然就是它子树内的点啦! 那么我们只要用dfs序或树剖序,然后每次修改的时候用树状数组差分一下就好啦。 我打的
2017-05-18 21:50:36 233
原创 bzoj 3594: [Scoi2014]方伯伯的玉米田 二维树状数组优化dp
题意方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美。 这排玉米一共有N株,它们的高度参差不齐。 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列。 方伯伯可以选择一个区间,把这个区间的玉米全部拔高1单位高度,他可以进行最多K次这样的操作。拔玉米则可以随意选择一个集合的玉米拔掉。 问能最多剩多少株玉米,
2017-05-18 17:19:34 299
原创 bzoj 3288: Mato矩阵 线性筛
题意Mato同学最近正在研究一种矩阵,这种矩阵有n行n列第i行第j列的数为gcd(i,j)。 例如n=5时,矩阵如下: 1 1 1 1 1 1 2 1 2 1 1 1 3 1 1 1 2 1 4 1 1 1 1 1 5 Mato想知道这个矩阵的行列式的值,你能求出来吗? 答案模10^9+7 n<=1000000分析一开始想到可以先根据高斯消元推出来把该矩阵消成下三角矩阵后对角线上的
2017-05-18 15:04:20 318
原创 bzoj 4653: [Noi2016]区间 线段树
题意在数轴上有 n个闭区间 [l1,r1],[l2,r2],…,[ln,rn]。现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置。换句话说,就是使得存在一个 x,使得对于每一个被选中的区间 [li,ri],都有 li≤x≤ri。 对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度。区间 [li,ri] 的长度定义为 ri−li,即等于它的右端点的值减去左
2017-05-18 12:42:15 259
原创 bzoj 4878: [Lydsy2017年5月月赛]挑战NP-Hard dfs
题意给出一个无向图,要你解决两个问题中的一个:给每个点染色使得每条边两个端点的颜色不同;找出一条长度为k的简单路。 n<=1000,m<=10000,多组数据分析这题在apio讲课的时候讲过。。。 首先找出原图的一棵dfs树,很显然dfs树上只有返租边没有横插边。 那么如果dfs树的深度大于k的话显然可以找到一条长度等于k的简单路,否则的话把每个点的颜色设为其深度即可。代码#include<i
2017-05-17 18:16:24 499
原创 bzoj 2795: [Poi2012]A Horrible Poem hash
题意给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节。 如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到。 n<=500000,q<=2000000分析一开始啥都想不到,然后才发现原来正解就是暴力。对于每一个区间,设其长度为len,其循环长度一定为n的约数。那么我们可以枚举循环节长度,是否是循环节的话就可以用hashO(1)判断了。 问题是这样比
2017-05-16 17:44:54 605 1
原创 bzoj 2789: [Poi2012]Letters 树状数组求逆序对
题意给出两个长度相同且由大写英文字母组成的字符串A、B,保证A和B中每种字母出现的次数相同。 现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B。 n<=1000000分析贪心的想,显然每个字符会移到离它最近的相同的字符处那么我们只要把对应的位置序列求出来,然后用树状数组求个逆序对就好了。代码#include<iostream>#include<cstdio>#inclu
2017-05-16 09:43:03 288
原创 bzoj 2085: [Poi2010]Hamsters hash+倍增floyd
题意给定n个长度总和不超过10W的字符串,求一个最短的母串,使所有字符串的出现次数之和=m 这n个字符串保证不互相包含分析一开始题目没有给出字符串总长,以为就是AC自动机上dp+矩阵乘法随便优化一下就好了。。。既然不能对长度和字符集dp,那我们就可以考虑对字符串dp。 设f[i,j]表示j接到i后面最少增加多少个字符。 看到m辣么大,很容易想到倍增,那我们就可以用f[i,j,k]表示i后面接长度
2017-05-16 09:01:05 281
原创 bzoj 2276: [Poi2011]Temperature 单调队列
题意某国进行了连续n天的温度测量,测量存在误差,测量结果是第i天温度在[l_i,r_i]范围内。 求最长的连续的一段,满足该段内可能温度不降。 n<=1000000,-10^9<=li,ri<=10^9分析设i之前的连续若干个区间的最大下界为mx,那么只要r[i]>=mx则i可以接到这若干个后面。 那么我们就用一个单调队列来维护区间下界的最大值就好了。代码#include<iostream>
2017-05-15 18:45:33 401
原创 bzoj 2088: [Poi2010]Teleportation 分层图
题意Zy大帝拥有n个星球,因为距离非常遥远,所以Zy在他所居住的1号星球和他的军事基地霸中所在的2号星球建造了两个传送门,这样从1号星球到2号星球就只需要250分钟,回去也一样(双向)。由于科技的发展,各个星球陆陆续续建造了和自己居民最经常去的星球之间的传送门,并且他们的传送门只需要1个小时(真快啊!),他们发现和别的星球建设传送门对促进经济发展有很大的帮助,于是向和其他所有星球建设传送门发展,Zy
2017-05-15 18:04:44 369
原创 bzoj 2090: [Poi2010]Monotonicity 2 动态规划+线段树
题意给出N个正整数a[1..N],再给出K个关系符号(>、<或=)s[1..k]。 选出一个长度为L的子序列(不要求连续),要求这个子序列的第i项和第i+1项的的大小关系为s[(i-1)mod K+1]。 求出L的最大值。 N, K <= 500,000分析一开始很显然的暴力想法就是f[i,j]表示序列的第i位匹配是否能到关系序列的第j位,然后用数据结构维护一下就好了。复杂度是n^2log,显
2017-05-15 15:36:13 384
原创 bzoj 2093: [Poi2010]Frog 倍增
题意一个条河无限宽,上面有n块石头,石头离左边的河岸(无限宽,右边河岸不晓得在哪)距离严格递增,现在Zxl想锻炼自己的跳跃能力(谁叫他在班里外号是鸟怪。。畸形),他在某一块石头上,想跳到离他这块石头第k远的石头上去,假如离他第k远的石头不是唯一的,他就选离岸最近的那一个(不然回不去了),他想你让他知道,从每块石头开始跳了m次后,自己在哪。 n, k <= 1,000,000, m <= 10^18
2017-05-15 11:25:04 415
原创 bzoj 2091: [Poi2010]The Minima Game 动态规划
题意给出N个正整数,AB两个人轮流取数,A先取。每次可以取任意多个数,直到N个数都被取走。 每次获得的得分为取的数中的最小值,A和B的策略都是尽可能使得自己的得分减去对手的得分更大。 在这样的情况下,最终A的得分减去B的得分为多少。 N <= 1,000,000分析我们把所有数从小到大排好序后,很显然每次都是取最后面连续的一段。 我们不难发现从后往前推的话不是很好转移,那么就考虑从前往后转移
2017-05-15 10:31:29 296
原创 bzoj 2095: [Poi2010]Bridges 二分答案+网络流
题意YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛。现在YYD想骑单车从小岛1出发,骑过每一座桥,到达每一个小岛,然后回到小岛1。霸中同学为了让YYD减肥成功,召唤了大风,由于是海上,风变得十分大,经过每一座桥都有不可避免的风阻碍YYD,YYD十分ddt,于是用泡芙贿赂了你,希望你能帮他找出一条承受
2017-05-15 09:37:52 354
原创 bzoj 2086: [Poi2010]Blocks 单调栈
题意给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1。经过一定次数的操作后,问最大能够选出多长的一个连续子序列,使得这个子序列的每个数都不小于k。 总共给出M次询问,每次询问给出的k不同,你需要分别回答。 N <= 1,000,000,M <= 50分析蛮巧妙的一道题。首先很
2017-05-13 18:32:12 282
原创 bzoj 2527: [Poi2011]Meteors cdq分治+树状数组
题意有N个成员国。现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站。 这个星球经常会下陨石雨。BIU已经预测了接下来K场陨石雨的情况。 BIU的第i个成员国希望能够收集Pi单位的陨石样本。你的任务是判断对于每个国家,它需要在第几次陨石雨之后,才能收集足够的陨石。 1<=n,m,k<=3*10^5 1<=Pi<=10^9 1<=Ai<1
2017-05-11 20:53:49 285
原创 bzoj 2216: [Poi2011]Lightning Conductor 决策单调性+cdq分治
题意已知一个长度为n的序列a1,a2,…,an。 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt(abs(i-j)) 1<=n<=500000分析随手化简就可以得到p>=aj-ai+sqrt(|i-j|) 我们发现其实只要求max(aj+sqrt(|i-j|))就好了。不难发现这是有决策单调性的,那么就可以用整体二分来实现。 具体方
2017-05-09 21:56:53 684
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人