http://poj.org/problem?id=2892

题意:输入n,m。n代表数轴的长度,m代表操作数。

D x: 摧毁点x

Q x: 询问村庄x最左与最右没有被摧毁的点的距离

R  :恢复最后一个被摧毁的点

 #include <stdio.h>
#include <string.h>
const int N=;
int c[N],keep[N],n;
bool vis[N]; int lowbit(int x)
{
return x&(-x);
}
int sum(int x)
{
int res = ;
while(x > )
{
res+=c[x];
x-=lowbit(x);
}
return res;
}
void add(int x,int d)
{
while(x <= n)
{
c[x]+=d;
x+=lowbit(x);
}
}
int binary_find(int key)
{
int l = ,r = n+,pos = n+;
while(l <= r)
{
int mid = (l+r)>>;
if (sum(mid) >= key)
{
r = mid-;
pos = mid;
}
else
l = mid+;
}
return pos;
}
int main()
{
char ch;
int m,x,t = ;
scanf("%d%d",&n,&m);
for (int i = ; i < m; i++)
{
getchar();
scanf("%c",&ch);
if (ch=='D')
{
scanf("%d",&x);
keep[++t] = ++x;
vis[x] = true;
add(x,);
}
else if (ch=='R')
{
x = keep[t--];
vis[x] = false;
add(x,-);
}
else
{
int pos1,pos2;
scanf("%d",&x);
x++;
if (vis[x])
printf("0\n");
else
{
x = sum(x);
pos1 = binary_find(x);
pos2 = binary_find(x+);
printf("%d\n",pos2-pos1-);
}
}
}
return ;
}

STL 做法

 #include <stdio.h>
#include <set>
#include <stack>
using namespace std; int main()
{
char ch;
int n,m,x;
set<int>s;
stack<int>p;
scanf("%d%d",&n,&m);
s.insert();//增加最小边界,保证查找第一个位置时它的前一个位置存在
s.insert(n+);//增加最大边界,保证查找最后一个位置时它的后一位置存在
while(m--)
{
getchar();
scanf("%c",&ch);
if (ch=='D')
{
scanf("%d",&x);
s.insert(x);//s中储存被摧毁的点,且自动将键值从小到大排列
p.push(x);//用栈保存被摧毁的点,方便最后一个被摧毁的点的恢复
}
else if (ch=='R')
{
x = p.top();//取出最后一个被摧毁的点
p.pop();//从栈中删除该点
s.erase(x);//从s中删除该点
}
else
{
scanf("%d",&x);
int r = *(s.lower_bound(x));//r表示值>=x的第一个值,即x右边的被摧毁的点中最接近x的点
int l = *(--s.lower_bound(x));//l表示x左边的被摧毁的点中最接近x的点
if (r==x)//如果查询的点在s中被找到,说明该点已被摧毁
printf("0\n");
else
printf("%d\n",r-l-);//与x连续的没被摧毁的村庄个数
}
}
return ;
}

Tunnel Warfare(树状数组+二分)的更多相关文章

  1. POJ 2892 Tunnel Warfare(树状数组+二分)

    题目链接 二分求上界和下界,树状数组.注意特殊情况. #include <cstring> #include <cstdio> #include <string> ...

  2. POJ 2828 Buy Tickets (线段树 or 树状数组+二分)

    题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...

  3. TZOJ 4602 高桥和低桥(二分或树状数组+二分)

    描述 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算“淹了两次”.举 ...

  4. POJ 2182 Lost Cows 【树状数组+二分】

    题目链接:http://poj.org/problem?id=2182 Lost Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  5. 树状数组+二分||线段树 HDOJ 5493 Queue

    题目传送门 题意:已知每个人的独一无二的身高以及排在他前面或者后面比他高的人数,问身高字典序最小的排法 分析:首先对身高从矮到高排序,那么可以知道每个人有多少人的身高比他高,那么取较小值(k[i], ...

  6. P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  7. The Stream of Corning 2( 权值线段树/(树状数组+二分) )

    题意: 有两种操作:1.在[l,r]上插入一条值为val的线段 2.问p位置上值第k小的线段的值(是否存在) 特别的,询问的时候l和p合起来是一个递增序列 1<=l,r<=1e9:1< ...

  8. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...

  9. POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)

    点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R  ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...

随机推荐

  1. C#调用Win32 api时的内存操作

    一般情况下,C#与Win 32 Api的互操作都表现的很一致:值类型传递结构体,一维.二维指针传递IntPtr.在Win32 分配内存时,可以通过IntPtr以类似移动指针的方式读取内存.通过IntP ...

  2. day08-字符编码

    目录 计算机基础 启动应用程序 写文本的流程 Python解释器执行文件的原理 Python解释器与文本编辑器的区别 字符编码 字符编码发生在哪三个阶段 字符编码发展史与分类 总结 Python2与P ...

  3. 关于css定位的一些总结

    #pay_pic{ overflow: hidden; width: 200px; margin: 0 auto; } table.dataintable { margin-top: 15px; bo ...

  4. C语言实现截屏

    实现手机控制电脑执行部分功能需要获取桌面状态,在网上找的一段截屏代码 /** * GDI 截屏函数 * 参数 hwnd 要截屏的窗口句柄 * 参数 dirPath 截图存放目录 * 参数 filena ...

  5. Map的两种遍历方式

    ********************************************************************************* ****************** ...

  6. RAID-独立磁盘冗余阵列

    此文章理论部分内容大多数摘自网站 开心技术园 的一篇文章,但并做了一些修改与调整.理论部分原文链接:图文并茂 RAID 技术全解 – RAID0.RAID1.RAID5.RAID100-- 本文实验部 ...

  7. (蓝桥)2017C/C++A组第七题正则问题

    #include<iostream> #include<memory.h> #include<stack> #include<string> using ...

  8. ubuntu_linux /boot/grub/grub.conf

    ==========================================UBUNTU  /boot/grub/grub.conf文件============================ ...

  9. SpringBoot杂记

    一.配置文件 SpringBoot使用一个全局的配置文件,配置文件名是固定的: •application.properties •application.yml 配置文件的作用:修改SpringBoo ...

  10. android 彩信附件添加删除

    http://blog.csdn.net/yuzhu_guan2012/article/details/6679154