摘要: #include #include #include using namespace std; int T,A[10]; bool f[100010]; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='... 阅读全文
posted @ 2018-08-08 20:34 void_f 阅读(197) 评论(1) 推荐(0) 编辑
摘要: 题意:给定一个数,求将该数重新排列后mod m==0的方案数 重新排列就考虑到用到哪些数,以及此时mod m的值 于是dp[i][j]表示状态i中mod m==j的方案数 注意:转移的时候只要找到一种可行的转移就行,不然会计算重复的方案数 为了转移的方便,可以将相同的数字放在一起便于检索 Code 阅读全文
posted @ 2018-07-31 21:14 void_f 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个n个点的无向图,开始没有边,然后m个操作,每次加边或者删边,每次操作后输出正好k个边的匹配数k=1,2,3,...n/2,n<=10,m<=30000 可以发现,n<=10可以想一想状压,以点集为状态 于是dp[S]表示匹配中的点集为S时的方案数 加边时,dp[S]+=dp[S-2u- 阅读全文
posted @ 2018-07-30 20:48 void_f 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 随便DP一下 Code 阅读全文
posted @ 2018-07-27 20:59 void_f 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 二分答案mid,将>=mid的设为1,<mid的设为0,这样排序就变成了区间修改的操作,维护一下区间和即可 然后询问第q个位置的值,为1说明>=mid,以上 时间复杂度O(nlog2n) tips: 线段树操作区间[l,r]需满足l<=r,要特判;tag可能为0,要初始化为-1 Code 阅读全文
posted @ 2018-07-27 16:53 void_f 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 构造一个序列B[i]=-b[i],建一颗线段树,维护区间max, 每次区间加后再询问该区间最大值,如果为0就在树状数组中对应的值+1(该操作可能进行多次) 答案在树状数组中找 其实只用一颗线段树也是可以的 Code 阅读全文
posted @ 2018-07-26 15:34 void_f 阅读(119) 评论(0) 推荐(0) 编辑
摘要: 答案为3+2*∑φ(i),(i=2 to n) Code 阅读全文
posted @ 2018-07-21 16:25 void_f 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 定义第i行为所有的点(i,j),0<j<m 可以发现,每一行是相对独立的,每一次操作只会影响到当前行和最后一列 考虑每一行和最后一列各开一个树状数组,但这样显然会爆空间 实际上,对于没有离队过的点是没必要储存的,可以直接算出编号, 因此只要用vector储存每一行和最后一列后加入的点即可 还需要预处 阅读全文
posted @ 2018-07-21 09:32 void_f 阅读(1249) 评论(2) 推荐(0) 编辑
摘要: 先spfa一遍处理出d[]数组,(从n开始bfs一遍标记可以达到n的点) 题意即,在走最短路的基础上,可以最多多走K长度的路径, 考虑DP,每次剩余可走的长度会因决策而改变,所以考虑dp[i][j]为当前在i号节点,剩余可多走长度为j的方案数 dp[u][j]可以从dp[v][e[i].w-(d[v 阅读全文
posted @ 2018-07-19 08:57 void_f 阅读(334) 评论(0) 推荐(0) 编辑
摘要: 首先对于序列上一点,它对答案的贡献只有与它的前驱和后驱(前提颜色相同)构成的点对, 于是想到用set维护每个颜色,修改操作就是将2个set暴力合并(小的向大的合并),每次插入时更新答案即可 颜色数要离散化,或者用map也行 Code 阅读全文
posted @ 2018-07-17 20:14 void_f 阅读(227) 评论(0) 推荐(0) 编辑