HDU 1540 POJ 2892 Tunnel Warfare
线段树 区间合并 单点修改 区间查询。又是1秒钟构思,差错查了好久... ... 发现一个int型的定义成了char型,打脸。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std; const int maxn= +;
int N,Q;
char op[];
int num;
stack<int>S;
bool flag[maxn];
struct SegTree
{
int lsum,rsum,msum;
}segTree[*maxn];
int fail,ans1,ans2; void pushUp(int rt,int len)
{
if(segTree[*rt].lsum==len-len/)
segTree[rt].lsum=segTree[*rt].lsum+segTree[*rt+].lsum;
else segTree[rt].lsum=segTree[*rt].lsum; if(segTree[*rt+].rsum==len/)
segTree[rt].rsum=segTree[*rt].rsum+segTree[*rt+].rsum;
else segTree[rt].rsum=segTree[*rt+].rsum; segTree[rt].msum=max(segTree[*rt].msum,segTree[*rt+].msum);
segTree[rt].msum=max(segTree[rt].msum,segTree[*rt+].lsum+segTree[*rt].rsum);
} void build(int l,int r,int rt)
{
if(l==r)
{
segTree[rt].lsum=segTree[rt].rsum=segTree[rt].msum=;
return;
} int m=(l+r)/;
build(l,m,*rt);
build(m+,r,*rt+);
pushUp(rt,r-l+);
} void update(int info,int node,int l,int r,int rt)
{
if(l==r&&node==l)
{
segTree[rt].lsum=segTree[rt].rsum=segTree[rt].msum=info;
return;
} int m=(l+r)/;
if(node<=m) update(info,node,l,m,*rt);
else update(info,node,m+,r,*rt+); pushUp(rt,r-l+);
} void quary1(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
ans1=ans1+segTree[rt].rsum;
if(segTree[rt].rsum!=r-l+) fail=;
return;
} int m=(l+r)/;
if(R>m) quary1(L,R,m+,r,*rt+);
if(fail) return;
if(L<=m) quary1(L,R,l,m,*rt);
if(fail) return;
} void quary2(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
ans2=ans2+segTree[rt].lsum;
if(segTree[rt].lsum!=r-l+) fail=;
return;
} int m=(l+r)/;
if(L<=m) quary2(L,R,l,m,*rt);
if(fail) return;
if(R>m) quary2(L,R,m+,r,*rt+);
if(fail) return;
} int main()
{
// freopen("in.txt","r",stdin);
while(~scanf("%d%d",&N,&Q))
{
while(!S.empty()) S.pop(); build(,N,);
for(int i=;i<=N;i++) flag[i]=; for(int i=;i<=Q;i++)
{
scanf("%s",op);
if(op[]=='D')
{
scanf("%d",&num);
S.push(num);
flag[num]=;
update(,num,,N,);
}
else if(op[]=='Q')
{
scanf("%d",&num);
if(!flag[num]) printf("%d\n",);
else
{
ans1=,ans2=;
fail=;
if(num->=) quary1(,num-,,N,);
fail=;
if(num+<=N) quary2(num+,N,,N,); int ans=ans1+ans2+; printf("%d\n",ans);
}
}
else if(op[]=='R')
{
if(S.empty()) continue;
num=S.top();
S.pop();
flag[num]=;
update(,num,,N,);
}
}
}
return ;
}
HDU 1540 POJ 2892 Tunnel Warfare的更多相关文章
- hdu 1540/POJ 2892 Tunnel Warfare 【线段树区间合并】
Tunnel Warfare Time Limit: 4000/2000 MS ...
- HDU 1540 / POJ 2892 Tunnel Warfare (单点更新,区间合并,求包含某点的最大连续个数)
题意:一条线上有n个点,D x是破坏这个点,Q x是表示查询x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 思路:这题的关键是查询. 将被毁的村庄看成空位,当查询某个点的时候,如果我们知道它左 ...
- POJ 2892 Tunnel Warfare(线段树单点更新区间合并)
Tunnel Warfare Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 7876 Accepted: 3259 D ...
- POJ 2892 Tunnel Warfare
传送门 很神奇的一道题,可以用线段树搞,为了练习treap所以拿treap写了. 其实根据询问,删除那个标号就加入平衡树,然后找到最大的和最小的就好了. 一些很烦人的小细节. //POJ 2892 / ...
- poj 2892 Tunnel Warfare(线段树)
Tunnel Warfare Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 7499 Accepted: 3096 D ...
- POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)
点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...
- POJ 2892 Tunnel Warfare (SBT + stack)
题意:给定了初始的状态:有n个村庄连成一条直线,现在有三种操作: 1.摧毁一个村庄 2.询问某个村庄,输出与该村庄相连的村庄数量(包括自己) 3.修复被摧毁的村庄,优先修复最近被摧毁的........ ...
- POJ 2892 Tunnel Warfare(树状数组+二分)
题目链接 二分求上界和下界,树状数组.注意特殊情况. #include <cstring> #include <cstdio> #include <string> ...
- 【POJ】2892 Tunnel Warfare
[算法]平衡树(treap) [题解]treap知识见数据结构 在POJ把语言从G++换成C++就过了……??? #include<cstdio> #include<algorith ...
随机推荐
- 查询MySQL中某个数据库中有多少张表
SELECT COUNT(*) TABLES, table_schema FROM information_schema.TABLES WHERE table_schema = '数据库' GRO ...
- php 获取地址栏参数
javascript实现: top.location.href 顶级窗口的地址this.location.href 当前窗口的地址 PHP实现: //获取域名或主机地址 echo $_SERVER[' ...
- sscanf用法
sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源. 1. 常见用法. 1 2 3 char buf[512] ; sscanf(" ...
- 1.1 sikuli 安装
JRE7不支持sikuli,必须下载JRE6 更新号必须大于35 sikuli下载: http://www.cr173.com/soft/52775.html 或参照 http://www.cnb ...
- 初学.net 网页打开过程
一个网页打开的过程 1.进入控制器里的方法里 控制器的命名必须以Controll结尾前面的名字要和view层的命名一致 2.控制器完了以后 就进入view层对应的视图里 3.视图里调用model ...
- 灵感闪现 篇 (一) 2d场景 3d 效果
中途打断一下 ,框架文档的 更新. 另开一篇主题为 灵感闪现的 板块. 在工作生活中,总有发现新事物或新东西 而让自己突然 灵感闪现的时候,那么这个时候,我必须要抓住,并尽快把 这份灵感实现下来. 之 ...
- Python 安装matplotlib,six,dateutil,pyparsing 完整过程
[摘要:正在做词频剖析的时间,须要用matlotlib 做图表,柱状图啥的,因而便最先了一个又一个的装置库的进程 由于matplotlib 须要依附很多其他科教盘算的第三圆库,须要一个一个的装置了.. ...
- Stem Cell 华人科学家
Jianping Fu 密歇根大学机械工程系生物医学工程专业 PhD, Massachusetts Institute of Technology, 2007MS, University of Cal ...
- 清北学堂入学测试P4751 H’s problem(h)
P4751 H’s problem(h) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 小H是一个喜欢逛街的女孩子,但是由于上了大学 ...
- drawable文件夹详解
QVGA使用ldpi,虽然有不同尺寸,但都是120dpi左右:HVGA同理:如下图: -finger 用于触摸屏的设备 -hdpi 近似于240dpi的高级显示密度的屏幕 -mdpi ...