HDU 1540

思路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的更多相关文章

  1. HDU 1540 Tunnel Warfare(最长连续区间 基础)

    校赛,还有什么途径可以申请加入ACM校队?  Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/ ...

  2. hdu 1540 Tunnel Warfare (区间线段树(模板))

    http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...

  3. hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并

    Tunnel Warfare Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

  4. HDU 1540 Tunnel Warfare 平衡树 / 线段树:单点更新,区间合并

    Tunnel Warfare                                  Time Limit: 4000/2000 MS (Java/Others)    Memory Lim ...

  5. HDU 1540 Tunnel Warfare 线段树区间合并

    Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...

  6. hdu 1540 Tunnel Warfare(线段树区间统计)

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

  7. hdu 1540 Tunnel Warfare (线段树 区间合并)

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

  8. hdu 1540 Tunnel Warfare 线段数区间合并

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

  9. hdu 1540 Tunnel Warfare (线段树,维护当前最大连续区间)

    Description During the War of Resistance Against Japan, tunnel warfare was carried out extensively i ...

随机推荐

  1. Twitter OA prepare: Anagram is A Palindrome

    Algorithm: Count the number of occurrence of each character. Only one character with odd occurrence ...

  2. 009-hostname与/etc/hosts区别

  3. Oracle 启动的时候需要的服务

  4. Q-learning简明实例Java代码实现

    在<Q-learning简明实例>中我们介绍了Q-learning算法的简单例子,从中我们可以总结出Q-learning算法的基本思想 本次选择的经验得分 = 本次选择的反馈得分 + 本次 ...

  5. Filter过滤器与Session会话跟踪技术

    Filter过滤器 适用场景 1.为web应用程序的新功能建立模型(可被添加到web应用程序中或者从web应用程序中删除而不需要重写基层应用程序代码)2.用户授权Filter:负责检查用户请求,根据请 ...

  6. Linux基础命令---paste

    paste 将指定的文件按照列的方式合并,将结果显示到标准输出设备上,相当于两个并列的cat命令. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.F ...

  7. Python入门之Python引用模块和查找模块路径

    #这篇文章主要介绍了Python引用模块和Python查找模块路径的相关资料,需要的朋友可以参考下 模块间相互独立相互引用是任何一种编程语言的基础能力.对于“模块”这个词在各种编程语言中或许是不同的, ...

  8. Python入门之面向对象的多态和继承

    本章内容 Python面向对象的多态和继承对比 ========================================= 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的 ...

  9. C++微专业课程辅导(内存模型和动态内存)

    “除了静态内存和栈内存之外,每个程序还拥有一个内存池.这部分空间被称作自由空间(free store)或堆(heap).程序用堆来存储动态分配(dynamically allocate)的对象”——& ...

  10. 20145227鄢曼君《网络对抗》Web安全基础实践

    20145227鄢曼君<网络对抗>Web安全基础实践 实验后回答问题 1.SQL注入攻击原理,如何防御? SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是 ...