摘要: 原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=3474 单调队列。 这题的模型可以这样描述:给一个只由1和-1组成的循环序列,求以每个点为起点且长度最长为n的子串的最小值。到这一步,应该能想到单调队列的解法了。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #define N 2000005 5 6 int sum[N], a[N], q[N], n, ok1[N], ok2[N]; 7 8 void c 阅读全文
posted @ 2012-10-17 21:04 芒果布丁 阅读(248) 评论(0) 推荐(0)
摘要: 原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=3415 【题目分析】 因为序列是环状的,所以可以在序列后面复制一段(或者复制前 k 个数字)。如果用 s[i]来表示复制过后的序列的前 i 个数的和,那么任意一个子序列[i..j]的和就等于[j]-s[i-1]。对于每一个 j,用 s[j]减去最小的一个 s[i](i>=j-k+1)就可以得到以 j 为终点长度不大于 k 的和最大的序列了。将原问题转化为这样一个问题后,就可以用单调队列解决了。View Code 1 #include <stdio.h> 2 #include < 阅读全文
posted @ 2012-10-17 17:48 芒果布丁 阅读(202) 评论(0) 推荐(0)
摘要: 原题传送:http://poj.org/problem?id=2823 单调队列练手题。(不怕麻烦也可以用线段树) 程序运行了5000+ms,不明白几百ms的是什么算法,如果读者您知道请留个言,感激不尽。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define N 1000005 4 int a[N]; 5 6 struct node 7 { 8 int key, val; 9 }e[1000005];10 11 12 int main()13 {14 int n, k, i, head, tail.. 阅读全文
posted @ 2012-10-17 12:44 芒果布丁 阅读(165) 评论(0) 推荐(0)