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直接或间 ...
随机推荐
- HDU_Reward_拓扑排序
Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- centos安装指定mysql
mysql下载地址:http://repo.mysql.com/ nginx下载地址 我下载是这个 http://nginx.org/packages/centos/7/noarch/RPMS/ngi ...
- BZOJ 2850: 巧克力王国 KDtree + 估价函数
Code: #include<bits/stdc++.h> #define maxn 100000 #define inf 1000000008 #define mid ((l+r)> ...
- tomcat8安装及配置
首先是解压版的安装.很简单,直接解压到要安装的位置就OK了. 2.启动 bin目录下,执行startup.bat文件 3.浏览器中打开地址http://localhost:8080/
- 洛谷——P3205 [HNOI2010]合唱队
P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...
- Linux之FTP/TFTP(vsftp、vsftpd) HTTP(httpd、apache) DHCP(dhcpd)
FTP/TFTP(vsftp.vsftpd): FTP是File Transfer Protocol(文件传输协议)而中文简称为"文传协议".用于Internet上的控制文件的双向 ...
- 10.多shard场景下relevence score可能不准确
主要知识点 多shard场景下relevence score可能不准确的原因 多shard场景下relevence score可能不准确解决方式 一.多shard场景下relevance sc ...
- bat 读取当前目录指定文件信息并拼接
bat 读取指定文件的信息并拼接成指定格式
- 学习C语言偶遇【斐波那契数列】
1.今天学着学着就发现一个特别有趣的数列,斐波那契数列,感觉很好玩,翠花,上代码~~~~~~~ #include <stdio.h> int fibonaci(int i) { ) { ; ...
- Tensorflow人工智能入门(一)
前言: 作为一个程序员,已经离开开发岗好多年,最近突然迷茫了,不知道自己何去何从.互联网技术发展的速度已快得难以想象,许久不码代码的手也越来越僵直,需求沟通中的套话和空话却越发的熟练,这和当年入行时的 ...