Codeforces 756C Nikita and stack
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的更多相关文章
- 【线段树】Codeforces Round #393 (Div. 1) C. Nikita and stack
就是给你一些元素的进栈 出栈操作,不按给定的顺序,要求你对于每次输入,都依据其及其之前的输入,判断出栈顶的元素是谁. 用线段树维护,每次push,将其位置的值+1,pop,将其位置的值-1.相当于寻找 ...
- Nikita and stack
Nikita and stack time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Nikita and stack CodeForces - 756C (栈,线段树二分)
大意: 给定m个栈操作push(x)或pop(), 栈空时pop()无作用, 每个操作有执行的时间$t$, 对于每个$0 \le i \le m$, 输出[1,i]的栈操作按时间顺序执行后栈顶元素. ...
- 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个操作,但是顺序是乱的,现在每输入一个操作要求你输出当前的栈顶, 注意,已有操作要按它们的 ...
- Codeforces 993E Nikita and Order Statistics [FFT]
洛谷 Codeforces 思路 一开始想偏想到了DP,后来发现我SB了-- 考虑每个\(a_i<x\)的\(i\),记录它前一个和后一个到它的距离为\(L_i,R_i\),那么就有 \[ an ...
- [Codeforces 993E]Nikita and Order Statistics
Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) ,和一个数 \(x\) ,对于每个 \(i= 0\sim n\) ,求有多少个非空子区间满足恰好有 \(i\) 个数 ...
- Codeforces Round #393 (Div. 2)
A. Petr and a calendar time limit per test:2 seconds memory limit per test:256 megabytes input:stand ...
- Codeforces 442C Artem and Array(stack+贪婪)
题目连接:Codeforces 442C Artem and Array 题目大意:给出一个数组,每次删除一个数.删除一个数的得分为两边数的最小值,假设左右有一边不存在则算作0分. 问最大得分是多少. ...
- 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 ...
随机推荐
- inflate, findViewById与setContentView的差别与联系
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV ...
- ubuntu16.04下Cmake学习一
根据网上的资料,我总结了一下,一个工程应该有根目录(bin)存放可执行文件,头文件目录(include)存放头文件,源码文件(src)存放你的算法,还需要一个库文件夹存放你编译的静态库或者动态库.然后 ...
- jQuery--基础(实例)
jQuery的操作方法并不需要都记下来,但是使用什么功能需要什么样的方法,我们是一定会知道的.所以写实例来进行对功能方法的练习和熟练,是最快能够掌握jQuery的方法. <!DOCTYPE ht ...
- springboot输出日志到指定目录,简单粗暴,springboot输出mybatis日志
springboot官方文档地址https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot- ...
- TP 接收post请求使用框架自带函数I()防止注入
<input id="dele_id[]" value="1" type="checkbox" /> <input id= ...
- <LeetCode OJ> 121. /122. Best Time to Buy and Sell Stock(I / II)
Say you have an array for which the ith element is the price of a given stock on day i. If you were ...
- Linux就该这么学--计划任务服务
有经验的系统运维工程师能够让系统自动化运行,无需人工的干预就可以让各个服务.命令在指定的时间段运行.停止. 计划任务分为: 一次性计划任务:今晚11:30开启网站服务 长期性计划任务:每周1.3.5的 ...
- initcall_debug简要说明【转】
本文转载自:https://blog.csdn.net/zangdongming/article/details/37769265 Linux version 3.10.40 1. 使用说明 Docu ...
- Contiki 源码风格
/** * \defgroup coding-style Coding style * * This is how a Doxygen module is documented - start wit ...
- java中判断字符串是否相等有两种方法:
1.用“==”运算符,该运算符表示指向字符串的引用是否相同,比如: String a="abc";String b="abc",那么a==b将返回true.这是 ...