#1
由于自己太懒不想一篇一篇写题解。于是就准备写很久的题再一次发一次题解。大概囤50道就发一次?
还有几十天就退役了看看能囤几波吧TAT。。
这次囤了50题,虽然不都是BZOJ的QwQ。
Problem 2728. -- [HNOI2012]与非
有A nand A = not A,not ( A nand B ) = A and B,这样所有的位运算都可以算出来了。而如果对于A里的每一个数有一些位都是一样的话,那么这些位无论怎么运算最后都是一样的要么都是0要么都是1,这样我们可以只把本质不同的位拿出来数位dp一遍就可以了。
Problem 2729. -- [HNOI2012]排队
组合数学+高精度。(把老师和男同学放在一起然后让女同学插进序列中。。)
Problem 1092. -- [SCOI2003]蜘蛛难题
恶心模拟题。
Problem 2727. -- [HNOI2012]双十字
扫描线+树状数组
Problem 2731. -- [HNOI2012]三角形覆盖问题
因为三角形是等腰三角的,可以从下往上扫描,每次答案累加一些梯形的面积。扫描线扫到一个新的高度时,把底边在这个高度的三角形加进去,把原来在处理的三角形的底--,如果减完为0,那么这个三角形就可以删掉了。
把一些被包含的三角形去掉,用个双向链表维护扫描线的过程就可以AC了
Problem 2734. -- [HNOI2012]集合选数
状压dp。可以列出这样一张表,第一行是1,3,9……3^n,第二行是2,6,18,……2*3^n,在这张表中相邻的数字不能同时取,经典的状压dp。
然后把1和每一个质数(除了2,3)都这么做一遍累加起来就是答案了。时间复杂度O(lnn*logn*2^(log₃n)
Problem 1444. -- [Jsoi2009]有趣的游戏
精度要求很低嘛。。把AC自动机建出来,建出矩阵,直接跑许多遍矩阵乘法就可以了。(正解当然是高斯消元一遍。
Problem 2553. -- [BeiJing2011]禁忌
把AC自动机建出来然后因为要统计答案和,就新增一行一列,令b[cnt+1][cnt+1]=1,这样转移的时候答案就被累加起来了。这题卡精。。
Problem 3322. -- [Scoi2013]摩托车交易
才不是看到交易两个字才去写这题的呢!显然走的边是mst上的边,于是可以先做一遍mst。而且到达一个点的金块取决于手上有的金块和路径上的瓶颈边。
逆序把每个点的limit算出来。(因为最后一个点出去的时候金块要是0)
lim[n]=max(0,-b[ord[i]]),lim[i]=min(lim[i+1],MN(ord[i],ord[i+1])+max(0,-b[ord[i]]))
然后正序跑一遍就可以了。
Problem 1930. -- [Shoi2003]pacman 吃豆豆
k取方格数? n太大优化建图:先拆点,如果有三个点x,y,z形成偏序的话,可以x’->y,y’->z,流量为2,费用为0,如果有两条流通过x,y,z而且这两条流不相交。然后让每个点x->x’,一条流量为1,费用为1,一条流量为1,费用为0,表示费用只算一次。
Problem 2465. -- [中山市选2009]小球
只要不看错题意就是水水的费用流
Problem 2468. -- [中山市选2010]三核苷酸
暴力预处理出所有的相同串,然后正面gang和式。
2439: [中山市选2011] 序列
用f[i]表示1~i中让数列单调递增的费用,g[i]表示i~n中让数列单调递减的费用。
f[i]=f[i-1]+max(0,a[i-1]-a[i]+1),g[i]=g[i-1]+max(0,a[i+1]-a[i]+1)
设让1~i单峰,ans[i]=max(f[j]-f[1],g[j]-g[i]);(就是说我让一边的某一个点增加的话,可以同时让右边一个点减少。等价于差分序列。在[l,r]中+1相当于差分后b[l]+1,b[r+1]-1,然后中间都没有变化。)
可以发现决策点单调。而且i-1的决策点是<=i的决策点的。
单调队列达到O(N)
Problem 3996. -- [TJOI2015]线性代数
把式子推一推就是个最大权闭合图。
Problem 1190. -- [HNOI2007]梦幻岛宝珠
分层dp。
f[i][j]表示取了j个2^i,对于重量为a*2^i的直接做一遍背包。然后层与层之间再做一次背包。
具体是这样的:考虑到我可以把第i位化成两个i-1位,f[i][j]=max(f[i][j],f[i][j-k]+f[i-1][min(sum[i-1],2*k+(s&bin[i-1]))]
sum[i]表示第i位至多有多少个可以取到,除了题目给的点,还要预留出给之前的位置。
这样推一遍就可以得到答案了。。(但是为什么我感觉我还是不是很懂。。
Problem 2746. -- [HEOI2012]旅行问题
求前缀的lcp。
开始非常作死的写了个SAM。然后发现空间完全不够。。其实只要拿出fail树就可以了SAM还是AC自动机都是无所谓的。。
Problem 2659. -- [Beijing wc2012]算不出的算式
随便打个表找找规律就行了。
Problem 1977. -- [BeiJing2010组队]次小生成树 Tree
写个倍增乱搞。。
Problem 1251. -- 序列终结者
splay模板题
Problem 1500. -- [NOI2005]维修数列
splay模板题。(各种标记真心烦QwQ。。
Problem 1507. -- [NOI2003]Editor
我才不会告诉你我偷懒写了rope
Problem 2006: [NOI2010]超级钢琴
堆+rmq
记录一个三元组(i,l,r)表示左端点为i,右端点在l,r取到的最大值,并记录右端点的位置pos。
用优先队列维护这个值,每次(i,l,r)出队之后,让(i,l,pos-1),(i,pos+1,r)入队。
然后区间最值写个RMQ。
Problem 2631. -- tree
lct模板题
Problem 2257. -- [Jsoi2009]瓶子和燃料
其实这是一道数论,由于ax+by=d,所以找出最大的d,使得有不少于k个数是它的倍数就行了。
Problem 1567. -- [JSOI2008]Blue Mary的战役地图
二维hash
Problem 4413. -- [Usaco2016 Feb]Milk Pails.txt
模拟题。
Problem 1143. -- [CTSC2008]祭祀river
最长反链=最小路径覆盖
Problem 1826. -- [JSOI2010]缓存交换
每次找最远的一定是最优的。因为懒得手写堆于是手写了个线段树
Problem 1449. -- [JSOI2009]球队收益
费用流。
S连所有队伍,队伍连比赛,比赛连汇。队伍赢一场相当于赢一场+少输一场,所以可以让S->i,费用为C[i]*2*j-1-D[i]*2*(b[i]+sum-j+1),最后把答案加上比赛全输后获得的收益。
Problem 1820. -- [JSOI2010]Express Service 快递服务
非常暴力的dp
Problem 1443. -- [JSOI2009]游戏Game
如果1*2的骨牌能完全覆盖空位的话,那么后手必输(设选点的是后手)。那么就是对图黑白染色判断能否出现完美匹配。
然后要输出方案,对于找不到匹配点的点,可以让它沿着交替路增广一遍,可以得到另外一个已经匹配的点,这两个点都可以被输出出来。
Problem 1560. -- [JSOI2009]火星藏宝图
由于绝对值不等式,对于点(i,j),比如它决策的那个点是在k列的话,只要符合条件,上面的点必定比下面的点优。
然后就可以稍稍压一下状态数。。
Problem 1819. -- [JSOI]Word Query电子字典
在AC自动机上dfs一遍就可以了。
Problem 1017. -- [JSOI2008]魔兽地图DotR
非常神奇的树形dp。
Problem 2007. -- [Noi2010]海拔
平面图最小割转最短路。注意一下方向的问题。
Problem 1491. -- [NOI2007]社交网络
随便写个floyed
Problem 2152. -- 聪聪可可
无数人写树形dp,我写了个点分练手。。。
Problem 2120. -- 数颜色
我写的是分块暴力,被真正的暴力教做人了TAT
Problem 3672: [Noi2014]购票
点分治维护凸包。
对于一个分治结构,把根到fa[rt]的这部分先分治,用它们来更新rt。这样我们就求出了根到rt的值。
像cdq分治一样,这些点对分治结构中其他点都是有贡献的,让它们按dis-limit排序,每次都把它的符合要求的祖先加到栈里面维护凸包。
这样的话在凸包里的点都可以作为当前点的决策。然后维护一个下凸包,把斜率在凸包上二分就好了。
(注意因为我们是一次次找祖先,所以凸包上的点在x轴方向上是单调递减的,要反着做下凸包。
Problem 1177. -- [Apio2009]Oil
分成六种情况讨论。。。维护一下每个点的左上左下右上右下二维前缀和。然后YY下式子。。
Problem 3675. -- [Apio2014]序列分割
发现可以顺序统计答案,看出是斜率优化,然后就没有然后了。
Problem 3514. -- Codechef MARCH14 GERALD07加强版
啊这题好鬼畜。反正我是看题解的TAT。
出现环的时候就把第一条在联通块的边弹掉,并记录下来。然后答案就是n-[l,r]中ntr[i]<l的个数(ntr[i]一开始都是0)。
然后lct+主席树。
Problem 1912. -- [Apio2010]patrol 巡逻
找两次过1的最长路,然后第二次找的时候把第一次的最长路上的权值赋为-1。
最长路=最长到儿子路径+次长到儿子路径。然后树形dp一下。
Problem 3624. -- [Apio2008]免费道路
题意是求一个生成树必须恰好包含k条白边。
先把必须拓展的白边找出来,然后再扩展成k条,最后把其他的黑边补上。
Problem 1411. -- [ZJOI2009]硬币游戏
啊这题。。在隔壁KPM大爷的一遍遍提醒下我一遍遍认识到自己有多么的蠢。。在掉rating之后写这题真是爽。。
变换2^x后a[i]=a[(i-2^x)%n]^a[(i+2^x)%n]。然后拿着S进行log(s)次变换就可以了。
Problem 3033. -- 太鼓达人
这个是个欧拉图。。。。然后爆搜找出欧拉回路就可以了。
Problem 3289. -- Mato的文件管理
莫队+逆序对个数
Problem 2040. -- [2009国家集训队]拯救Protoss的故乡
用树链剖分+线段树模拟一个费用流。
Problem - 650B - Codeforces
啊这题在比赛的时候并没有写出来啊哭。
向右走一遍向左走一遍,向右走一段转身再向左走完,向左走一段转身再向右走完。
恩O(n)枚举转折点跑一遍就可以了。。
Problem - 650C - Codeforces
这题觉得还是挺厉害的。先把同行同列中相同的数用个并查集并起来。然后对每行每列进行排序,把相邻的点(代表的并查集)用边连起来,通过dfs可以出来一个DAG。
然后对这个DAG直接标号就可以了。
一开始比较蠢写个vector都要强上迭代器,被KPM怒D真是开心。。。