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. !!【通达信】求教:如何对A股的所有股票按照某个选股指标的某个参数排序? - 理想论坛 中国人气最旺的股票论坛

    http://www.55188.com/thread-7152852-1-1.html .401进入指标排序,然后占右键把指标更改为MACD即可.(注意401前投资面有一个点!)

  2. webbench,简单、实用!

    官网:http://home.tiscali.cz/~cz210552/webbench.html   1.下载并安装 # wget http://home.tiscali.cz/~cz210552/ ...

  3. 更换mysql数据库的datadir目录

    更换过程如下: 1.新建指定的datadir目录,这里举例如:E:/mysql_datadir/data. 2.关闭mysql57服务器. 3.将原来的datadir目录下面的所有文件拷贝到E:/my ...

  4. Asp.net MVC 通过自定义ControllerFactory实现构造器注入

    一.重写ControllerFactory的GetControllerInstance ControllerFactory是asp.net中用于在运行时构造Controller的工厂 ,默认使用的工厂 ...

  5. jquery基础框架

    (function(window,undefined){ var arr = [], push = arr.push, slice = arr.slice; //首先要做的就是封装一个parseHtm ...

  6. web前端----css补充

    css常用的一些属性: 1.去掉下划线 :text-decoration:none ;2.加上下划线: text-decoration: underline; 3.调整文本和图片的位置(也就是设置元素 ...

  7. 华为C/C++笔试题&答案

    1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问 ...

  8. UVA12558 Egyptian Fractions (HARD version) (埃及分数,迭代加深搜索)

    UVA12558 Egyptian Fractions (HARD version) 题解 迭代加深搜索,适用于无上界的搜索.每次在一个限定范围中搜索,如果无解再进一步扩大查找范围. 本题中没有分数个 ...

  9. phpMyAdmin本地文件包含漏洞

    4 phpMyAdmin本地文件包含漏洞 4.1 摘要 4.1.1 漏洞简介 phpMyAdmin是一个web端通用MySQL管理工具,上述版本在/libraries/gis/pma_gis_fact ...

  10. 20145332 MAL_简单后门

    20145332 MAL_简单后门 用NC获取远程主机的shell 2.1.1 Windows获得Linux的权限 首先要在Windows主机下安装ncat.exe,安装完成后需要配置环境变量path ...