
--------------其他--------------
文章平均质量分 83
Lynstery
一只蒟蒻
展开
-
[递推] 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 评论 -
[弦图最小染色] BZOJ1006: [HNOI2008]神奇的国度
题意K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2…An之间仅存在N对认识关系:(A1A2)(A2A3)…(AnA1),而没有其它认识关系。全民比赛时,为了防止做弊,规定任意一对相互认识的人不得在一队,国王想知道,最少可以分多原创 2017-02-20 19:32:15 · 769 阅读 · 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 评论 -
[递推] 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 评论 -
[递推] 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 评论 -
[树上带修莫队] BZOJ3052: [WC2013]糖果公园
题意题解树上带修莫队经典题。 有了前面的铺垫:普通带修莫队和普通树上莫队,这题就不在话下了。 答案和走的顺序无关,只和每种糖果吃到几次有关,显然可以O(1)移动维护。 然后就没有然后了……树上带修莫队即可。 这题有点常数问题,在UOJ上被卡了半天90分。最后把块大小调小一些就过了。 好像实际情况下带修莫队块大小不一定是n2/3n^{2/3} 最优,个人感觉稍微调小一点可能效果更好。#inc原创 2017-05-11 21:23:26 · 755 阅读 · 0 评论 -
读入优化新姿势——学习笔记
震惊!99.9%的oier都不知道。用了此方法,暴力立马变标算!最近学习了一个新的函数fread,可以从文件中整块读入信息,速度很快。基于这个函数,我们可以写一个新的getchar():inline char gc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,1原创 2017-05-24 08:46:07 · 659 阅读 · 0 评论 -
windows 环境下c++系统栈大小调整
在用gcc/g++编译时指定参数 -Wl,--stack=size size是栈的大小,单位为字节。 比如我现在要编译一个名为hh的c++程序,栈的大小要16M,就这样 如果是像本蒟蒻一样用dev-c++的,那么可以 点编译选项,然后 就可以了原创 2017-04-23 20:19:55 · 3572 阅读 · 0 评论 -
Codeforces #206(Div.1) C. Vasya and Beautiful Arrays
题意给出n个数字,和K。每个数字ai可以变成[ai-K,ai]范围内的值。求所有数gcd起来最大值。题解水水的小题,这种题目要做到准确快速。 可以想到枚举公因数g,然后判断n个数是否可能是g的倍数。 很简单,对于每个g的倍数g∗ig*i,取n个数落在[g∗i,g∗i+K][g*i,g*i+K]中的个数。如果总数为n,则可行。 要注意区间可能重叠,不能算重。#include<cstdio>#i原创 2017-05-26 07:59:49 · 586 阅读 · 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 评论 -
[分治] 51nod 算法马拉松25 C. 区间计数
题意题解按照惯例,%%% manchery大神 这题就是一个分治。 每次强行把序列分成两半,统计跨过中线的所有合法区间中的方案数。 如何搞呢? 对于最大值的位置来分类讨论4种情况: 1. a,b最大值都落在左边。 2. a,b最大值都落在右边。 3. a在左,b在右。 4. a在右,b在左。 如果左右最大值都有,我们可以做个规定,它最大值就看作在左边,这样就能避免计算重复。原创 2017-05-28 15:36:52 · 874 阅读 · 0 评论 -
[排列组合 + 分段打表] 51nod 算法马拉松25 A. 二分答案
题意题解分析一下可得,如果二分最后要停在k位置,需要有一些位置上的值满足与m的一些大小关系,而且关系都是确定的。 直接模拟一趟就可以得到:有num1个位置需要满足a[i]<=ma[i]<=m,有num2的位置需要满足a[i]>ma[i]>m,其他位置显然可以随便乱放,因为根本就不会访问到它们。 这样就能直接写出答案的表达式了: Pnum1m∗Pnum2n−m∗(n−num1−num2)!P_m原创 2017-05-28 22:39:55 · 1002 阅读 · 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 评论 -
[递推] 51nod 算法马拉松25 B. 完美序列
题意如果一个序列的相邻两项差的绝对值小于等于1,那么我们说这个序列是完美的。 给出一个有序数列A,求有多少种完美序列排序后和数列A相同。 n<=30000 每个数<=10^9,每个数出现次数<=100题解首先我们要想到从小到大考虑,不断的把数插入。 这样搞有什么好处呢?当要把i插入时,因为当前序列中所有数都比i小,所以i只能插到相邻两个i-1之间,或者边界有i-1的。 从这个角度,我们就能原创 2017-05-31 08:49:59 · 951 阅读 · 2 评论 -
[分治 + 最短路] BZOJ4456: [Zjoi2016]旅行者
题意给出一个n行m列的网格图,每个点与上下左右相邻4个点有双向边。 询问Q次,每次求两点最短路。 n*m<=20000,Q<=100000题解分治这个考虑方向还是容易想到的。 就是每次选长的那一边切成两半。 对于一个询问,若两点在异侧,则最短路一定经过中线。若两点在同侧,最短路可能经过中线。 以中线上的每个点为源点刷最短路,更新答案。 异侧的询问已经对了就不需要递归下去,其他的询问根据两原创 2017-06-05 21:32:42 · 534 阅读 · 0 评论 -
主定理——学习笔记
刚刚发现自己以前认为的递归算法复杂度分析都是错的…… 主定理:(以下摘自算导) 另a≥1a\ge1和b>1b>1是常数,f(n)f(n)是一个函数,T(n)T(n)是定义在非负整数上的递归式:T(n)=aT(n/b)+f(n)T(n)=aT(n/b)+f(n) 其中n/bn/b 被解释为⌊n/b⌋\lfloor n/b\rfloor或⌈n/b⌉\lceil n/b\rceil。(对以下结果无影原创 2017-06-05 22:35:13 · 1188 阅读 · 0 评论 -
[上下界网络流] BZOJ2406: 矩阵
题意题解求最小值的最大值,容易想到二分答案。 对于当前二分的mid,现在就要考虑怎么验证,实际上就是要满足形如:∣Asum[i]−Bsum[j]∣≤mid\lvert A_{sum}[i]-B_{sum}[j]\rvert \le mid 的所有不等式都成立。 变形一下可以得到:Asum[i]−mid≤Bsum≤Asum[i]+midA_{sum}[i]-mid\le B_{sum} \le A原创 2017-06-30 11:35:21 · 524 阅读 · 1 评论 -
[二分+容斥+莫比乌斯函数] BZOJ2440: [中山市选2011]完全平方数
题意求从小到大第k个无平方因子数是多少。(原题面表述略有问题) k<=1e+9题解这题与反演无关,就用到了莫比乌斯函数。 首先肯定二分答案然后验证,现在问题转化为了求[1,mid]中无平方因子数的个数。 怎么求呢?考虑容斥,(p是1~sqrt(m)内的质数集) 总个数=[(pi)2的倍数]−[(pi∗pj)2的倍数]+[(pi∗pj∗pk)2的倍数]−[(pi∗pj∗pk∗pt)2的倍数].原创 2017-07-02 16:36:26 · 467 阅读 · 2 评论 -
[莫比乌斯反演+容斥+分块求和] BZOJ2301: [HAOI2011]Problem b
莫比乌斯反演经典入门题。 首先用容斥,把问题转化为1<=x<=n且1<=y<=m的。 设f(i)f(i) 表示满足gcd(x,y)等于i的有序数对(x,y)的个数。(1<=x<=n且1<=y<=m) 构造F(i)=∑i|df(d)F(i)=\sum_{i|d}f(d),即满足i|gcd(x,y)的有序数对(x,y)的个数。 F(i)F(i)很好求,只有x和y都是i的倍数即可,所以F(i)=⌊原创 2017-07-02 16:39:12 · 607 阅读 · 2 评论 -
[动态MST] [CDQ分治] BZOJ2001: [Hnoi2010]City 城市建设
题意PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁。Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费。Louis希望建造最少的道路使得国内所有的城市连通。但是由于某些因素,城市之间修建道路需要的花费会随着时间而改变,Louis会不断得到某道路的修建代价改变的消息,他希望每得到一条消息后能立即知道使城市连通的最小花费总和, Louis决定求助于你原创 2017-07-11 22:53:40 · 568 阅读 · 0 评论 -
[Tarjan+Bitset]BZOJ2208: [Jsoi2010]连通数
题意定义一个有向图的连通数为图中可达点对的个数(有序点对)。 给出一个N个点的有向图,求连通数。 n≤2000n \le 2000题解先Tarjan缩点,然后典型的在DAG上做传递闭包,用bitset优化。 复杂度O(n∗m/64)O(n*m/64)#include<cstdio>#include<cstring>#include<queue>#include<algorithm>#i原创 2017-07-06 12:29:44 · 518 阅读 · 0 评论 -
[生成函数+容斥+FFT] BZOJ3771: Triple
题意给出n个物品,每个物品有一个价值Ai。可以选一个或两个或三个,求每种可能的总价值的选取方案。 Ai≤40000Ai \le 40000题解题面好有趣…… 考虑构造普通型生成函数A(x),表示取一个的方案。 答案肯定不能直接A3+A2+AA^3+A^2+A,因为一个物品可能被取了多次,考虑如何去重。 取一个就是AA 没错, 取两个是(A2−B)/2(A^2-B)/2,BB是取相同的两个的原创 2017-07-20 13:39:54 · 581 阅读 · 0 评论 -
[分治] 51nod算法马拉松27 A.合法括号子段
题意有一个长度为 nn 的括号序列,现在要计算一下它有多少非空子段是合法括号序列。 合法括号序列的定义是: 1.空序列是合法括号序列。 2.如果 SS 是合法括号序列,那么 (S)(S) 是合法括号序列。 3.如果 AA 和 BB 都是合法括号序列,那么 ABAB 是合法括号序列。 n<=1100000n<=1100000题解AA 题还是挺水的吧…… 把左括号看 +1+1 ,右括号看成原创 2017-07-30 21:59:26 · 817 阅读 · 0 评论 -
[贪心+堆] BZOJ1150: [CTSC2007]数据备份Backup
题意直线上有n个点,选K对点之间连线,一个点只能连出去一条线,求连线的总长度的最小值。 n<=1000000,k<=n/2题解贪心真可怕…… 显然要连肯定是连相邻的。我们把n-1个相邻差值拿出来,问题转换为n-1个数中取K个不相邻的数的和的最小值。 n比较大,考虑贪心: 如果我取了最小的数会怎么样呢?显然是不对的: 例如:2 1 2 100, 取2个 如果第一次取了 11,之后只能取 1原创 2017-07-23 10:52:33 · 736 阅读 · 2 评论 -
[hash+随机] 2017 计蒜之道初赛第五场UCloud 的安全秘钥
题意给出一个长度为 nn 的串 ss,每次询问求给出串tt,求 ss 的子串中与 tt 近似匹配 的个数。 定义 aa 与 bb 近似匹配: 1.∣a∣=∣b∣∣a∣=∣b∣,即 aa 串和 bb 串长度相等。 2.对于每种数字 xx,xx 在 aa 中出现的次数等于 xx 在 bb 中出现的次数。 n≤50000,∑|t|≤100000 n \le 50000, \sum |t| \le原创 2017-08-01 16:15:10 · 431 阅读 · 0 评论 -
[分治+floyed] 2016 计蒜之道 复赛 A 百度地图的实时路况
题意戳这里题解容易想到 floyedfloyed 干的就是类似的事情。 但是我们算点 ii 的答案时,其他点都要插入。 我们分治搞就行了,分治到单一节点时进行答案查询。 #include<cstdio>#include<algorithm>using namespace std;typedef long long LL;const int N=305;int n,a[N][N];L原创 2017-08-01 15:47:54 · 480 阅读 · 0 评论 -
[数学杂题]Codeforces #419(div1) 815B. Karen and Test
题意戳这里题解好神奇的思路…… 这题如果都是加法的话就很简单了,直接组合数算每个数的贡献即可。 如果这样正负交替出现怎么办呢,通过观察,可以发现一些东西。丢官方图: 当 nn 为偶数的时候,可以分别看奇数项和偶数项(上图蓝色和黄色),可以发现它们上下的关系和都是加法的情况一样! 最后只需要把奇,偶的贡献和相加或相减即可。 如果 nn 为奇数,我们手动推第一层,就发现转化成偶数了。#incl原创 2017-08-09 23:12:03 · 372 阅读 · 0 评论 -
计蒜客 2017 NOIP 提高组模拟赛(一)题解
最近做了一下这个,所以来写份题解。day1T1 以前做过差不多的题,就是把矩阵转45度,然后就可以二维前缀和了。T2 一条边对答案的贡献即经过它的路径的总条数,就等于删去这条边后得到的两个子树的点数乘积。 每次直接 O(1)O(1) 改一下就好了。T3 直接 DPDP, f[i][j][k]f[i][j][k] 表示走到位置 (i,j)(i,j) ,已经用了 kk 次技能的受伤最小值。原创 2017-08-09 23:34:39 · 1819 阅读 · 0 评论 -
[结论] LibreOJ #520. 「LibreOJ β Round #3」绯色 IOI(开端)
题意戳这里题解这是一道结论题。 我们先把数放到数轴上考虑。定义两个点的距离为几何上的距离的平方。 我们可以把一个回路看作两条从 11 到 nn 的不相交的路径。 有一种经典的二路取数的 O(n2)DPO(n^2)DP,但是会 TT 掉,且很难进一步优化。 怎么办呢?只能观察性质了,这里有一个很强的结论: 除了最两端的 (1,2)(1,2) 和 (n−1,n)(n-1,n),其他两个相邻的点原创 2017-08-10 12:49:41 · 668 阅读 · 0 评论 -
[分治] Codeforces#415 (Div. 1) 809A. Do you want a date?
题意给出一个n个元素的数集。 求这个集合的所有非空子集的权值和。一个集合 AA 的权值定义为:maxi,j∈A |i−j|\max_{i,j \in A}\ |i-j| 题解集合的权值只由最大和最小的两个数决定,所以可以想到给 nn 个数排序,题目转换为: 定义一个区间 [L,R][L,R] 的权值为 (a[R]−a[L])∗2R−L−1(a[R]-a[L])*2^{R-L-1} 。求所有子区间原创 2017-08-11 23:25:20 · 363 阅读 · 0 评论 -
[结论题+枚举] HDU6055:[2017 多校-第2场] Regular polygon
题意给出坐标系中的n个整点(x,y都是整数)。求正多边形的个数。 坐标范围 [−100,100][-100,100], n≤500n \le 500 题解直接贴结论: 整点正多边形只有正四边形。 不会很严格的证明,不过可以大概感受一下: 网格中斜的边长度一定不等于水平或竖直的边。所以正多边形中,要么都是水平或竖直的边(只能是正方形),要么都是斜的边。 考虑边都是斜的情况,边都要相等的话,边于原创 2017-07-28 15:32:20 · 414 阅读 · 0 评论 -
[容斥] Codeforces#428 (Div. 2) 839D. Winter is here
题意给出一个数集,求所有非空子集的权值和。 定义一个集合的权值为:若所有元素的gcd=1则权值为0,否则权值为所有元素的gcd乘以集合大小。 n≤100000,数字范围≤1000000 n \le 100000,数字范围 \le 1000000题解其实是道挺简单的题目,但是因为之前没做过类似的 gcdgcd 的容斥的题,所以当时没做出来。 有这样一个显然的东西:考虑所有d的倍数的数构成的集合,原创 2017-08-14 21:39:35 · 467 阅读 · 0 评论 -
[递推] HDU6146 Pokémon GO
题意戳这里题解显然要步数最小就是每个格子刚好走一次。 枚举起始位置,然后考虑怎么能怎么走。 大力分类讨论一下可以发现我们只需要知道两个东西就可以了。 一个是 did_i 表示在 2∗i2*i 的网格的右上角,遍历所有的格子一次后停在气势位置下方的方案数。 显然 di=di−1∗2d_i=d_{i-1}*2 . 还有一个是 fif_i 表示在 2∗i2*i 的网格的右上角,遍历所有的格子的方原创 2017-08-26 17:40:20 · 565 阅读 · 0 评论 -
[栈] brackets 括号序列
这是一道傻逼题,就是有 ()[]()[] 两种括号的一个序列,求最长合法括号序列子段。n≤105n \le 10^5 以前在cf上做过类似的,我好像是分治搞的……真是学傻了…..所以在这里记一下。 实际上用栈搞一下就好了,我们知道一个合法括号序列插入栈之后就为空了,子段也一样。不断插入时统计答案。#include<cstdio>#include<cstring>#include<algori原创 2017-09-23 22:13:07 · 438 阅读 · 0 评论 -
[主席树+哈希] Codechef June Challenge 2017 #CLONEME
主席树+哈希套路。通过哈希做到快速比较一些东西是否相等,很可能和字典序什么的有关。这题就是利用哈希,在主席树上二分一样地走,找到从左边开始第一个不一样的和从右边开始第一个不一样的,然后xjb判断一下就好了。#include<cstdio>#include<algorithm>#define Lh ch[0]->hsh#define Rh ch[1]->hsh#define Ls ch[0]-原创 2017-09-19 17:50:27 · 413 阅读 · 0 评论 -
[贪心] BZOJ2006: [NOI2010]超级钢琴
经典题。 超级钢琴模型。取前k个最优的问题,总状态太多时,尽量根据显然的优劣关系,减少当前待选最优值,用堆搞,取了一个之后放出后续可能有用的。#include<cstdio>#include<queue>#include<cmath>#include<algorithm>#define Fir first#define Sec secondusing namespace std;con原创 2017-09-19 18:07:09 · 416 阅读 · 0 评论 -
[离线+树状数组] HDU5869 Different GCD Subarray Query
对于这种询问有多少个不同的东西,有比较套路的方法是把询问离线,然后同种元素的贡献记在最近的位置上。比如 BZOJ1878 [SDOI2009]HH的项链 这题也是类似的做法,只是一个点上的元素不是1个而是log V个。所以就 O(nlog2n)O(nlog^2n)#include<cstdio>#include<cstring>#include<vector>#include<algorit原创 2017-09-19 18:13:29 · 459 阅读 · 0 评论 -
[除法分块] Codeforces 830C Bamboo Partition
#include<cstdio>#include<algorithm>using namespace std;const int maxn=100005;typedef long long LL;int n,a[maxn];LL K,sum_a,now,_max,ans;int main(){// freopen("cf830C.in","r",stdin);// freope原创 2017-09-19 18:17:06 · 563 阅读 · 0 评论 -
[欧拉回路] 「Balkan OI 2016」Acrobat
我们要使左边的点度数都变为偶数。考虑第一种操作,会使两个点的度奇偶性变化,所以问题就转化成:给出一个图,选较少的边使得每个点的度满足奇偶性的限制。 这个怎么搞呢?有一个结论:若有解,则图的任意一个生成树,只取树边都能得到一组解。 怎么证明呢? 显然如果已知一组边是合法的解,那么这些边一定能在同一棵生成树上。 把这组解的边标为白色边。对于其他的任意一颗生成树,若白边在树上就取他,若白边不在树上原创 2017-09-28 08:54:37 · 352 阅读 · 0 评论