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;
}

最新文章

  1. iOS-开发进阶
  2. easyUI-combobox 动态绑定数据源
  3. c#操作IIS站点
  4. jpype调用jar
  5. .NET:序列化和反序列化
  6. Visual Studio 发布新版API智能提示
  7. lucene底层数据结构——底层filter bitset原理,时间序列数据压缩将同一时间数据压缩为一行
  8. IOS 类别与扩展的区别 (category &amp; extensions)
  9. 利用 SQL Monitor 查看语句运行状态步骤
  10. 【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集
  11. PHP学习(前言)
  12. 在发板实现24位jpg和bmp图片用手划动显示上一张与下一张图片
  13. Luogu P1078 文化之旅
  14. Swift 4 Hex Color
  15. nodejs在windows下的安装配置(使用NVM的方式)
  16. AWS EC2实例Ubuntu系统设置root用户密码并使用root/ubuntu用户登录
  17. [从零开始搭网站三]CentOS配置JDK
  18. NOIP2017提高组预赛详解
  19. [转]wget 下载整个网站,或者特定目录
  20. e791. 为JSpinner定制编辑器

热门文章

  1. VS中单元测试用法
  2. c++引用返回值
  3. 集群 安装 配置FastDFS
  4. 1-1:CSS3课程入门之属性选择器
  5. 【虚拟机】WIN8.1系统安装虚拟机win7环境
  6. HTTP POST请求数据提交格式(转)
  7. Matlab时频图
  8. js闭包实际用途
  9. curl post 请求 es 数据 REST 批量删除
  10. iframe式ajax调用