• HDU 4193


    本题思路:用sum[]数组维护前缀和, 当然这里需要把原数组扩大为原来的两倍。

    然后对于任意一个长度为n的区间 k.....k+n-1,如果有该区间内的最小值大于等于sum[k-1]那么该种情况就符合要求。

    刚开始想到了线段树,RMQ.....汗颜~~当然只试了一下RMQ, 明显的MLE。真的没有想到去用单调队列。

    以后用该牢记,当需要求定长区间的最值时应该想到去尝试单调队列。

    感觉这遍关于单调队列的文章很好理解:点击打开链接


    附上代码:

     1 #include <cmath>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 using namespace std;
     6 
     7 #define MAX_N (2000000 + 2)
     8 
     9 int sum[MAX_N], q[MAX_N];
    10 int n, cnt, front , rear;
    11 
    12 inline void in(int i) {
    13     while (front <= rear && sum[q[rear]] >= sum[i]) rear--;
    14 
    15     q[++rear] = i;
    16 }
    17 
    18 inline void out(int i, int n) {
    19     if (q[front] <= i - n) front++;
    20 
    21     if (sum[q[front]] - sum[i-n] >= 0) cnt++;
    22 }
    23 
    24 int main(void) {
    25     while (~scanf("%d", &n) && n) {
    26 
    27         sum[0] = 0;
    28         cnt = 0;
    29         front = 0;
    30         rear = -1;
    31 
    32         for (int i = 1; i <= n; i++) {
    33             scanf("%d", sum + i);
    34             sum[i + n] = sum[i];
    35         }
    36         for (int i = 2; i < n + n; i++)
    37             sum[i] += sum[i-1];
    38 
    39 
    40         for (int i = 1; i < n; i++) 
    41             in(i);
    42 
    43         for (int i = n; i < n + n; i++) {
    44             in(i);
    45             out(i, n);
    46         }
    47 
    48         printf("%d
    ", cnt);
    49     }
    50 
    51     return 0;
    52 }


  • 相关阅读:
    15回文相关问题
    14海量日志提取出现次数最多的IP
    13概率问题
    12胜者树和败者树

    pysnmp程序
    python 多线程 生产者消费者
    python多线程
    pysnmp使用
    PyYAML使用
  • 原文地址:https://www.cnblogs.com/Stomach-ache/p/3703147.html
Copyright © 2020-2023  润新知