2019.5.1
CF C. Prefix Sum Primes
感觉CF就是训练妳如何养成对题目强大的YY能力的QAQ
我们构造
如果只有一种,没辙,只能这样放
否则先放一个2,再放一个1
接下来把2放完再用1填
因为所有质数除了都是奇数,所以这样尽可能让前缀尽量多的是奇数最有可能……
CF D. Three Religions
一开始题目读不懂,mdzz,不然应该会写
题意就是说能不能把三个串不改变每个串自己内部相对顺序,但是可以不同串交叉,能否组成给定串的子序列,注意是子系列,不一定连续!!!
显然dp了,dp[a][b][c]表示第一个串匹配到a,第二个串匹配到b,第三个串匹配到c,在给定串里的最小下标
我们先预处理出一个nxt[i][c]表示在>=i的位置,c第一次出现在哪
注意每次新加一个的时候如果加在第一个串,只有dp[a+1][i][j]要改变,n^2个状态要改变,第一维应该是压着不动的
2019.5.2
BZOJ3305: Catalan数
题目打错了都,找规律,发现答案是(21-1)(22-1)……(2n-1)
BZOJ2152: 聪聪可可
树形dp很好理解也挺好打的吧,就是设f[x][0/1/2]表示x子树里距离x距离%3=0/1/2的点个数,跨子树的转移也不难对吧QAQ
现在来学习一下点分治QAQ
upd.会点分治了QAQ没有想象中的那么难,但是有一个细节,就是要容斥
因为穿过一个点的两个点可能会来自一颗子树,所以等一下要把这个减去经过这个子节点
BZOJ2875: [Noi2012]随机数生成器
显然可以矩阵乘法优化对吧
{a 0
c 1}和
{x0 1}
注意矩阵乘法的时候不能直接写乘号,会爆long long,要写龟速乘
2019.5.3
BZOJ3155: Preprefix sum
显然树状数组,推一下式子,把西格玛搞一搞分成两个树状数组来维护
BZOJ3680: 吊打XXX
模拟退火,get了
洛谷上的数据真TM xjb的恶心
最后还是瞎搞了半天srand过的QωQ
BZOJ2048: [2009国家集训队]书堆
物理题,应该学过的,但是不会了(捂脸)
Po姐教我做物理……强烈安利
https://blog.csdn.net/popoqqq/article/details/39755935
最后用到了调和级数,果然就是应该早一点看具体数学的……(捂脸)
BZOJ2659: [Beijing wc2012]算不出的算式
如果看成平面直角坐标系中的点,(0,0)与(p,q)连线
<1>p=q 显然((p+1)/2)((p+1)/2)
<2>p/q是斜率,那左边式子就是线段下方整点个数
然后左转一下图,右边式子就相当于现在线段下方整点个数
综上就是((p-1)/2)((q-1)/2)矩形中的整点个数,因为那个对角线上肯定没有整点对吧(因为p,q肯定互质鸭)
这不显然就是((p-1)/2)*((q-1)/2)
2019.5.4
BZOJ2660: [Beijing wc2012]最多的方案
一开始有一点不明白就是为啥把一个拆掉所用的方案数是(pos[i]-pos[i-1]-1)/2或(pos[i]-pos[i-1])/2
其实用数学归纳法或找规律都会发现
不管前面空位有多大,拆成两个数,后面那个数是怎么都一步走的,所以我们只要考虑前面那个数
每次拆需要前面至少有两个空位,所以就是/2啦
想了好久好久呢QAQ
BZOJ3823: 定情信物
花了好久才理解那个递推式的变形(其实用归纳法一下子就出来了吧……QAQ)
然后对于网上说的那个n是p的倍数,如果采用的Lucas定理就不用多想了对吧,反正一模就是0了,C[0][0]=1
BZOJ4300: 绝世好题
也就是说如果相邻两个数有一位都为1的话就好啦
dp[i]表示第i位为1的最长长度,然后一个数一个数的往里面加
注意要更新那些为1的位的dp值
BZOJ2124: 等差子序列
神题鸭,第一次见到这种操作……涨姿势了
就是抽象到数轴上,我们一个一个枚举中间点,看数轴上它的两边是不是对称的
这个就是拿两棵线段树维护正反hash值就好了
2019.5.5
BZOJ2751: [HAOI2012]容易题(easy)
mdzz,一开始我竟然忘记了西格玛的分配率了……
ΣiΣj(a[i]*b[j])=(Σa[i])(Σb[j])
所以把答案就是每一个可以取得数的个数的成绩对吧……
对于都能取得快速幂,否则暴力乘(最多才1e5对吧不多)
BZOJ3561: DZY Loves Math VI
鏼鏼出的题,挺难的……对我这种zz来说,以后看到这种gcd的题应该很显然往欧拉函数或莫比乌斯反演上想对吧,这题属于后者
https://www.cnblogs.com/GXZlegend/p/7514960.html
推理过程值得体味……幸亏最近看了一点点具体数学不然Σ的基本变换都不会呢QAQ
对于[gcd(i,j)=1]这个在程序中肯定不能这样
因为之前说过Σd|n μ(d) =1当且仅当n=1,其他时候都=0,这个时候不就可以当做两个数是否互质的条件了呢QAQ
ZROI705. 【正睿NOIP普转提半年训练day 19】dyt
n=1,2很好解决对吧
n>=3的时候显然a[1]=(g[1][2]+g[1][3]-g[2][3])/2,然后就可以推出来其他的对吧
ZROI706. 【正睿NOIP普转提半年训练day 19】det
有一个很巧妙的方法我没有想到QAQ
就是我们不擅长维护三个数的和,但是维护两个数的和有没有出现过很简单对吧
所以我们就枚举一个数,维护两个数的和出现过没有就好了
2019.5.6
ZROI707. 【正睿NOIP普转提半年训练day 19】dst
scape说这种计数题,首先不是应该考虑咋计数,首先应该考虑操作后的序列满足啥性质
首先首尾肯定都是0,然后相邻两位肯定相差最多1对吧
为啥呢,因为只有当两数现在相同,然后以其中一个做端点,另一个在覆盖里,才会使得他们相差1
接下来既然相差1了,就不可能一起操作了,差值就不会变了
然后考虑如果满足以上性质的序列是否都可以得到,这个倒推
每次选最大的一段,然后向左右延伸一个左端点,总可以还原为全0对吧
所以每一个这样的性质的数列都唯一对应一种方案
这就可以dp了对吧,f[i][j]表示到第i个,第i个值为j的方案数,然后滚动一下就好啦
ZROI708. 【正睿NOIP普转提半年训练day 19】dst
首先肯定是用线段树+lazytag维护对吧
然后这里的tag用结构体,求和的时候比较特殊,也需要log的时间,套上线段树应该是nlog^2(n)的,可做
2019.5.7
BZOJ3309: DZY Loves Math
真难QAQ,昨晚一直想到现在才明白QAQ
https://www.cnblogs.com/RogerDTZ/p/8227485.html
参考这篇博客挺好的,数学真菜QAQ
BZOJ1190: [HNOI2007]梦幻岛宝珠
膜了一些前辈的blog才会,分段背包
按2的指数分类,每一类先的单独01背包,然后考虑段与段之间的转移
https://blog.csdn.net/bfk_zr/article/details/78177869 这篇讲解超棒的,可惜程序挂掉了QAQ
https://blog.csdn.net/lych_cys/article/details/50914772 lych大爷的程序常数真小orz
而且dp数组的的定义也让人耳目一新,dp[i][j]表示容量为j* 2^i +(w&((1<<i)-1))的最大价值
最后答案也就是dp[top][1],top是2^k<=m的最大k
因为一段里面的和肯定是a* 2^b的形式,所以转移也可以想到对吧QAQ
BZOJ2733: [HNOI2012]永无乡
维护n棵splay,用并查集+启发式合并暴力合并就好啦
BZOJ4305 数列的GCD
数论,显然莫比乌斯反演可做,但是复杂度要求不高,简单容斥一下就好啦
https://blog.csdn.net/geotcbrl/article/details/49622731
BZOJ3295: [Cqoi2011]动态逆序对
树套树或cdq分治就好了,树套树太麻烦了懒得写了QAQ
2019.5.8
BZOJ2588: Spoj 10628. Count on a tree
树上的区间第k小,也可以用主席树来解决哒
学习了一波主席树,get啦QAQ
2019.5.9
BZOJ2762: [JLOI2011]不等式组
解出来x的范围,然后用树状数组差分来做一下就好啦
注意有可能会重复删除某一个式子,注意vis一下
BZOJ4321: queue2
第一眼组合数学,但是好像不太可做呢,这种小清新计数题就应该dp啊!
之前总结过,这类题一般都不是按照每一个位置放数,大都按(1,2,3,4……,n)的顺序往里面插数
这样的话在过程中可能有相邻的相差一,但是最后放别的数时候把他们挤开了,而且我们还要考虑i和i-1的位置关系
dp[i][j][0/1]表示放了1……i,有j对相邻,i是否和i-1相邻
BZOJ4318: OSU!
肯定期望dp对吧,主要就是公式E(x+y)=E(x)+E(y)的运用,所以要维护当前全1后缀x的期望和x^2的期望
有一个地方好坑,就是答案是f[cur]=f[1-cur]+(3l2[1-cur]+3l1[1-cur]+1)*a1;
因为前面的若干个已经确定了,是板上钉钉的事了,前面的期望值不会因为当前的出现概率
BZOJ4320: ShangHai2006 Homework
只会那个离线的算法,不会在线做QAQ(Claris好像写了一个在线的喔,不管这种题通法一般都是离线啊)
https://blog.csdn.net/time_major/article/details/51073575
这个并查集思想很妙啊!
BZOJ1196: [HNOI2006]公路修建问题
觉得正解就是应该二分,因为她没有保证所有c2都小于c1鸭
然后就是kruscal验证对吧QAQ
2019.5.10
BZOJ2468: [中山市选2010]三核苷酸
推推式子然后维护一下就可以了吧QAQ
https://www.cnblogs.com/clrs97/p/4817925.html
BZOJ2783: [JLOI2012]树
显然set维护对吧QAQ
BZOJ2440: [中山市选2011]完全平方数
二分,然后check到目前是否有>=k个不是完全平方数的整数倍
考虑容斥,是0个素数平方的倍数个数-是1个素数平方的倍数个数+是2个素数平方的倍数个数……
这就是Σd[1,sqrt(n)] μ(d)*(n/d^2)
2019.5.11
BZOJ3110: [Zjoi2013]K大数查询
终于明白整体二分啦QAQ再试试树套树叭QAQ
2019.5.12
昨天的那题会树套树写法啦QAQ
就是先二分,然后权值线段树套的区间线段树表示某一区间内值域在这一范围的数的个数
BZOJ2819: Nim
显然dfs序+树状数组就好啦QAQ
BZOJ4326: NOIP2015 运输计划
二分+树上差分就好啦QAQ
BZOJ2342: [Shoi2011]双倍回文
学了一下manacher,然后还是不会鸭QAQ,膜了一下神仙题解……
只考虑所有O(n)个本质不同的回文子串,每次右端点>=mx的时候暴力检查是否i前面就好啦
ZROI734. Baguette
可以看成一条链,已经切了n-1刀了,现在你要固定长度切一刀,最少切多少刀
这个拿gcd瞎搞一下去掉重复的不就行了嘛
2019.5.13
ZROI736. Color
先把环上面的情况用dp做掉,然后剩下的就是像树一样的分支了,每个都是(k-1)的方案
2019.5.14
BZOJ4319:[cerc2008]Suffix reconstruction
膜了ATP的blog发现就是一种贪心吧
https://blog.csdn.net/fromatp/article/details/72827696
LOJ6185. 烷基计数
这个有机化学……
每个点最多只有三个儿子嘛,整数拆分限制一下单调性+dp嘛,https://www.cnblogs.com/NaVi-Awson/p/8175603.html
2019.5.15
BZOJ2727: [HNOI2012]双十字
枚举下面的横线的中点,然后用三个树状数组维护一下,这个竟然没有想到呢,多做题
https://blog.csdn.net/charlie_jilei/article/details/80578868
BZOJ2337: [HNOI2011]XOR和路径
做过的题不会了???QAQ
首先xor每一位都是独立的,可以按位处理,然后概率期望又牵扯到有子环,显然gauss消元对吧QAQ
2019.5.16
BZOJ3329: Xorequ
x ^ 3x=2x <—> x ^ 2x=3x=x+2x
异或本身就是不进位的加法,所以只需要x&2x=0就好啦,就是没有两个1相邻,数位dp一下,记得第一问要n+1
第二问瞎推都知道是斐波那契数列对吧,矩阵快速幂一下
https://www.cnblogs.com/leohh/p/9097474.html
2019.5.17
BZOJ3626: [LNOI2014]LCA
神题鸭,没有想到这种思路QAQ
树剖
https://www.luogu.org/blog/user37839/solution-p4211
BZOJ2038: [2009国家集训队]小Z的袜子(hose)
显然离线莫队对吧QAQ
2019.5.18
BZOJ3679: 数字之积
首先乘积只会有2,3,5,7这四个质数组成,先预处理出来所有可能的乘积f[]
然后dp[i][j]表示i位数,所有位成绩为f[j]的个数
然后就很套路了对吧
BZOJ4292 [PA2015]Rownanie
一眼数位dp
然鹅
f(n)最大只有9918……
所以枚举f(n)然后看f(n)*k的每一位的平方和是否等于f(n)
2019.5.19
BZOJ1407: [Noi2002]Savage
对于每个m,对于每两个野人可以列出式子 c[i] + p[i] * x = c[j] + p[j] * x (mod m)
转化为方程即为 (p[i] - p[j]) * x + m * k = c[j] - c[i]
于是用扩欧求解 x 即可,若无解或解出的 x 比两个野人寿命的最小值大,说明两个野人在有生之年不会相会。
这样判断完每一对野人,若每一对都成立,则说明这个m可行。
由于数据很小,所以m暴力枚举即可。
BZOJ1867: [Noi1999]钉子和小球
x*b的dp一下就行了
BZOJ1406: [AHOI2007]密码箱
https://www.cnblogs.com/mjtcn/p/9348988.html
为啥窝动不动就想到逆元鸭QAQ
BZOJ2120: 数颜色
显然带修莫队,复习一下了
2019.5.20
BZOJ2338: [HNOI2011]数矩形
暴力,按边的长度,中点坐标排序,然后满足的肯定连续,对吧
ZROI767. 【正睿NOIP普转提半年训练day 19】1
排个序瞎淦一下QAQ
ZROI768. 【正睿NOIP普转提半年训练day 19】2
显然先离散化一下,然后连在一起(中间插一个INF),然后跑后缀数组
再拿一个优先队列维护一下就行了对吧
ZROI769. 【正睿NOIP普转提半年训练day 19】3
就是暴力吧……
时间复杂度显然O(nlogn)
1e6,不过时限2s还是很稳的
ZROI770. 【正睿NOIP普转提半年训练day 19】4
经典的祖玛dp对吧
果然我dp太弱了,以后要多自己想想才行呢
dp[l][r][k]表示区间把区间[l,r]消掉需要的最小代价,其中区间前面有k个a[l]
至于转移,首先
若k<K-1肯定可以在前面再加一个a[l]
若k=k-1那就说明可以把前k-1带着l一块消掉
还有一种大众化的就是找断点,找[l+1,r]中a[i]=a[l],把[l+1,i-1]消掉,然后剩下dp[i][r][min(k-1,k+1)]我们这里取min就是限制第三维<K,大于的相当于我们之间把它消掉了
2019.5.21
BZOJ2333: [SCOI2011]棘手的操作
学会了左偏树,不过是用斜堆实现的,很不稳啊,不过这道题据说是专门设计的数据还能跑的起飞???
https://blog.csdn.net/charlie_pyc/article/details/20830305
orz一发pyc的blog
P.S现在去学一下传说中的线段树实现?QAQ
upd.会线段树解法了,很妙。就是通过离线用并查集处理出来合并操作,把一个块里的都编号为连续的,就可以直接线段树操作啦!
BZOJ1951: [Sdoi2010]古代猪文
首先要求的式子很简单想到
https://www.luogu.org/blog/Owencodeisking/solution-p2480
orz题解,我竟然没有想到把模数分解质因数,然后分别Lucas定理,再用中国剩余定理求出原数
2019.5.22
BZOJ4017: 小Q的无敌异或
不会哇,不过现在会了QAQ
https://www.cnblogs.com/wujiechao/p/7764678.html
感觉这篇blog很清楚的,这种题目肯定就是要按位操作
2019.5.23
BZOJ1787: [Ahoi2008]Meet 紧急集合
看了题解都想了好一会才想明白QAQ
首先肯定树上三个点两两的LCA必然至少有两个是一样的(如果不是在根的同一颗子树里显然相同LCA是根,否则就递归下去)
而且那个一样的LCA肯定是深度小的内个
可以从二维的那个初一弱智问题推广到这,也就是说集合点一定是另外一个LCA(就是那个深度大的)
(因为这样里面有一段只需要一个人走,如果取深度小的那个LCA的话那一段需要两个人都走)
BZOJ3685: 普通van Emde Boas树
显然权值线段树
2019.5.24
BZOJ2186: [Sdoi2008]沙拉公主的困惑
首先小于M!的部分就是phi(M!)
由欧几里得可知gcd(a,b)=gcd(b,a mod b)
所以若gcd(x,M!)=1,则gcd(x+kM!,M!)=1
所以我们相当于每M!个分成一块,然后答案就是phi(M!)*(N!/M!)
展开就好啦
注意,求逆元最好递推求一下,因为卡常……
2019.5.25
BZOJ3944: Sum
好题QωQ,这玩意叫杜教筛???
https://www.cnblogs.com/gromah/p/4421254.html
https://blog.csdn.net/lych_cys/article/details/50974764
原来可以在O(n^2/3)求数论函数的和……注意这里用了lych的方法,没有用map,少了一个log
BZOJ3444: 最后的晚餐
https://www.cnblogs.com/GXZlegend/p/7603675.html
并查集+组合数
BZOJ3930: [CQOI2015]选数
https://blog.csdn.net/Hardict/article/details/82933746
因为gcd(x,y)=gcd(x,|x-y|)……怎么没考虑到这个……所以gcd一定<=|x-y|
所以左右边界同除以k,然后用容斥或莫比乌斯反演求一下互质的数列的个数就行了
2019.5.27
ZROI771. Feast
sb题,显然递推,劳资noip的时候这种题竟然没写对……
ZROI772. Maxflow
直接树剖一下就好了,PQF写的差分?
ZROI773. Cardgame
离成功只差一步,当时的时候想到了枚举断点,然后set维护,但是明显不可能每换一个断点就重算一次,那肯定就没了对吧
前半段取后继,后半段取前驱
当时的时候想到了正着做取后继,倒着做一遍取前驱,然后枚举时候直接加就好了
但是当时的时候害怕会不会有一些点重复?
有个点重复的时候肯定也会已有一个点空出来,它肯定不是比重复点大就是比重复点小
如果大的话,把那个后继换成那个空出来的就行了,反之就换前驱,显然贡献都是一样的
ZROI774. 262144
dp杀我,PQF差点就A了
考的时候一直在想区间dp?但是区间dp就转移不了了鸭
f[i][j]表示到第i个,且第i个的末尾能凑出一个块的大小为j,则这个开头在i-f[i][j]+1的位置
0就是凑不出来
然后转移就是在看在i-f[i][j-1]之前能不能在凑出一个j-1
BZOJ3306: 树
首先这种题往往不可能是真的换根
http://hzwer.com/5484.html
讨论一下当前根和查询点的位置关系
BZOJ2901: 矩阵求和
https://blog.csdn.net/joky_2002/article/details/81902501
推一推柿子然后维护一下?QAQ
2019.5.29
BZOJ2900: 好玩的数字游戏
一道题盯了两天(捂脸),好题鸭!!!
就是用类似数位dp的方法,需要强大的YY能力,嗯
先把1 - n-1位的算出来,然后第n位的单独按照数位dp的那种方式来算,最后补上一个就行啦
程序里面是把最后一位单独抠出来算的,也可以啦
BZOJ1631 [Usaco2007 Feb] Cow Party
sb题吧,正着反着跑一遍就好啦,不过,n很小,懒得取反了,直接跑n遍吧QAQ
2019.5.30
BZOJ4337: BJOI2015 树的同构
学习了,就是先枚举重心,然后从重心,做最小括号表示法,取最大的那个(因为一棵树可能有两个重心)
BZOJ1589: [Usaco2008 Dec] Trick or Treat on the Farm 采集糖果
缩点然后随便搞一搞?QAQ
BZOJ4103: [Thu Summer Camp 2015]异或运算
枚举x,然后y用可持久化trie维护,学习了
BZOJ3798: 特殊的质数
每1e5打个表,然后分块暴力就好了……
get了
2019.5.31
BZOJ3026: 楼梯染色
就是之前做过2道题的合体版,卡特兰数+Lucas+crt
BZOJ1660: [Usaco2006 Nov] Bad Hair Day 乱发节
单调栈鸭QAQ
BZOJ4271: Chemistry
https://blog.csdn.net/jpwang8/article/details/86708502
感觉这篇讲解很赞呢QAQ
就是用重心dp,最后要加上偶数个点有两个重心的情况