码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces - 1199D - Welfare State - 单调栈

时间:2019-07-31 12:53:25      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:ref   入栈   etc   putc   name   amp   stop   write   while   

https://codeforc.es/contest/1199/problem/D

其实后来想了一下貌似是个线段树的傻逼题。

单调栈是这样思考的,每次单点修改打上一个最终修改的时间戳。每次全体修改就push进去单调栈。首先比新的全体修改的x小的(等的也)全部出栈,这样子单调栈里面就是一个递减的序列,而时间戳是递增的。

最后对于每一个有修改标记的,在时间戳上面二分找到他的下一次修改,那么这个修改绝对就是足够大的。假如没有查找成功,则说明不存在最后一次修改。(可以通过在最后入栈一个0操作来统一),没有修改标记的那就直接赋值最大的全体修改。(相当于对0进行查询)

其实也是nlogn的。常数估计更小。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

inline int read() {
    int x = 0;
    char c = getchar();
    for(; c < '0' || c > '9'; c = getchar());
    for(; c >= '0' && c <= '9'; c = getchar())
        x = (x << 3) + (x << 1) + c - '0';
    return x;
}

inline void _write(int x) {
    if(x > 9)
        _write(x / 10);
    putchar(x % 10 + '0');
}

inline void write(int x) {
    if(x < 0) {
        putchar('-');
        x = -x;
    }
    _write(x);
    putchar('\n');
}

const int MAXN=200005;

int n, q;
int a[MAXN],lc[MAXN];
int st1[MAXN],st2[MAXN],stop;

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    n = read();
    for(int i = 1; i <= n; ++i)
        a[i] = read();

    q = read();
    for(int qi = 1; qi <= q; qi++) {
        int op = read(), p, x;
        if(op == 1) {
            p = read(), x = read();
            a[p] = x;
            lc[p] = qi;
        } else {
            x = read();
            while(stop && st1[stop] <= x)
                --stop;
            st1[++stop] = x;
            st2[stop] = qi;
        }
    }
    st1[++stop] = 0;
    st2[stop] = q + 1;
    for(int i = 1; i <= n; ++i)
        a[i] = max(a[i], st1[lower_bound(st2 + 1, st2 + 1 + stop, lc[i]) - st2]);
    for(int i = 1; i <= n; ++i)
        printf("%d%c", a[i], " \n"[i == n]);
}

Codeforces - 1199D - Welfare State - 单调栈

标签:ref   入栈   etc   putc   name   amp   stop   write   while   

原文地址:https://www.cnblogs.com/Yinku/p/11275436.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!