Tunnel Warfare(树状数组+二分)
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(树状数组+二分)的更多相关文章
- POJ 2892 Tunnel Warfare(树状数组+二分)
题目链接 二分求上界和下界,树状数组.注意特殊情况. #include <cstring> #include <cstdio> #include <string> ...
- POJ 2828 Buy Tickets (线段树 or 树状数组+二分)
题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...
- TZOJ 4602 高桥和低桥(二分或树状数组+二分)
描述 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算“淹了两次”.举 ...
- POJ 2182 Lost Cows 【树状数组+二分】
题目链接:http://poj.org/problem?id=2182 Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- 树状数组+二分||线段树 HDOJ 5493 Queue
题目传送门 题意:已知每个人的独一无二的身高以及排在他前面或者后面比他高的人数,问身高字典序最小的排法 分析:首先对身高从矮到高排序,那么可以知道每个人有多少人的身高比他高,那么取较小值(k[i], ...
- P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- The Stream of Corning 2( 权值线段树/(树状数组+二分) )
题意: 有两种操作:1.在[l,r]上插入一条值为val的线段 2.问p位置上值第k小的线段的值(是否存在) 特别的,询问的时候l和p合起来是一个递增序列 1<=l,r<=1e9:1< ...
- 牛客多校第3场 J 思维+树状数组+二分
牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...
- POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)
点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...
随机推荐
- Java_Web三大框架之Hibernate配置文件(二)
下面介绍一下编写Hibernate的配置文件,使用Hibernate操作数据库. 开始部署:下载需要的jar包 下载Hibernate Hibernat ...
- 注解是建立在class文件基础上的东西,同C语言的宏有异曲同工的效果
注解是建立在class文件基础上的东西,同C语言的宏有异曲同工的效果 https://www.cnblogs.com/deman/p/5519901.html @是java注解,即annotation ...
- CORNERSTONE在线敏捷开发工具这么强大,除了推荐,我别无选择
刚接到一个新项目,完全找不到思路, 怎么办? 任务分工不明,成员相互推诿, 怎么办? 编制的工作计划,老挨产品经理批, 怎么办? 时间短,任务紧,进度与时间两难控制, 怎么办? ...... 别着急, ...
- Vue和JQuery相比,除了节省了开发成本,还有什么优点?
1.模块化,变量都是私有作用域,JQuery只能用全局变量.闭包,影响性能 2.组件化 3.因为1,所以方便维护 vuex 要注意刷新清空的问题 vue-router是局部刷新,window.loca ...
- 1 WebService 常见问题
<binding name="> <readerQuotas maxStringContentLength=" /> </binding> &l ...
- is_NaN的使用
原生js中使用判断某个值是否是数值,有且只有一个方法就是is_NaN. 原理:这个函数使用了Number() 去转换需要判断的值.Number() 去转换值,如果有任意非数值字符存在则就不是一个数值. ...
- CF36E Two Paths (欧拉回路+构造)
题面传送门 题目大意:给你一张可能有重边的不保证联通的无向图,现在要在这个图上找出两条路径,恰好能覆盖所有边一次,根据边的编号输出方案,无解输出-1 一道很不错的欧拉路径变形题 首先要知道关于欧拉路径 ...
- java面试题(转)
1.面向对象的特征有哪些方面?答:面向对象的特征主要有以下几个方面:- 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注这些 ...
- 第一节:web爬虫之requests
Requests库是用Python编写的,并且Requests是一个优雅而简单的Python HTTP库,在使用Requests库时更加方便,可以节约我们大量的工作,完全满足HTTP测试需求.
- STM32窗口看门狗和独立看门狗的区别,看门狗介绍及代码演示
一.介绍: STM32看门狗分为独立看门狗和窗口看门狗两种,其两者使用调条件如下所示, IWDG和WWDG两者特点如下图所示: 独立看门狗的手册资料: 窗口看门狗的手册资料: ...