摘要: 因为整个序列为一个1-n的排列,所以可以这样dp dp[i][j]代表长度为i,以数字j结尾的子序列 dp[i][j]=dp[i-1][1,2,3...j-1]; 这道题的答案就是 dp[k+1][1...n]; 用树状数组求一下前缀和 阅读全文
posted @ 2016-10-19 09:41 GeniusYang 阅读(218) 评论(0) 推荐(0) 编辑
摘要: #include #define inf 0x3f3f3f3f const int maxn=10000; using namespace std; struct node{ node* left; node* right; int value,fix,s,cnt; node(int _value,int _fix,int _s,int _cnt):value(_... 阅读全文
posted @ 2016-10-18 17:43 GeniusYang 阅读(147) 评论(0) 推荐(0) 编辑
摘要: #include <cstdio> #include <queue> #include <algorithm> #include <string.h> //#include <bits/stdc++.h> using namespace std; const int maxn=100000; int 阅读全文
posted @ 2016-10-04 10:47 GeniusYang 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 给一段序列,给你去掉所有数字的顺序,输出每去掉一个数,当前联通的子序列的最大值。 倒着来,每次插入一个数,然后求联通的最大值,线段树每个节点标记一下,区间的左右是否插入了数字,还有如果有数字从左边/右边开始连续子序列的值,还有这个节点的区间是否连续。 1 #include <cstdio> 2 3 阅读全文
posted @ 2016-10-03 16:23 GeniusYang 阅读(264) 评论(0) 推荐(0) 编辑
摘要: 先用st表处理出所有l-r的GCD值,然后二分求得这些值一共出现了多少次。 阅读全文
posted @ 2016-08-14 10:01 GeniusYang 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 把区间分成√n份降低复杂度. 阅读全文
posted @ 2016-08-12 20:45 GeniusYang 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 今天刚看到这个模板我是懵逼的,这个线段树既没有建树,也没有查询,只有一个update,而且区间成段更新也没有lazy标记....研究了一下午,我突然我发现我以前根本不懂扫描线,之所以没有lazy标记,是因为扫描线每次只查询1-n里的所有有值的区间长度,因为只要1-n,而不会查找到某些小区间,所以也就 阅读全文
posted @ 2016-08-11 21:01 GeniusYang 阅读(323) 评论(0) 推荐(0) 编辑
摘要: 我搜遍了网络,只在topcoder的网站上了解到树状数组这个结构是在设计压缩算法时被发现的。这个数据结构真是天才的构想,膜拜! 树状数组的基础是一个被构造出来的式子:C[i]=A[i]+A[i-1]+....+A[i-2^k+1];k代表i的二进制的最后连续0的个数 比如 对于1000和101000 阅读全文
posted @ 2016-08-10 15:36 GeniusYang 阅读(10734) 评论(2) 推荐(36) 编辑
摘要: 题意:求a->b中的二进制出现过多少个1,很显然的数位dp,对于某一位来说,如果这位是0,那么dp[i]=dp[i-1] 如果这一位是1 那么dp[i]=dp[i-1]+1<<(pos-1)+(后缀+1); dp[pos][now] /pos表示当前的位,now表示现在是1还是0 阅读全文
posted @ 2016-08-08 22:18 GeniusYang 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 对于每个数字二分找到大于等于它的数,再暴力找到第一个小于它的数 阅读全文
posted @ 2016-08-08 19:31 GeniusYang 阅读(121) 评论(0) 推荐(0) 编辑