
我的OI学习足迹
我的OI学习足迹
Lynstery
一只蒟蒻
展开
-
[估算] 1011: [HNOI2008]遥远的行星
题意直线上N颗行星,X=i处有行星i。行星J受到行星I的作用力,当且仅当i<=A*J.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用。请计算每颗行星的受力,只要结果的相对误差不超过5%即可。 n<=100000题解神奇的题目。如果要算精确值好像只能O(n),但该题不要求输出精确的答案,只要用好一点的方法估算即可。第一原创 2017-02-20 22:27:03 · 632 阅读 · 0 评论 -
[递推] BZOJ2656: [Zjoi2012]数列(sequence)
题意 T组询问,每次给定n,输出An。 T<=20, n<=10^100题解这道题容易想太多,其实不用对递推式进行什么处理,只需要用特别的方法记忆化即可。 注意到虽然n的范围大,但真正有用的很少。 例如当n=31时: 有用的节点只有O(logn)个,如果我们能实现记忆化,可以实现logn的复杂度,再搞个高精即可。 但是数字这么大,如何记忆化呢?实际上从上图我们已经可以发现,只需要一对原创 2017-02-16 13:59:11 · 551 阅读 · 0 评论 -
[弦图最小染色] BZOJ1006: [HNOI2008]神奇的国度
题意K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2…An之间仅存在N对认识关系:(A1A2)(A2A3)…(AnA1),而没有其它认识关系。全民比赛时,为了防止做弊,规定任意一对相互认识的人不得在一队,国王想知道,最少可以分多原创 2017-02-20 19:32:15 · 769 阅读 · 0 评论 -
[递推] BZOJ1037: [ZJOI2008]生日聚会Party
题意有n个男孩和m个女孩,排成一个n+m的序列,满足对于任意连续的一段,男孩与女孩的数目之差不超过a。求方案数。 n,m ≤ 150,k ≤ 20题解肯定朝递推的方向思考。如果序列前i个已经合法,现在多填入一个i+1,设男孩为1,女孩为-1,那么只需要考虑所有后缀和的绝对值是否小于等于a即可。 我们的关注点就在所有的后缀和上。每次填入一个数,所有后缀和都将+1-1,且多生成了一个1/-1的后缀原创 2017-02-20 20:35:28 · 446 阅读 · 0 评论 -
[莫队] BZOJ2038: [2009国家集训队]小Z的袜子(hose)
题意给出n个数字m次询问,每次询问在区间[li,ri][li,ri][li,ri][li,ri]之间任选两个数字相等的概率是多少.(n,q<=50000)题解莫队模板题。 所谓莫队其实就是个高逼格的暴力,想法特别简单,不赘述了。 对于这题,我们设sum[i]表示区间[L,R]中i出现次数,则概率为: ∑C(sum[k],2)C(R−L+1,2) \frac{\sum C(sum[k],2)}{原创 2017-04-21 08:02:17 · 463 阅读 · 0 评论 -
windows 环境下c++系统栈大小调整
在用gcc/g++编译时指定参数 -Wl,--stack=size size是栈的大小,单位为字节。 比如我现在要编译一个名为hh的c++程序,栈的大小要16M,就这样 如果是像本蒟蒻一样用dev-c++的,那么可以 点编译选项,然后 就可以了原创 2017-04-23 20:19:55 · 3572 阅读 · 0 评论 -
[树上莫队] SPOJ COT2 Count on a tree II
题意给定n个节点的一棵树,每个节点上都有一个数字。 m次询问,没次求u到v的路径上有几种不同的数字。题解树上莫队经典题。 首先要会树分块,见bzoj1086: [SCOI2005]王室联邦。 与普通莫队类似,记dfn[x]为x的入栈时间戳,我们按(belong[U], dfn[V])排序所有询问。 显然分块完后属于同一块的最远点对距离不超过块的大小, 而且考虑括号序列,dfn[V]递增的话原创 2017-04-26 18:57:56 · 750 阅读 · 0 评论 -
[带修莫队] BZOJ2120: 数颜色
题意给出一个n个元素的序列a。执行m次操作: 1. Q L R代表询问[L,R]有几种不同的数字。 2. R x y 把第a[x]改为y。题解带修莫队裸题。 怎么搞带修莫队呢?就是加一维时间,然后对L,R都分块。块的大小定为n23n^{\frac{2}{3}} 。 具体来说,先对L分块,对与同一L块中再对R分块。 bool operator < (const data1 &b)con原创 2017-04-27 22:18:36 · 1049 阅读 · 1 评论 -
[矩阵乘法+KMP] BZOJ1009: [HNOI2008]GT考试
题意阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。 他的不吉利数学A1A2…Am(0<=Ai<=9)有M位,不出现是指X1X2…Xn中没有恰好一段等于A1A2…Am。可以有前导0。 求不出现不吉利的数字的方案数。 N<=1e+9 M<=20题解考虑到之前求方案数比较难求,肯定需要递推求解。 注意到在准考证号中找不吉利数字有原创 2017-02-20 19:57:07 · 866 阅读 · 0 评论 -
KMP——模板整理
用于字符串匹配问题。 时间复杂度O(n+m)#include<cstdio>#include<cstring>char a[100005],b[100005];int nxt[100005],len1,len2;void make_nxt(){ nxt[1]=0; int j=0; for(int i=2;i<=len2;i++){ while(j&原创 2017-02-21 19:55:59 · 506 阅读 · 0 评论 -
后缀数组之倍增算法——学习笔记
什么是后缀:一个字符串从某位开始到其末尾的子串。 什么是后缀数组:一个字符的所有后缀从小到大排列所形成的的数组。 后缀数组可以解决很多的字符串问题,本文主要写的是构造后缀数组的倍增算法。 暴力构造:直接把n个后缀排序,因为比较字符串需要O(n)O(n)的时间,所以总复杂度O(n2log2n)O(n^2log_2n)。 这样完全没有利用到n个元素都是某一字符串的后缀这个特性,如何改进呢? 倍原创 2017-02-27 19:33:45 · 840 阅读 · 0 评论 -
AC自动机——学习笔记
什么是自动机是一种数学模型,大概就是由一堆状态和状态转移规则等东西构成,能与外界交换信息,并改变动作。 这个是理论上的东西,了解就行,对AC自动机的理解没有大影响。什么是AC自动机?通俗的讲就是在Trie上做kmp,处理多模式串匹配问题。 Trie 的每个结点就是一个状态,根结点是初始状态。 AC自动机的行为被定义为一下3个函数: 1. next函数 ch(q,a):返回从当前状态q走值为a原创 2017-03-07 20:32:18 · 471 阅读 · 0 评论 -
[枚举] BZOJ1041: [HAOI2008]圆上的整点
题意求一个给定的圆(x^2+y^2=R^2),在圆周上有多少个点的坐标是整数 (R<=1e+9)题解就是把式子处理一下然后枚举。 显然我们只需计算出正整数解的个数ans,答案即是ans*4+4。 现在考虑求ans: x2+y2=R2x^2+y^2=R^2 x2=R2−y2x^2=R^2-y^2 x2=(R+y)∗(R−y)x^2=(R+y)*(R-y) 注意到左边是平方数,右边两数的乘原创 2017-03-13 20:56:57 · 572 阅读 · 0 评论 -
[dfs] BZOJ1053: [HAOI2007]反素数ant
题意 对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1,g(6)=4。 如果某个正整数x满足:g(x)>g(i) (0 < i < x)则称x为反质数。 现在给定一个数N,求不超过N的最大的反质数。 (N<=2000000000)题解先要观察出一些结论。 实际上我们并不用真正验证某数是否是反素数,考虑题目要求的是1~n中最大的反素数,显然答案的约数个数一定是1~原创 2017-03-18 08:08:23 · 605 阅读 · 0 评论 -
[DP] BZOJ1003: [ZJOI2006]物流运输
题意给出一个m个的无向图,你需要规划n天的运输方案。n天里,每天都要从S走到T走一次,每个点在某些天里不能经过。每天需要花费等于路径长度的代价,而且如果第i天选择的路径与第i-1天不同(i>1),还需要多花K的修改路线代价。求最小总代价。 (n<=100,m<=20)题解脑洞题,不算太难。可能一开始会想的比较远,如果考虑路径的变化,发现难以下手。实际上是个简单的线性DP。设f[i]表示前i天花费的原创 2017-02-11 21:58:19 · 445 阅读 · 0 评论 -
[斜率优化DP] BZOJ1096: [ZJOI2007]仓库建设
题意有N个工厂按编号顺序排成一条直线,第1个工厂到第i个工厂的距离为dis[i], 第i个工厂一开始堆积着p[i]个货物,现在要紧急把所有货物装进仓库里。在第i个工厂建仓库需要c[i]的代价,对于没有建立仓库的工厂,其货物应被运往其他的仓库进行储藏,且只能往编号大仓库的运,一件货物运送1个单位距离的代价是1。求把所有货物装进仓库的最小代价。 (n<=100000)题解显然是DP,要用到斜率优化。原创 2017-02-12 11:03:54 · 677 阅读 · 0 评论 -
[DP+容斥] BZOJ1042: [HAOI2008]硬币购物
题意有4种硬币。面值分别为c1, c2, c3, c4。 Q组询问,每次给出4种硬币的使用个数上限di,以及一个数S,求组合出S的总面值的满足限制条件的方案数。 di,S<=100000, Q<=1000题解注意到硬币个数对于所有询问时固定的且个数很少,我们肯定需要预处理一些东西。 先不考虑硬币个数的限制,刷一次普通的背包得到f[i],表示用4种硬币组合出i的总面值的方案数。 显然对于每次询原创 2017-02-28 08:37:03 · 438 阅读 · 0 评论 -
[置换群+背包] BZOJ1004: [HNOI2008]Cards
题意小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红,蓝,绿。 小春发明了M种不同的洗牌法,问Sun有多少种不同的染色方案。 两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)洗成另一种。 输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代 替,且对每种洗牌法,都存在一种洗牌法使得能回到原状态。 答案可能很原创 2017-04-09 19:43:02 · 459 阅读 · 0 评论 -
[DP] BZOJ1831: [AHOI2008]逆序对
题意给出一个n个数的数列,每个数都是-1或是一个在1~K之间的数。-1表示这个位置可以填任意的数字。 求最少能有多少个逆序对。 (n<=10000 K<=100)题解bzoj双倍经验题 1831=1786 首先需要得到一个显然的结论,对于一个数列,如果我们交换一对逆序的元素,总逆序对数一点小于之前的总数。所以我们填的-1一定是不降的。 所以-1之间不会产生任何代价。 先O(n∗k∗log2原创 2017-04-25 09:42:08 · 510 阅读 · 0 评论 -
[递推] BZOJ1019: [SHOI2008]汉诺塔
题意题解显然由于有优先级存在,操作序列是唯一的。 我们设g[i][x]g[i][x] 表示一开始有i个盘在x柱,经过一系列操作,他们都到了哪个柱子上。这是唯一确定的。我们再设这个过程的操作方案数为f[i][x]f[i][x]。 这样f[n][0]f[n][0] 就是答案了。(我们用0,1,2表示柱A,B,C) 如何递推呢?联系经典的汉诺塔递推,i是由i-1得来的,我们同样用这样的思路来分析。原创 2017-04-29 11:59:32 · 734 阅读 · 0 评论 -
[AC自动机 + DP] BZOJ1030: [JSOI2007]文本生成器
题意给出n个单词。若一个字符串至少包含一个单词,就称这个字符串是”可读的”。 求长度为m的”可读的”字符串个数。所有字符都在[A,Z]范围。 n,m<=100题解首先一步转化,我们从补集考虑统计ans表示一个单词都不包含的串数,则答案为m26−ansm^{26}-ans。 多串匹配问题肯定要想到AC自动机。 我们要求的是长度为m的字符串没有匹配任何串的方案数。 长度对应AC自动机上走的次数原创 2017-05-01 20:10:40 · 498 阅读 · 0 评论 -
[DP] BZOJ4300: 绝世好题
题意给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足b(i) and b(i-1)!=0 (2<=i<=len)。题解绝世傻逼题。只是来水一发blog 设f[i]表示以i为结尾的最长长度,推的时候对于2进制每位,记一下在这位上有1的所有a[i]对应的f[i]的最大值即可。 复杂度O(n∗log2a[i])O(n*\log_2 a[i])#include<cstdio>#inclu原创 2017-05-05 16:22:26 · 467 阅读 · 0 评论 -
[二分图最大匹配] BZOJ1059: [ZJOI2007]矩阵游戏
题意:给出一个n*n的黑白方阵。可以任意交换两行/列。问是否可以通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色。 题解:题目的目标是(1,1)(2,2)(3,3)…(n,n)均为黑色。思考后发现,这个状态的本质实际上就是n行n列都有着一一对应关系,且不管如何交换行列,这个关系都不会被破坏。 想到这一点就简单了。对与每个黑格(i,j)建边i - j,求一下二分图最大匹配原创 2017-02-12 10:54:20 · 469 阅读 · 0 评论 -
[动态点分治] BZOJ3730: 震波
题意给定N个点的一棵边权都为1的树,每个点有点权 。M次操作,两种类型 1.单点点权修改。 2.给出x和k,询问到x的距离不超过K的所有点权和。 操作加密,强制在线。 N,M<=100000题解动态点分治。 同样把信息收集到根。对于每个点分树,把所有点放到一个树状数组中,数状数组的下标即是到根的距离。要注意相同子树中的东西计算重复了,为了抠去重复部分,还需要对每个点分树再开一个数状数组,维原创 2017-02-15 14:35:50 · 725 阅读 · 0 评论 -
[二分图最大匹配] BZOJ1433: [ZJOI2009]假期的宿舍
题意题解大水题,二分图匹配。对与每个人向他能睡的床建边即可。#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=105, maxe=505;int n,m,_test,res[maxn];int fir[maxn],nxt[maxe],son[maxe],tot;b原创 2017-02-15 20:22:31 · 425 阅读 · 0 评论 -
[最小费用最大流] BZOJ2324: [ZJOI2011]营救皮卡丘
题意题解题目的意思即求K条路覆盖所有节点,走过的总路程的最小值,有一个限制条件就是当某个人从i走到j时,途径的节点都<=j。 对于这个限制条件,我们可以简单的floyd预处理出来,得f[i][j] 为i到j的最短路,且途中的点都<=max(i,j)。 我们需要简化模型:某个人走过的一条路径肯定是分阶段的,也就是说他从某节点i经过一系列合法点到j后,需要停一停等其他人开拓了一些节点再走。我们把某一原创 2017-02-16 09:00:22 · 540 阅读 · 0 评论 -
[最小割+对偶建图+最短路] BZOJ1001: [BeiJing2006]狼抓兔子
题意题解题意其实就是求最小割。但是发现点数和边数都特别大,直接上最大流肯定T了。那么如何转换呢? 对于可以画在一个平面且没有边相交的图,我们称之为平面图。平面图中的边把平面分割为一个一个面,本题的面即是一个个三角形。最外围的无穷大的面称为外部面。 所谓对偶建图即是把面当做节点,对于每条公共边界,对应的两个面之间连边。 对于最小割问题,我们就可以把S-T的一个割看成一条路径,其经过的边即是割掉的原创 2017-02-17 22:06:32 · 599 阅读 · 0 评论 -
[Prufer数列] BZOJ1005: [HNOI2008]明明的烦恼
题意给出n个节点的度数di,允许在任意两点间连线,可产生多少棵度数满足要求的树?若对度数不要求,则di=-1。 n<=1005;题解这道题需要知道Prufer数列的知识。 prufer数列是无根树的一种数列,数列与树两两对应。也就是说一种树只有唯一的一种数列来表示它。反过来给你一个数列,你总能把他转化成对应的唯一的树。 下面看数列和树是如何相互转换的: 树–>数列:每次选编号最小的叶节点(度原创 2017-02-19 23:19:59 · 487 阅读 · 0 评论 -
最小费用最大流(spfa增广)——模板整理
这个算法好像没名字。。就是每次spfa增广。 时间复杂度O(n*m^2*3)?#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int maxn=5005,maxe=100005;int n,m,nxt[maxe],S,T,fir[maxn],tot=原创 2017-02-21 19:35:52 · 1132 阅读 · 0 评论 -
动态树分治——模板整理
好像也不算什么模板。。。#include<cstdio>#include<queue>#include<algorithm>using namespace std;const int maxn=100005, maxe=200005;int n,m,w[maxn],last_print;int fir[maxn],nxt[maxe],son[maxe],tot;bool vis[max原创 2017-02-21 19:59:28 · 551 阅读 · 0 评论 -
[费用流] BZOJ1070: [SCOI2007]修车
题意同一时刻有N位车主带着他们的爱车来到了汽车维修中心。维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的。现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最小。 顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。 第一行有两个m,n,表示技术人员数与顾客数。 接下来n行,每行m个整数。第i+1行第j个数表示第j位技术人员维修第i辆车需要用的时原创 2017-03-09 19:32:41 · 532 阅读 · 0 评论 -
[最大流] BZOJ1066: [SCOI2007]蜥蜴
题意在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同原创 2017-03-15 09:05:50 · 511 阅读 · 0 评论 -
[二分 + 2-SAT] HDU3622: Bomb Game
题意给定平面上n对点,每对点必须且只能先一个。以选出的n个点做圆,这些圆不能有公共部分。求n个圆的半径的最小值的最大值。题解我的第一道2-SAT。 容易想到二分答案,每对点的选择可以看做是一个布尔变量,真表示取第一个,假表示取第二个。根据当前二分的半径可以判断出某两个点能否同时取到。这就得到了一堆限制。然后2-SAT进行验证即可。#include<cstdio>#include<cmath>#原创 2017-04-08 19:35:16 · 406 阅读 · 0 评论 -
BZOJ1016: [JSOI2008]最小生成树计数
题意现在给出了一个简单无向加权图。你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的)数据保证不会出现自回边和重边,具有相同权值的边不会超过10条。 1<=n<=100; 1<=m<=1000; 题解做这道题需要先推出一些结论。 如果把权值相同的边看做一个边组。则所有最小生成树中,每个边组所用的边都是固原创 2017-04-19 20:40:43 · 622 阅读 · 1 评论 -
[A*] 1975: [Sdoi2010]魔法猪学院
题意给出n个点的有向带边权的图。求最多有几条不同的从1到n的路径,使这些路径长度加和小于等于给定的一个值allw。 题解显然选的路径是前k短路。 对于前k短路的问题,我们可以用A∗A^*来优化暴力搜索。 我们知道,当A∗A^*的估价函数h(x)=实际需要的代价时,每一步都是最优的。这里实际上我们是可以做到这一点的,用反向建图的技巧即可求出每个点到终点n的实际距离,并把它作为n。显然如果不干掉访问原创 2017-04-22 19:38:41 · 560 阅读 · 0 评论 -
[树分块] 1086: [SCOI2005]王室联邦
题意国王想重新编制他的国家。他想把他的国家划分成若干个省。他的国家有n个城市,编号为1..n。 一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条直接或间接的道路。 每个省至少要有B个城市,每个省最多只有3B个城市。 每个省必须有一个省会,这个省会可以位于省内,也可以在该省外。但是该省的任意一个城市到达省会所经 过的道路上的城市(除了最后一个城市,即该省省会)都必须属于该省。一个城市原创 2017-04-24 21:26:25 · 597 阅读 · 0 评论 -
平衡树——Treap (含完整模板)
平衡树——Treap基本概念:二叉搜索树(BST): 对于任意根节点,满足左儿子的权值<根节点的权值<右儿子的权值的二叉树。也就是说,BST的前序遍历的结果是从小到大的。通过BST,我们可以进行插入,删除元素等操作,还能记录一些信息查询更多东西。所有的操作都可以O(h)实现。h在最好的情况下是logn,但是在最坏情况下,BST可能会退化成链,复杂度极不稳定。那么能不能想办法使其平衡呢?于是就有了平原创 2016-12-21 22:37:24 · 2890 阅读 · 0 评论 -
[树链剖分] BZOJ1036: [ZJOI2008]树的统计Count
题意给出一棵树,单调修改点权,询问路径点权和与点权最大值。解析树链剖分模板题,线段树只需要支持单点修改+区间询问即可。#include<cstdio>#include<algorithm>using namespace std;const int maxn=30005,maxe=60005;int n,Q,w[maxn],fir[maxn],nxt[maxe],son[maxe],tot;原创 2017-02-11 21:54:12 · 442 阅读 · 0 评论 -
[整体二分] BZOJ3110: [Zjoi2013]K大数查询
题意N个位置,M个操作。操作有两种: 1.在第a个位置到第b个位置,每个位置加入一个数c。注意是加入,也就是说这里的一个位置能放下多个数。 2.询问从第a个位置到第b个位置 的所有数中,第K大的数是多少。题解经典的整体二分题。 把所有操作排成一个序列,并二分答案mid。把当前操作序列中的所有插入的数大于mid的插入都执行一遍区间+1,对于每次询问即可求一次区间和得到比mid大的数有几个,原创 2017-02-12 10:34:26 · 530 阅读 · 0 评论 -
[动态点分治] BZOJ1095: [ZJOI2007]Hide 捉迷藏
题意给定N个节点的一棵树,一开始所有点都是黑色。需要执行Q个操作,操作有两种类型: 1.改变单点的颜色(黑变白,白变黑)。 2.询问最远黑色点对的距离。 N ≤100000, M ≤500000题解动态点分治经典题,一般和树上路径有关的题目都需要往这方面考虑。 对于每个点分树,我们把信息都收集到根节点上。 对于过某个根节点的路径,要求最长的一条:先对根节点的每个直接儿子求出以这个儿子为根的原创 2017-02-15 11:00:03 · 776 阅读 · 1 评论