怎么会T啊

/*
三种操作:D x:第x个位置1
Q x:查询第x位置所在的0连续块
R :将上次D的位置置0
*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
#define maxn 50050
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int lmx[maxn<<],rmx[maxn<<],mx[maxn<<];
int des[maxn],top; inline void pushup(int l,int r,int rt){
lmx[rt]=lmx[rt<<];
rmx[rt]=rmx[rt<<|];
mx[rt]=max(mx[rt<<],mx[rt<<|]); int m=l+r>>;
if(lmx[rt<<]==m-l+) lmx[rt]=m-l++lmx[rt<<|];
if(rmx[rt<<|]==r-l) rmx[rt]=r-m+rmx[rt<<];
mx[rt]=max(mx[rt],rmx[rt<<]+lmx[rt<<|]);
}
void build(int l,int r,int rt){
if(l==r){
lmx[rt]=rmx[rt]=mx[rt]=;
return;
}
int m=l+r>>;
build(lson);
build(rson);
pushup(l,r,rt);
}
void update(int pos,int c,int l,int r,int rt){
if(l==r){
lmx[rt]=rmx[rt]=mx[rt]=c;
return;
}
int m=l+r>>;
if(pos<=m) update(pos,c,lson);
else if(pos>m) update(pos,c,rson);
pushup(l,r,rt);
}
int query(int pos,int l,int r,int rt){
if(mx[rt]== || l==r || mx[rt]==r-l+)
return mx[rt]; int m=l+r>>;
if(pos<=m){
if(pos>=m-rmx[rt<<]+)
return query(pos,lson)+query(m+,rson);
else return query(pos,lson);
}
else {
if(pos<=m+lmx[rt<<|])
return query(pos,rson)+query(m,lson);
else return query(pos,rson);
}
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
memset(des,,sizeof des);
top=;
build(,n,); char op[];
int a,b;
while(m--){
scanf("%s",op);
if(op[]=='D'){
scanf("%d",&a);
update(a,,,n,);
des[top++]=a;
}
else if(op[]=='Q'){
scanf("%d",&a);
printf("%d\n",query(a,,n,));
}
else {
int tmp=des[--top];
update(tmp,,,n,);
}
}
}
return ;
}

ac代码

/*
三种操作:D x:第x个位置1
Q x:查询第x位置所在的0连续块
R :将上次D的位置置0
*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
#define maxn 50050
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int lmx[maxn<<],rmx[maxn<<],mx[maxn<<];
int des[maxn],top; inline void pushup(int l,int r,int rt){
lmx[rt]=lmx[rt<<];
rmx[rt]=rmx[rt<<|];
mx[rt]=max(mx[rt<<],mx[rt<<|]); int m=l+r>>;
if(lmx[rt<<]==m-l+) lmx[rt]=m-l++lmx[rt<<|];
if(rmx[rt<<|]==r-m) rmx[rt]=r-m+rmx[rt<<];
mx[rt]=max(mx[rt],rmx[rt<<]+lmx[rt<<|]);
}
void build(int l,int r,int rt){
if(l==r){
lmx[rt]=rmx[rt]=mx[rt]=;
return;
}
int m=l+r>>;
build(lson);
build(rson);
pushup(l,r,rt);
}
void update(int pos,int c,int l,int r,int rt){
if(l==r){
lmx[rt]=rmx[rt]=mx[rt]=c;
return;
}
int m=l+r>>;
if(pos<=m) update(pos,c,lson);
if(pos>m) update(pos,c,rson);
pushup(l,r,rt);
}
int query(int pos,int l,int r,int rt){
if(mx[rt]== || l==r || mx[rt]==r-l+)
return mx[rt]; int m=l+r>>;
if(pos<=m){
if(pos+rmx[rt<<]>m)//比之前优化了
return rmx[rt<<]+lmx[rt<<|];
else return query(pos,lson);
}
else {
if(m+lmx[rt<<|]>=pos)//比之前优化了
return rmx[rt<<]+lmx[rt<<|];
else return query(pos,rson);
}
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
memset(des,,sizeof des);
top=;
build(,n,); char op[];
int a,b;
while(m--){
scanf("%s",op);
if(op[]=='D'){
scanf("%d",&a);
update(a,,,n,);
des[top++]=a;
}
else if(op[]=='Q'){
scanf("%d",&a);
printf("%d\n",query(a,,n,));
}
else {
int tmp=des[--top];
update(tmp,,,n,);
}
}
}
return ;
}

hdu1540的更多相关文章

  1. hdu-1540线段树刷题

    title: hdu-1540线段树刷题 date: 2018-10-18 19:55:21 tags: acm 刷题 categories: ACM-线段树 概述 哇,,,这道线段树的题可以说是到目 ...

  2. HDU1540 Tunnel Warfare —— 线段树 区间合并

    题目链接:https://vjudge.net/problem/HDU-1540 uring the War of Resistance Against Japan, tunnel warfare w ...

  3. 最大连续区间(HDU-1540)

    HDU1540 线段树最大连续区间. 给定长度为n的数组,m次操作. 操作D,删除给定节点. 操作R,恢复最后一个删除的节点. 操作Q,询问给定节点的最大连续区间 维护三个值,区间的最大左连续区间,最 ...

  4. hdu1540 Tunnel Warfare

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  5. HDU1540 Tunnel Warfare 水题

    分析:不需要线段树,set可过,STL大法好 #include <iostream> #include <cstdio> #include <cstring> #i ...

  6. hdu1540之线段树单点更新+区间合并

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  7. hdu1540(线段树)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题意:是一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢 ...

  8. hdu1540线段树

    https://vjudge.net/contest/66989#problem/I #include<iostream> #include<cstdio> #include& ...

  9. hdu1540 区间操作,合并,模板题

    During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...

  10. HDU--1540 Tunnel Warfare(线段树区间更新)

    题目链接:1540 Tunnel Warfare 以为单组输入 这个题多组输入 结构体记录每个区间左边和右边的连续区间 ms记录最大 在查询操作时: 1.这个点即将查询到右区间 看这个点 x 是否存在 ...

随机推荐

  1. python爬虫爬取页面源码在本页面展示

    python爬虫在爬取网页内容时,需要将内容连同内容格式一同爬取过来,然后在自己的web页面中显示,自己的web页面为django框架 首先定义一个变量html,变量值为一段HTML代码 >&g ...

  2. Python基础【day03】:字符转编码操作(五)

    本节内容 1.编码介绍 2.字符编码介绍 3.总结 说到python的编码,一句话总结,说多了都是泪啊,这个在以后的python的开发中绝对是一件令人头疼的事情.所以有必要要讲讲清楚 一.编码介绍 1 ...

  3. DIV仿textarea文本域,contenteditable如何只能输入纯文本

    对于支持HTML5浏览器有2种方法: 1. HTML5 <div contenteditable="plaintext-only"></div> 2.  C ...

  4. Winform窗体设计工具源码

    源代码:QQ群616945527,博客资源

  5. Varish 缓存

    varish 缓存 2013年06月17日,Varnish Cache 3.0.4 发布,为目前最新版本. varish是以内存作为共享容器的:内存的大小决定了它的缓存容量.相对于主要以硬盘为存储的s ...

  6. luogu P3191 [HNOI2007]紧急疏散EVACUATE

    传送门 qwq这题好大力 首先可以预处理出每个人到每个门前面那个格子的最早时间,然后答案如果比最小答案大的话也是合法的,所以可以二分最终答案.检查\(mid\)是否合法就考虑每个人要去哪个门才会合法, ...

  7. IO流总结笔记一

    ​ IO流继承关系图 IO概述 IO流是用来处理设备上数据的输入输出. 具体设备有:硬盘,内存,键盘录入等等. IO流的具体分类: 1,根据处理的数据类型不同分为:字节流和字符流,字节流读取的最小单位 ...

  8. 微信小程序开发工具的基本应用

    全局配置: 1.1配置所有页面路径:在app.json的{pages:[配置所有页面]},将首页放置在第一位,在app.json必须写上所有页面的路径,要不然会报错,每个页面的wxss样式文件只在当前 ...

  9. Android NetworkInterface 的 name

    user@android:/$ ls /sys/class/net/ dummy0 lo p2p0 rev_rmnet0 rev_rmnet1 rev_rmnet2 rev_rmnet3 rmnet0 ...

  10. 2018-2019-2 网络对抗技术 20165227 Exp2 后门原理与实践

    2018-2019-2 网络对抗技术 20165227 Exp2 后门原理与实践 (1)例举你能想到的一个后门进入到你系统中的可能方式? 接收邮件的方式 (2)例举你知道的后门如何启动起来(win及l ...