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


    题目连接:

      http://acm.fzu.edu.cn/problem.php?pid=1894

    解题思路:

      因为出队和入队都满足队列的性质,优先单调队列的优先级有进入队列的顺序和人品的高低,在一段区间中如果出现x[i]是最大的,那么[0,i-1]区间内的数就不用记录了,所以单调队列里面可以按照人品值降序排列,输出的时候判断一下当前元素是否已经出队即可。

     1 #include <cstdio>
     2 #include <cstring>
     3 using namespace std;
     4 const int maxn = 1000005;
     5 
     6 struct node
     7 {
     8     int index, val;
     9 }Q[maxn];
    10 
    11 int main ()
    12 {
    13     int t;
    14     char str[10];
    15     scanf ("%d", &t);
    16     while (t --)
    17     {
    18         int head, last, num, cur, x;
    19         scanf ("%s", &str);
    20         head = last = x = 0;
    21         cur = -1;
    22         while (scanf ("%s", str), strcmp(str, "END"))
    23         {
    24             if (str[0] == 'C')
    25             {
    26                 scanf ("%s %d", str, &num);
    27                 //当前位置不在队首,进队元素优先级高于当前元素
    28                 while (head<=cur && Q[cur].val<num)
    29                     cur --;
    30                 Q[++cur].index = x++;
    31                 Q[cur].val = num;
    32             }
    33             else if (str[0] == 'Q')
    34             {//队首元素已经出队,就向下遍历次优元素
    35                 while (head<=cur && Q[head].index<last)
    36                     head ++;
    37                 if (head > cur)
    38                     printf ("-1
    ");
    39                 else
    40                     printf ("%d
    ", Q[head].val);
    41             }
    42             else
    43                 last ++;//出队元素数目
    44         }
    45     }
    46     return 0;
    47 }
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    test
    结构体内存对齐
    单链表(指针的指针应用)
    C语言实现线程池
    线程私有数据和pthread_once
    fcntl函数
    同构树
    动态规划经典题
    DP--方格取数问题
    动态规划的基本模型
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4611526.html
Copyright © 2020-2023  润新知