Codeforces 756C Nikita and stack

题目大意:

  • 给定一个对栈进行操作的操作序列,初始时序列上没有任何操作,每一次将一个本来没有操作的位置变为某一操作(push(x),pop())。在每一次变化后输出按照顺序执行操作序列最后得到的栈顶元素。对空栈pop()没有任何作用。

题解:

  • 容易发现我们只用关心栈顶元素,而不用管其他的元素
  • 而一个被push的元素成为栈顶的条件是操作序列中在它后面的元素全部都被pop了
  • 所以问题转化成了求最大的一个push的操作,满足在它后面的push和pop全部都互相抵消掉,不对栈造成影响。
  • 我们可以使用线段树来维护这个东西:
    • 把push操作当作1,pop操作当做-1
    • 记录一下每段区间的sum
    • 并且记录一下从右端开始的最大和连续子序列
  • 查找嘛。。。自己YY去吧
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = 100010;
struct Node{
int sum,rmx;
}T[maxn<<2];
inline void update(int rt){
T[rt].sum = T[rt<<1].sum + T[rt<<1|1].sum;
T[rt].rmx = cat_max(T[rt<<1|1].rmx,T[rt<<1].rmx + T[rt<<1|1].sum);
}
int pos,val;
void modify(int rt,int l,int r){
if(l == r){
T[rt].sum = T[rt].rmx = val;
return;
}
int mid = l+r >> 1;
if(pos <= mid) modify(rt<<1,l,mid);
else modify(rt<<1|1,mid+1,r);
update(rt);return;
}
int n;
int query(){
int nw = 1,l = 1,r = n,sum = 0;
if(T[nw].rmx <= 0) return -1;
while(l != r){
int mid = l+r >> 1;
if(sum + T[nw<<1|1].rmx > 0){
nw = nw<<1|1;
l = mid+1;
}else{
sum += T[nw<<1|1].sum;
nw = nw<<1;
r = mid;
}
}return l;
}
int a[maxn];
int main(){
read(n);
int opt;
for(int i=1;i<=n;++i){
read(pos);read(opt);
if(opt == 0){
val = -1;
modify(1,1,n);
}else{
val = 1;
read(a[pos]);
modify(1,1,n);
}
int ans = query();
if(ans == -1) puts("-1");
else printf("%d\n",a[ans]);
}
getchar();getchar();
return 0;
}

Codeforces 756C Nikita and stack的更多相关文章

  1. 【线段树】Codeforces Round #393 (Div. 1) C. Nikita and stack

    就是给你一些元素的进栈 出栈操作,不按给定的顺序,要求你对于每次输入,都依据其及其之前的输入,判断出栈顶的元素是谁. 用线段树维护,每次push,将其位置的值+1,pop,将其位置的值-1.相当于寻找 ...

  2. Nikita and stack

    Nikita and stack time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  3. Nikita and stack CodeForces - 756C (栈,线段树二分)

    大意: 给定m个栈操作push(x)或pop(), 栈空时pop()无作用, 每个操作有执行的时间$t$, 对于每个$0 \le i \le m$, 输出[1,i]的栈操作按时间顺序执行后栈顶元素. ...

  4. Codeforces Round #393 (Div. 2) (8VC Venture Cup 2017 - Final Round Div. 2 Edition) E - Nikita and stack 线段树好题

    http://codeforces.com/contest/760/problem/E 题目大意:现在对栈有m个操作,但是顺序是乱的,现在每输入一个操作要求你输出当前的栈顶, 注意,已有操作要按它们的 ...

  5. Codeforces 993E Nikita and Order Statistics [FFT]

    洛谷 Codeforces 思路 一开始想偏想到了DP,后来发现我SB了-- 考虑每个\(a_i<x\)的\(i\),记录它前一个和后一个到它的距离为\(L_i,R_i\),那么就有 \[ an ...

  6. [Codeforces 993E]Nikita and Order Statistics

    Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) ,和一个数 \(x\) ,对于每个 \(i= 0\sim n\) ,求有多少个非空子区间满足恰好有 \(i\) 个数 ...

  7. Codeforces Round #393 (Div. 2)

    A. Petr and a calendar time limit per test:2 seconds memory limit per test:256 megabytes input:stand ...

  8. Codeforces 442C Artem and Array(stack+贪婪)

    题目连接:Codeforces 442C Artem and Array 题目大意:给出一个数组,每次删除一个数.删除一个数的得分为两边数的最小值,假设左右有一边不存在则算作0分. 问最大得分是多少. ...

  9. Codeforces Round #877 (Div. 2) B. - Nikita and string

    题目链接:http://codeforces.com/contest/877/problem/B Nikita and string time limit per test2 seconds memo ...

随机推荐

  1. deeplearning.net 0.1 document - Multilayer Perceptron

    Multilayer Perceptron 以下我们使用Theano来介绍一下单隐藏层的多层感知机(MLP).MLP能够看成一个logistic回归分类器,它使用一个已经学习的非线性转换器处理输入.这 ...

  2. SpringBoot启动流程分析(二):SpringApplication的run方法

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  3. .NET C# 【小技巧】控制台程序,运行是否弹出窗口选择!

    选中控制台程序项目,右键→属性→应用程序栏→输出类型: 1.Windows 应用程序(不弹出提示框)! 2.控制台应用程序(弹出提示框)! 3.类库(类库生成dll,是不能直接运行的,类库供应用程序调 ...

  4. PHPExcel简易使用教程

    在企业里使用PHP进行开发,不可避免总会遇到读/写Excel的需求,遇到这种需求,一般使用PHPExcel类库进行开发. PHPExcel现在最新版本是1.8.0,最低需要PHP5.2版本,支持读取x ...

  5. 如何运用spring将dao注入到servlet中?

    1.servlet的init方法 public void init(ServletConfig config) throws ServletException { super.init(config) ...

  6. PowerBuilder -- 调试(Debug)

    @.进入代码调试,执行下一步直接就退出了调试 原文:http://bbs.csdn.net/topics/390126005 处理方法:尝试把 Watch 中查看的变量全部删掉.

  7. iOS 键盘变中文

    plist文件添加 Localizations 添加一项字段Chinese (simplified)

  8. 跨平台.NET Core--微软开源方向

     跨平台.NET Core--微软开源方向 微软宣布.net开源已经有一段时间了,新的跨平台的.net框架叫.NET Core. 当前支持Windows/Linux/OSX/Docker.官网:h ...

  9. Python中文编码过程中遇到的一些问题

    首先,要明确encode()和decode()的差别 encode()的作用是将Unicode编码的字符串转换为其它编码格式. 比如:st1.encode("utf-8")  这句 ...

  10. 【BZOJ4619/3709】[Wf2016]Swap Space/[PA2014]Bohater 贪心

    [BZOJ4619][Wf2016]Swap Space Description 你有许多电脑,它们的硬盘用不同的文件系统储存数据.你想要通过格式化来统一文件系统.格式化硬盘可能使它的容量发生变化.为 ...