题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914

题意:

给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个数列的这n种变换里,

A(0): a1,a2,…,an-1,an

A(1): a2,a3,…,an,a1

A(n-2): an-1,an,…,an-3,an-2

A(n-1): an,a1,…,an-2,an-1

问有多少个变换里,所以前缀和都是正整数。

思路:因为变换是a[n]后面接着a[1]所以我们把数组a接到后面(即a[n+1]=a[1]..a[n+n]=a[n])。然后求一个前缀和。然后对于求以a[i]为起点的变换。即a[i],a[i+1],a[i+2]...a[n]...a[i-1]。当该变换满足全部前缀和都为正时,即a[i],a[i]+a[i+1],...,a[i]+...a[i+n]都为正。但是如果对于每个变换都用O(n)时间去计算每一个前缀和会TLE,所以预处理出原始数列的前缀和。那么上面的前缀和就可以转换成sum[i]-sum[i-1], sum[i+1]-sum[i-1],..,sum[i+n]-sum[i-1]。然后对于题目求的所有前缀和都为正,即在所有前缀和的最小值为正即可。那么就可以用滑动窗口维护最小值。用单调队列实现。 注意STL的deque会TLE,所以自己手写了的双端队列。

  1. #define _CRT_SECURE_NO_DEPRECATE
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<math.h>
  8. #include<time.h>
  9. #include<vector>
  10. #include<iostream>
  11. #include<string>
  12. using namespace std;
  13. typedef long long int LL;
  14. const int MAXN = 1e6 + ;
  15. LL sum[MAXN];
  16. struct Deque{
  17. int head, tail;
  18. int val[MAXN];
  19. Deque(){ head = ; tail = -; }
  20. void push_back(int x){ val[++tail] = x; }
  21. void pop_back(){ tail--; }
  22. void pop_front(){ head++; }
  23. int front(){ return val[head]; }
  24. int back(){ return val[tail]; }
  25. bool empty(){ return tail < head; }
  26. void clear(){ head = ; tail = -; }
  27. }deq;
  28. int main(){
  29. //#ifdef kirito
  30. // freopen("in.txt", "r", stdin);
  31. // freopen("out.txt", "w", stdout);
  32. //#endif
  33. // int start = clock();
  34. int t, n, Ca = ; scanf("%d", &t);
  35. while (t--){
  36. scanf("%d", &n);
  37. for (int i = ; i <= n; i++){
  38. scanf("%lld", &sum[i]);
  39. sum[i + n] = sum[i];
  40. }
  41. for (int i = ; i <= * n; i++){
  42. sum[i] += sum[i - ];
  43. }
  44. int ans = ; LL tmpx = ; deq.clear();
  45. for (int i = ; i < n; i++){
  46. while (!deq.empty() && sum[deq.back()] > sum[i]){
  47. deq.pop_back();
  48. }
  49. deq.push_back(i);
  50. }
  51. for (int i = n; i < * n; i++){
  52. while (!deq.empty() && sum[deq.back()] > sum[i]){
  53. deq.pop_back();
  54. }
  55. deq.push_back(i);
  56. while (!deq.empty() && deq.front() <= i - n){
  57. deq.pop_front();
  58. }
  59. if (sum[deq.front()] - sum[i - n] > ){
  60. ans++;
  61. }
  62. }
  63. printf("Case %d: %d\n", Ca++, ans);
  64. }
  65. //#ifdef LOCAL_TIME
  66. // cout << "[Finished in " << clock() - start << " ms]" << endl;
  67. //#endif
  68. return ;
  69. }

FZU 1914 单调队列的更多相关文章

  1. FZU 1894 志愿者选拔 (单调队列)

    /****************************************************************** 题目: 志愿者选拔(FZU 1894) 算法: 单调队列 算法思 ...

  2. FZU 1894 志愿者选拔(单调队列)

    传送门 Description 世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动.参加志愿者选拔的同学们排队接受面试官们的面试.参加面试的同学们按照先来先面试并且先结束的原则接受面试官们的考查. ...

  3. FZU 2016 summer train I. Approximating a Constant Range 单调队列

    题目链接: 题目 I. Approximating a Constant Range time limit per test:2 seconds memory limit per test:256 m ...

  4. FZU 1894 志愿者选拔 单调队列

    训练赛的题…… 暴力一波明显超时…… 最近刚学stl 感觉是优先队列 但还是太会用…… 以后可以试一下优先队列…… 比赛之后百度了一下 发现是单调队列…… 看起来挺简单的 也算个模版题吧…… 总之思路 ...

  5. FZU 1894 志愿者选拔【单调队列】【monotone decreasing queue】

     Problem 1894 志愿者选拔 Accept: 1770    Submit: 5523 Time Limit: 1500 mSec    Memory Limit : 32768 KB  P ...

  6. 单调队列 && 斜率优化dp 专题

    首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...

  7. FZU1894 单调队列

    S - 1019 Time Limit:1500MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  8. 单调队列 poj2823,fzu1894

    题目链接:http://poj.org/problem?id=2823 用RMQ超时了,我想应该是不会的,看discuss说,之前RMQ过了. 维护两个单调队列. 单调递减的队列,每插入一个时: 超过 ...

  9. 暑期训练狂刷系列——Foj 1894 志愿者选拔 (单调队列)

    题目连接: http://acm.fzu.edu.cn/problem.php?pid=1894 解题思路: 因为出队和入队都满足队列的性质,优先单调队列的优先级有进入队列的顺序和人品的高低,在一段区 ...

随机推荐

  1. 海拔高度图*.dem文件的读取—vtkDEMReader

    vtkDEMReader reads digital elevation files and creates image data. Digital elevation files are produ ...

  2. struts1和struts2的区别

    1. 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类:Struts 1的一个具体问题是使用抽象类编程而不是接口.Struts 2 Action类可以实现一个Acti ...

  3. Thinkphp 3.2.2 验证码check_verify方法,只能验证一次

    问题: Thinkphp 3.2.2 验证码check_verify方法,只能验证一次. function check_verify($code, $id = ''){ $verify = \Thin ...

  4. 使用pm2管理nodejs应用

    PM2 is a production process manager for Node.js applications with a built-in load balancer. It allow ...

  5. canvas九宫格跑马灯

    canvas九宫格跑马灯抽奖 之前用dom写了一版,部分 安卓机会卡顿,换用canvas dom版本九宫格抽奖

  6. Android开发 default activity not found

    新建的项目,今天打开的时候,发现无法编译了.编译按钮无法点击,必须edit configuration.并且报错 default activity not found. 解决: 少写了一个" ...

  7. Tomcat 学习心得

    Tomcat Server的结构图 Tomcat服务器的启动是基于一个server.xml文件的,Tomcat启动的时候首先会启动一个Server,Server里面就会启动Service,Servic ...

  8. html5 历史管理onhashchange和state

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Installing Selenium and ChromeDriver on Ubuntu

    I recently got Selenium, Google Chrome, and ChromeDriver installed and working on a DigitalOcean ins ...

  10. 为什么使用Junit Test而不用普通java main方法来完成测试?

    因为在程序里边,一个接口对应一个实现方法,而在接口中常常会定义相关的很多方法,所以在测试的时候,如果都在main方法里边进行测试,main方法就会显得臃肿,而且不便于以后其他人测试以及查看测试数据,用 ...