摘要: 题解: 我们可以知道每个不同的最小生成树对于一个边权所使用的数量都是相同的. 那么我们就可以先做一次最小生成树,然后对于每一个最小生成树中的边权搜索出所有的可以选取的方案,然后乘法原理累计答案即可. 阅读全文
posted @ 2017-12-21 22:38 楼主大大 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 题解: 我们设dp[a][b][c][d]表示目前已经有a个男生,b个女生,在某一时刻男生最多比女生多c个,在某一时刻女生最多比男生多d个. 所以就可以转移了: (dp[a+1][b][c+1][max(d-1,0)]+=dp[a][b][c][d])%=mod; (dp[a][b+1][max(c 阅读全文
posted @ 2017-12-21 21:48 楼主大大 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 题解: 我们可以单独的用LCT来维护每个点的深度(先把当前根转到根,再查询到根的路径长度就可以了),这棵splay由于只需要旋转最大最小值,手玩发现树的形态基本没变,所以我们就可以手动维护这个splay的形态,记录好根,父亲,儿子的状态然后用LCT求深度即可. 阅读全文
posted @ 2017-12-21 17:47 楼主大大 阅读(230) 评论(0) 推荐(1) 编辑
摘要: 题解: 这个题可以采取离线处理的方式.先处理出每个点i左边第一个比它大的点L[i],和右边第一个比它大的点R[i]. 那么对于区间L[i]到R[i]有p1的贡献.① 对于左端点在L[i]+1到i-1,右端点为R[i]的区间有p2的贡献.② 对于左端点为L[i],右端点为i+1到R[i]-1的区间也有 阅读全文
posted @ 2017-12-21 17:45 楼主大大 阅读(165) 评论(0) 推荐(2) 编辑
摘要: 题解: 我们设dp[i][j][0/1]表示最终序列从i到j最后放的是i/j(0/1). 很显然的转移 if(h[i]<h[i+1]) dp[i][j][0]=dp[i+1][j][0]; if(h[i]<h[j]) (dp[i][j][0]+=dp[i+1][j][1])%=mod; if(h[j 阅读全文
posted @ 2017-12-21 17:43 楼主大大 阅读(97) 评论(0) 推荐(1) 编辑
摘要: 题解: 首先判断m的大小,如果m>3*n-6,则一定没有平面图. 然后我们先将环扣出来,我们发现对于环上的两条边有交的话,那么这两条边就不能在环的同侧,所以我们就可以将边看作点,判断是否是二分图即可,连边由于m<=3*n-6,所以我们暴力连边就行了. 阅读全文
posted @ 2017-12-21 17:42 楼主大大 阅读(188) 评论(0) 推荐(1) 编辑
摘要: 题解: 用splay维护添加修改操作,然后二分hash判断长度. 操作一:对于查询区间[l,r]的hash值,显然将l-1旋到根,将r+1旋到根的右儿子,此时所求区间就是根的右儿子的左儿子了. 操作二:将要修改的位置旋到根,然后直接改就可以了. 操作三:要在x后面添加一个字符,显然将x旋到根,x+1 阅读全文
posted @ 2017-12-21 17:35 楼主大大 阅读(180) 评论(0) 推荐(1) 编辑