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直接或间 ...
随机推荐
- Python基础——列表、元组操作
列表.元组操作 列表: 列表是Python中最基本的数据结构,列表是最常用的Python数据类型,列表的数据项不需要具有相同的类型.列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0 ...
- 新人转型学习C#
毕业3年,终于在4个多月前,下定决心辞职了.一直以来都想从事软件开发的工作,也觉得自己更加适合这方面的工作.自己如果这一次还是没能往这方面发展的话,感觉以后也不会有机会了. 于是,想着工作先不找了,买 ...
- HDU_1285_拓扑排序(优先队列)
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- C# Tuple 创建一个新二元集合
List<string> list1=new List<string>(); List<string> list2=new List<string>() ...
- python 获取本机环境信息
一.函数 1.socket.gethostname():不带任何参数,返回一个字符串(主机名),通常不完整.比如csm.example.com 只会返回csm 2.socket.getfqdn():带 ...
- VMware Workstation Pro 15 for Windows下载与安装
VMware Workstation Pro 15 for Windows下载与安装 一.下载 下载地址:https://my.vmware.com/cn/web/vmware/details?dow ...
- MySQL操作数据库和表的基本语句(DDL
1.创建数据库: CREATE DATABASE 数据库名; eg.CREATE DATABASE test_ddl;122.创建表 CREATE TABLE 表名(列名 数据类型 约束,...); ...
- selenium之浏览器驱动
selenium需要配合浏览器的驱动使用,几个主要的浏览器驱动如下 浏览器 链接 Chrome https://sites.google.com/a/chromium.org/chromedriver ...
- 使用Python PIL库中的Image.thumbnail函数裁剪图片
今天,是我来到博客园的第五天,发现自己还没有头像,想着上传ubuntu系统中我很喜欢的一个背景图片来当头像,但是因为图片过大,上传失败了.那么,我们如何使用python中强大的PIL库来进行图片裁剪呢 ...
- vue 组件通信传值
父子组件通信: 子组件 <template> <div> <h3 @click="alerrt"> 我是子组件一</h3> < ...