前面说点什么..
比较基础的算法什么的也学的差不多吧.. 那么就开始刷题补补漏洞啊..
刷题走起01..
来看看做了几题..:
完成啦完成啦!!!!!
[2016.5.21] 1007 [HNOI2008]水平可见直线
其实就是半平面交的裸题.. 然后其实并不需要用到正式的半平面交,只需要用到思想即可..
[2016.5.23] 1009 [HNOI2008]GT考试
这道题是矩阵乘法+kmp,动态方程f[i][j]表示第i个位匹配到第j位不吉利数字。对于j来说,k为枚举的第i+1个数,假如s[j+1]!=k,那么就要去找前面第一个p使得s[p+1]==k,所以这个就要用到kmp..
[2016.5.24] 1010 [HNOI2008]玩具装箱toy
这道题很明显就是斜率优化啊.. 对于i来说j和k(j>k),当j比k优的时候为:
fj+(i−j−1+si−sj−L)2<fk+(i−k−1+si−sk−L)2
那么为了把
(i−j−1)
给去掉,我们把
si=si+i
、
L=L+1
fj+(si−sj−L)2<fk+(si−sk−L)2
化简一下就好啦
(fj+s2j+2Lsj)−(fk+s2k+2Lsk)2(sj−sk)<si
然后再维护一个下凸就好啦..
[2016.5.25] 1013 [JSOI2008]球形空间产生器sphere
相邻两个可以列一个方程啊..
(a1−x1)2+(a2−x2)2+(a3−x3)2+...+(an−xn)2=(b1−x1)2+(b2−x2)2+(b3−x3)2+...+(bn−xn)2
然后化简一下..
2(a1−b1)x1+2(a2−b2)x2+2(a3−b3)x3+...+2(an−bn)xn=a21−b21+a22−b22+a23−b23+...+a2n−b2n
很明显的高斯消元.. 然后又复习了下高斯消元..
[2016.5.25] *1017 [JSOI2008]魔兽地图DotR
绝对Tree_DP好题啊.. 参考了一下hzwer的思路,还有大神vfleaking的看不懂
vfk:http://vfleaking.blog.163.com/blog/static/17480763420130242646240/
hzwer:http://hzwer.com/5198.html
由于父亲累计答案要依靠孩子,那么定义DP数组f[i][j][k]为节点i把j个给父亲,费用为k可以获得的最大力量值
那么对于叶子节点x来说 f[x][i][j*cost[x]]=(j-i)*val[x];
由于合成是不需要费用的,所以对于非叶子节点x来说,更新f[x][i][j]时就需要知道孩子节点中总费用为j的最大力量值。定义g[i][j]为第i个孩子费用为j的最大力量值,然后进行DP g[tot][i]=max(g[tot][i],g[tot-1][i-j]+f[y][p*a[k].d][j]) p为当前枚举的要制作p件x
f[x][i][j]=max(f[x][i][j],g[tot][j]+val[x]*(p-i));
[2016.5.26] *1018 [SHOI2008]堵塞的交通traffic
bzoj官方题解镇楼:http://www.lydsy.com/JudgeOnline/upload/201604/sol(4).rar 反正我没看,rp--
用线段树维护这段区间左上右上左下右下四个顶点互相是否能到达情况,然后合并.. 然后判一下一些奇奇怪怪的情况.. 就行了..
这道题是要手写暴力合并公式的.. 我做的时候忽略了一种,调了30min.. too navie啊..
[2016.5.27] *1019 [SHOI2008]汉诺塔
放上大爷的题解:http://blog.sina.com.cn/s/blog_76f6777d0101b8l1.html
由于题目要求只需要把n个盘子从第一根柱子移到其余的任意一根,所以我们考虑这道题要维护的就是移到哪一根柱子花费最少和移动到哪一根.. 详情就看大爷的题解..
[2016.5.27] 1025 [SCOI2009]游戏
先把问题转化一下:求和为n的数的LCM方案数
看看下面的情况:
1)如果我把数分为
axby(gcd(a,b)=1)
和其他一大堆数,那么这种方案和
ax,by,1,1,...,1
和其他一大堆数是等效的
2)如果我把数分为
ax,by(x>y)
和其他一大堆数,那么这种方案和
ax,1,1,...,1
和其他一大堆数是等效的
那么的话,就可以按照质数来进行dp,f[i][j]表示访问完i个质数,和为j的方案数。所以就一大堆递推就好啦.. 打的时候忘记是算和..
[2016.5.30] *1027 [JSOI2007]合金
首先这道题第三维是是没有什么卵用的.. 因为你知道了前两维,第三维就知道了,于是每一种合金都能用平面上的点来表示..
而且我们发现,由于没有给质量,两种合金合起来可以达到所有在这两点组成线段中的所有点
那么这道题就变成了:在m个点中找最少的点使得组成的多边形能覆盖n个点
然后就把不把n个点集合分成两半的点相连然后再求最小环.. 用floyd就可以了.. 你以为真的这么简单?还有很多细节呢!
给一组某大神的数据:
2 1
0 0 1
0 0.5 0.5
0 1 0
[2016.5.30] 1029 [JSOI2007]建筑抢修
大水题啊.. 就是贪心一下啊..
首先先按找t2排个序..
对于当前要插入的i,我们要有个贪心策略:
如果我插入i仍满足条件,则直接插入,否则:
1)如果插入进去最大的t1还比i的t1要小,直接忽略i任务
2)否则,就把这个最大的t1去除,再插入i任务
[2016.5.31] *1030 [JSOI2007]文本生成器
这道题要求可读的,那么我们就用总数减去不可读的就好了..
首先建ac自动机,然后用dp数组f[i][j]表示第i位走到第j个节点的不可读方案数,枚举下一位填a~z26个字母进行递推咯.. mdzz居然建fail指针还没有放进队列中..错了4次..
论对拍的重要性啊..
[2016.5.31] 1031 [JSOI2007]字符加密Cipher
做了一道大水题..
直接sa就好了.. 记住要倍长一段..
[2016.6.1] 1038 [ZJOI2008]瞭望塔
半平面交的一道大裸题..
要记住 分段一次函数极值在顶点处..
[2016.6.2] *1040 [ZJOI2008]骑士
一看就是环套树+树形dp啦.. 但是就是傻逼呵呵不会处理环和边上的点.. 非常感谢NanoApe队长耐心给我讲解啦啦啦..
首先要把这个dp分成两种情况,因为每一棵环套树都是有且仅有一个环的,所以我们断掉环的一条边使其变成一棵树,并且随便取断掉的边两端点任意一个为根进行dp:
1)不管断掉的边另一个点选还是不选,统计答案只取f[root][0]
2)断掉的边另一个点固定不能选,即f[x][1]=inf,取f[root][0],f[root][1]的max值
[2016.6.2] *1042 [HAOI2008]硬币购物
hzwer的blog:http://hzwer.com/5286.html
做了一道容斥原理的题.. orz啊感觉学不会啊..
记录f[i]为总和为i的方案数,然后答案就是得到面值为s的方案数-第1种货币超过限制的方案数-第2种货币超过限制的方案数-…+第1、2种货币超过限制的方案数+第1、3种货币超过限制的方案数+…-第1、2、3种货币超过限制的方案数-第1、2、4种货币超过限制的方案数-…+第1、2、3、4种货币超过限制的方案数
[2016.6.2] 1044 [HAOI2008]木棍分割
二分贪心求解.. 然后dp求方案..
f[i][j]表示前j个分成i段的方案数,可以统计前缀和就省点时间,可以滚动不会爆空间..
啊傻逼啊.. 忘记mod错了好多次啊啊啊..
[2016.6.5] 1043 [HAOI2008]下落的圆盘
这又是一道比较烦的计算几何的题目
对于一个圆x,就是找在它上面的圆与它重叠的部分的周长,总长度减去它就是圆x可以贡献的价值。问题就在于如何去找重叠部分的周长的并集,大概就是记录重叠部分在圆的弧度,然后按照类似线段覆盖的方法来计算
[2016.6.8] 1069 [SCOI2007]最大土地面积
用旋转卡壳枚举较远的点对再找离这条线段最远的两个点就是当前最大的土地面积,时间复杂度为
O(n2)
,这道题是可以过的。
不要用常数大来掩盖自己的TLE,常数大也可以优化的啊,况且我还不是因为这个TLE的.. 仔细检查自己的代码吧.. md凸包都能打错.. AFO..
[2016.6.10] 1084 [SCOI2005]最大子矩阵
来来来再看一遍题目..
那么就分m=1和m=2来做咯..
m=1的时候f[i][j]表示第i位分成j段的最大和..
m=2的时候f[i][j][k]表示第一列的第i位,第二列的第j位分成k个矩形的最大和..
其实递推还是很简单的.. 但是这道题好像是分的矩形最大为k而不是一定要k个..
[2016.6.10] 1071 [SCOI2007]组队
这就是一道双指针的题目.. 记住这人
要用long long不然要错..
在检查代码的时候看到一篇挺好的blog,这个很清晰.. http://blog.csdn.net/Vmurder/article/details/45746089
[2016.6.11] 1049 [HAOI2006]数字序列
第一问很简单就是求一个最长不降子序列.. 为了在做第二问的时候更方便一点,可以在原串最后加上一个无穷大,在最前加上一个无穷小..
第二问的话比较难.. 首先要明白n^3的递推方程,如果j能递推到i(f[i]==f[j]+1),那么我需要在[j,i]中找一个分割点k,那么其中最优的变换情况就是[j,k]都变成a[j],[k+1,i]都变成a[i]。然后枚举k是必要的,那么我们就要减少j的枚举次数来降低时间复杂度.. 这时候就要建一个链表来存,也就是f值为i的以坐标为下标拉出一条链..
这样的做法是n^2的,但是因为是随机数据,再加上数据也是很水的.. 就可以水过啦..
[2016.6.25] 1072 [SCOI2007]排列perm
中间跳了挺多道暴力和搜索的题..
这道题就是比较水的状压dp.. f[i][j]表示状态为i余数为j的方案数
然后再把总答案f[all][0]除以某些阶乘即可..
[2016.6.27] 1061 [Noi2008]志愿者招募
我觉得这篇题解讲的很具体啊:https://www.byvoid.com/blog/noi-2008-employee/#more-916 没错我就是不想写..
其实就是线性规划.. 然后具体到底是什么也不算太清楚就只是知道部分.. 看来以后还要补一补..
[2016.6.29] 1059 [ZJOI2007]矩阵游戏
以前很傻逼的时候乱做的.. 看到有个红叉然后就补了..
因为操作只是换行和列,所以在同一行或者同一列的黑色格子是绝对不会变的,那么我们只要看看是否存在n个行列各不相同的黑色格子就可以了.. 那就用二分匹配扫一遍咯..
[2016.6.30] 1079 [SCOI2008]着色方案
看到1<=ci<=5然后就想到了一个5^15很傻逼的方法.. 果断不行..
然后再仔细一想,其实只要某两种颜色剩余可用是相同的话这两个颜色在一定状态下是等效的,那么就定义f[s1][s2][s3][s4][s5][la]表示剩余1次的颜色有s1种,剩余2次的颜色有s2种..上一次填的是剩余la次的颜色中的其中一种。那么就可以往下推了..
用记忆化搜索和dp皆可..
[2016.7.1] *1063 [Noi2008]道路设计
这个绝对是一道好题啊!
很容易看出这是一棵树,那么就用树形dp咯,由树剖看出最远的最多也就是logn,所以定义一个f[i][j][0-2]表示i节点最远的为j,与孩子节点连了0-2个,然后就随便推咯.. 不知道怎么推推到了一个很神奇还不用统计前缀和的方法.. 上网搜了下居然有个人跟我统计方案好像一样..
这道题还有一个比较坑爹的地方,有可能你要的答案f[1][ans][0]、f[1][ans][1]和f[1][ans][2]在模Q下都为0.. 然后就注意下discuss吧..
—-我是分割线—
由于第一版的题目实在太难.. 弃坑去后面了..
[2016.7.3] 4590 [Shoi2015]自动刷题机
n眼后标算.. 就是很水的二分+判断嘛..
由于我想多了二分范围,爆long long..
[2016.7.3] *4591 [Shoi2015]超能粒子炮·改
这道题就是要求
Ans=∑0≤i≤k(ni)
那么这个就要用到Lucas定理:
设
n=sp+q,m=tp+r (q,r<p)
(nm)=(sp+qtp+r)=(st)(qr)(mod p)
然后就递推啊.. 推到t=0为止.. 附上核心代码..
[2016.7.5] *4593 [Shoi2015]聚变反应炉
这道题的做法来源于王队长wangyurzee..
设f[x]表示x节点先激发自己再激发父亲,h[x]表示x节点先激发父亲再激发自己.. 那么对于所有节点都有h[x]<=f[x]
Type A:对于孩子y,只有两种可能,h[y]==f[y]或者h[y]+1==f[y]..
1.h[y]==f[y]那么我肯定会选择f[y],因为这样还能给x最多减少1点血量..
2.h[y]+1==f[y]那么我肯定会选择h[y],因为这样x已经对y造成了1点伤害而选择f[y]不一定会给x造成1点伤害..
那么统计f[x]就是x血量为d[x]时候的最少花费,h[x]就是x血量为d[x]-c[fa]时候的最小花费
Type B:
1.f[y]-h[y]>c[y]那么我肯定会选择h[y],这样一定比选择f[y]要优..(不信自己模拟一下,不细讲..)
2.f[y]-h[y]<=c[y]这个时候就要考虑一下伤害溢出的问题了.. 选择过多的f[y],x节点最多也只能减少d[x]点血量,所以在某些情况选择h[y]会更加优一点.. 那么这时候就要用到一种类似于背包的做法,这个就要自己真的好好想想..
f[x]、h[x]的统计方法与Type A一样..
[2016.7.7] 4592 [Shoi2015]脑洞治疗仪
题意描述的好神奇.. 仿佛脑洞又大了很多..
那么只需要维护一棵线段树,线段树维护以下权值:l0表示从左边开始有多少个0,r0表示右边开始有多少个0,sum表示这段区间有多少个0.. 这样就好了..
[2016.7.7] 1090 [SCOI2003]字符串折叠
其实就是一个dp.. f[i][j]表示i~j这一段的最小长度..
尼玛一大坑点.. 压缩后在前面的数如果是两位数要两个位置啊..
[2016.7.8] 4551 [Tjoi2016&Heoi2016]树
一大傻逼题.. 然而我WA了3次.. md原来是位置最近..
就是dfs序+线段树维护啊..
[2016.7.9] 4552 [Tjoi2016&Heoi2016]排序
一种很机智的做法..
二分答案,然后按照二分的值把大于等于它的标为1,小于它的标为0,然后用线段树维护一下..
[2016.7.9] 4554 [Tjoi2016&Heoi2016]游戏
其实这道题跟一个铺木板的题目相类似..
于是就是二分匹配咯..
[2016.7.11] 4553 [Tjoi2016&Heoi2016]序列
首先我们要知道,如果j能继承i的信息,就要满足:xi<=minj、maxi<=x还有一个条件就是序号从小到大
然后就是一个很简单的cdq分治了..
[2016.7.11] 4548 小奇的糖果
很简单就看出来就是矩阵乘法嘛..
就是有点坑而已嘛.. (1)负数取模的问题 (2)不一定
A<B<A+B
,比如-3,1,-2
[2016.7.12] *4513 [Sdoi2016]储能表
数位dp嘛.. f[i][s1][s2][s3]表示第i位n的条件、m的条件、k的条件
其实挺好的题(对于我这种蒟蒻来说).. 嗯好好想想如何递推吧..
[2016.7.12] 3295 [Cqoi2011]动态逆序对
首先用个树状数组求一开始的逆序对总数..
然后再开个数组f[i]记录比i后删的数中左边比i大的和右边比i小的数的个数和..
至于f[i]怎么求嘛.. cdq分治啊..
[2016.7.15] *3170 [Tjoi 2013]松鼠聚会
这是一道好题呀.. 要把切比雪夫距离转化成曼哈顿距离 即把点(x,y)变成((x+y)/2,(x-y)/2).. 证明如下:
[2016.7.17] 3171 [Tjoi2013]循环格
这是一道很简单的费用流题目啊.. 根据题意要求,每个点必须入度出度都为1,就满足了流量平衡..
然后只要原来箭头指向连0,其余三个连1就搞定了啊..
输入恶心.. 不能直接读入换行符..
[2016.7.17] 4514 [Sdoi2016]数字配对
很明显的费用流啊..
首先按照ai质因数个数的奇偶性二分染色.. 然后能配对的连连边.. 跑个费用流就好了.
[2016.7.17] 3174 [Tjoi2013]拯救小矮人
对于某种情况x和y两人可以任选其一出去,且
ax+bx<ay+by
,那我肯定选择让x出去..
因为x先出去y能出去的可能性比y先出去x能出去的可能性更大.. 不信自己画一下图..
然后再用f[i]表示已经跑出去i个小矮人的剩余最高高度,类似于背包跑一下就行了..
[2016.7.18] 4516 [Sdoi2016]生成魔咒
先把整个串翻转过来,然后做后缀数组,那么每次新加一个字符就相当于新加一个后缀..
那么这样就很显而易见的了,题目要求不同字串个数,就用当前字符串总子串个数-所有hei的和.. len*(len+1)/2-sum
用线段树或者splay维护一下sum就好了..
[2016.7.18] 4517 [Sdoi2016]排列计数
m个固定的位置就是
Cmn
种方案,其余的n-m个位置就错排
错排公式为
fi=fi−1∗i+(−1)i (f0=1)
所以答案就是
Cmn∗fn−m
[2016.7.19] 4562 [Haoi2016]食物链
因为不会违背生物学规律.. 所以最后出来的一定是一个拓扑图,所以dp或者记忆化搜索就好了..
记住只有一个点不算食物链..
[2016.7.19] 4563 [Haoi2016]放棋子
仔细观察发现这个01矩阵是没有什么卵用的.. 因为你把每一行换一换其实也没有什么区别..
那么就是很简单咯就是个错排+高精度咯
为了方便我换了个公式:
fi=(i−1)(fi−1+fi−2)
[2016.7.19] 3190 [JLOI2013]赛车
其实就是一个很裸的半平面交.. 虽然我感觉暴力也能过..
就是要注意一下两辆车相同属性的情况吧..
[2016.7.20] 4443 [Scoi2015]小凸玩矩阵
首先要二分答案然后判断是否有n-k+1个数比答案要小并且都不在同一行或同一列..
那么用二分匹配的方式就能判断了..
[2016.7.20] 4444 [Scoi2015]国旗计划
就相当于线段覆盖什么的吧,通过贪心可以得到每一个线段的下一条线段是一定的
离散化,把环拆成链,然后用st表算该线段后2^i条是哪一条线段,最后再乱搞乱搞..
[2016.7.20] 1303 [CQOI2009]中位数图
很简单啊..不说了.. 只是想快点结束而已..
没想到第一次的50题计划就这么被我草草结束了[捂脸]..
*好题
刷题结束了诶..
这次50题一共用了2个月..其实算起来也没有两个月,毕竟还要准备中考什么的..
然后发现自己在做题的过程中还是too navie,很多该考虑的地方没考虑周全导致了很多不必要的WA..
还发现了自己并不是很多东西都会了,还有分治、splay、lct、sam什么的都不会,看来后面开始还要补一波..
在刷题的过程中还有不时地去看题解.. 其实很多东西还是自己好好想想才好..
事实证明,实践还是很重要的..
为了那些,加油!
完结撒花!