HDU 1540 Tunnel Warfare
思路1:
树状数组+二分
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define ls rt<<1,l,m
#define rs rt<<1|1,m+1,r
#define mem(a,b) memset(a,b,sizeof(a)) const int N=5e4+;
int bit[N];
bool vis[N];
int n;
int add(int x,int a){
while(x<=n)bit[x]+=a,x+=x&-x;
}
int query(int x){
int ans=;
while(x)ans+=bit[x],x-=x&-x;
return ans;
}
bool check(int x,int m){
//cout<<query(m)<<' '<<query(x-1)<<endl;
if(query(m)-query(x-)<m-x+)return true;
else return false;
}
bool check1(int x,int m){
if(query(x)-query(m-)<x-m+)return true;
else return false;
}
int main(){
ios::sync_with_stdio(false);
cin.tie();
int m,x;
char c;
while(cin>>n>>m)
{
mem(bit,);
mem(vis,false);
for(int i=;i<=n;i++)add(i,);
stack<int>s;
for(int i=;i<=m;i++){
cin>>c;
if(c=='D'){
cin>>x;
if(!vis[x])add(x,-),vis[x]=true;
s.push(x);
}
else if(c=='Q'){
cin>>x;
int l=x,r=n,mid=(l+r)>>;
while(l<r){
//cout<<l<<' '<<r<<' '<<query(mid)<<' '<<query(x-1)<<endl;
if(check(x,mid))r=mid-;
else l=mid;
mid=(l+r+)>>; }
int R=mid;
l=,r=x,mid=(l+r)>>;
while(l<r){
if(check1(x,mid))l=mid+;
else r=mid;
mid=(l+r)>>;
}
int L=mid;
if(vis[x])cout<<<<endl;
else cout<<R-L+<<endl;
}
else{
if(vis[s.top()])add(s.top(),),vis[s.top()]=false;
s.pop();
}
}
}
return ;
}
思路2:
线段树区间合并
代码:
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define ls rt<<1,l,m
#define rs rt<<1|1,m+1,r
#define mem(a,b) memset(a,b,sizeof(a)) const int N=5e4+;
struct tree{
int ll,rr,len;//ll表示以当前区间左端点为左端点最长连续区间的长度,rr表示以当前区间右端点为右端点最长连续区间的长度,len表示当前区间的长度
}tree[N<<];
void push_up(int rt){
if(tree[rt<<].ll==tree[rt<<].len)tree[rt].ll=tree[rt<<].ll+tree[rt<<|].ll;
else tree[rt].ll=tree[rt<<].ll;
if(tree[rt<<|].rr==tree[rt<<|].len)tree[rt].rr=tree[rt<<|].rr+tree[rt<<].rr;
else tree[rt].rr=tree[rt<<|].rr;
}
void build(int rt,int l,int r){
tree[rt].ll=tree[rt].rr=tree[rt].len=r-l+;
if(l==r)return ;
int m=(l+r)>>;
build(ls);
build(rs);
}
void update(int p,int v,int rt,int l,int r){
if(l==r){
tree[rt].ll=tree[rt].rr=v;
return ;
}
int m=(l+r)>>;
if(p<=m)update(p,v,ls);
else update(p,v,rs);
push_up(rt);
}
int query(int p,int rt,int l,int r){
if(rt==){
if(l+tree[rt].ll->=p)return tree[rt].ll;
if(r-tree[rt].rr+<=p)return tree[rt].rr;
}
else{
if(l+tree[rt].ll->=p)return tree[rt].ll+tree[rt-].rr;
if(r-tree[rt].rr+<=p)return tree[rt].rr+tree[rt+].ll;
}
if(l==r)return ;
int m=(l+r)>>;
if(p<=m)return query(p,ls);
else return query(p,rs);
}
int main(){
ios::sync_with_stdio(false);
cin.tie();
int n,m,x;
char c;
while(cin>>n>>m){
stack<int>s;
build(,,n);
while(m--){
cin>>c;
if(c=='D'){
cin>>x;
s.push(x);
update(x,,,,n);
}
else if(c=='Q'){
cin>>x;
cout<<query(x,,,n)<<endl;
}
else{
x=s.top();
s.pop();
update(x,,,,n);
}
}
}
return ;
}
HDU 1540 Tunnel Warfare的更多相关文章
- HDU 1540 Tunnel Warfare(最长连续区间 基础)
校赛,还有什么途径可以申请加入ACM校队? Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/ ...
- hdu 1540 Tunnel Warfare (区间线段树(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...
- hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并
Tunnel Warfare Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 1540 Tunnel Warfare 平衡树 / 线段树:单点更新,区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Lim ...
- HDU 1540 Tunnel Warfare 线段树区间合并
Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...
- hdu 1540 Tunnel Warfare(线段树区间统计)
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- hdu 1540 Tunnel Warfare (线段树 区间合并)
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- hdu 1540 Tunnel Warfare 线段数区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) P ...
- hdu 1540 Tunnel Warfare (线段树,维护当前最大连续区间)
Description During the War of Resistance Against Japan, tunnel warfare was carried out extensively i ...
随机推荐
- linux中的各种$号 位置参数变量
位置参数变量 $n #/bin/bash echo $0(代表命令本身); echo $1; (代表第几个参数) echo $2; [root@LocalWeb01 ~]# ./1.sh ...
- shell篇(二)
Linux的shell种类比较多,常见的有:Bourne Shell(/user/bin/sh或者/bin/sh), Bourne Again Shell(/user/bin/bash或者/bin/b ...
- APB总线
APB(Advance Peripheral Bus)是AMBA总线的一部分,从1998年第一版至今共有3个版本. AMBA 2 APB Specfication:定义最基本的信号interface, ...
- Impala与Hive的比较
1. Impala架构 Impala是Cloudera在受到Google的Dremel启发下开发的实时交互SQL大数据查询工具,Impala没有再使用缓慢的Hive+MapReduce批 ...
- OLAP引擎——Kylin介绍(很有用)
转:http://blog.csdn.net/yu616568/article/details/48103415 Kylin是ebay开发的一套OLAP系统,与Mondrian不同的是,它是一个MOL ...
- 数据仓库基础(十一)Informatica小技巧(2)
本文转载自:http://www.cnblogs.com/evencao/p/3152384.html 1.User shortcuts:shortcuts能实现快捷方式的复用.快捷方式可以根据源的变 ...
- 将图片文件转化为字节数组字符串,并对其进行Base64编码处理,以及对字节数组字符串进行Base64解码并生成图片
实际开发中涉及图片上传并且量比较大的时候一般处理方式有三种 1.直接保存到项目中 最老土直接方法,也是最不适用的方法,量大对后期部署很不方便 2.直接保存到指定路径的服务器上.需要时候在获取,这种方式 ...
- Linux中Postfix基于SSL收发邮件(九)
其中在整个一套邮件服务器中,默认信息传输都是明文传输的,所以这个在安全性上面就不是那么好.但是如果说一封邮件从发生到对方接受想要全程做到加密处理这个也是很难的.因为一封邮件从一个域转到另外一个域服务器 ...
- ELK学习笔记之Logstash详解
0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining cap ...
- Python3.x(windows系统)安装matplotlib库
Python3.x(windows系统)安装matplotlib库 cmd命令: pip install matplotlib 执行结果: