线段树 区间合并 单点修改 区间查询。又是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的更多相关文章

  1. hdu 1540/POJ 2892 Tunnel Warfare 【线段树区间合并】

    Tunnel Warfare                                                             Time Limit: 4000/2000 MS ...

  2. HDU 1540 / POJ 2892 Tunnel Warfare (单点更新,区间合并,求包含某点的最大连续个数)

    题意:一条线上有n个点,D x是破坏这个点,Q x是表示查询x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 思路:这题的关键是查询. 将被毁的村庄看成空位,当查询某个点的时候,如果我们知道它左 ...

  3. POJ 2892 Tunnel Warfare(线段树单点更新区间合并)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7876   Accepted: 3259 D ...

  4. POJ 2892 Tunnel Warfare

    传送门 很神奇的一道题,可以用线段树搞,为了练习treap所以拿treap写了. 其实根据询问,删除那个标号就加入平衡树,然后找到最大的和最小的就好了. 一些很烦人的小细节. //POJ 2892 / ...

  5. poj 2892 Tunnel Warfare(线段树)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7499   Accepted: 3096 D ...

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

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

  7. POJ 2892 Tunnel Warfare (SBT + stack)

    题意:给定了初始的状态:有n个村庄连成一条直线,现在有三种操作: 1.摧毁一个村庄 2.询问某个村庄,输出与该村庄相连的村庄数量(包括自己) 3.修复被摧毁的村庄,优先修复最近被摧毁的........ ...

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

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

  9. 【POJ】2892 Tunnel Warfare

    [算法]平衡树(treap) [题解]treap知识见数据结构 在POJ把语言从G++换成C++就过了……??? #include<cstdio> #include<algorith ...

随机推荐

  1. Java Web项目发布及使用自定义域名

    详细讲解的网址: http://wenku.baidu.com/link?url=-ACZxKUcfrbhrMRUP3Ov-Q_c-Q9JPrA9D1fzHjHuJsWwZfRsVDVQ2qBtoY7 ...

  2. 后台数据download成excel的方法(controller/action)

    jsp页面端 <a href="/portal/server/importExec" title="Data Download"> <img ...

  3. MPEG1的码流层次与各层次的作用

    1. 序列层(Sequence layer) 序列层主要用于为随机播放提供全局参数支持,这些参数包括图像宽高.像素高宽比.帧率.码率.VBV大小.帧内量化矩阵.帧间量化矩阵. 2. 图像组层(Grou ...

  4. 使用anyremote进行远程鼠标控制

    源代码安装 http://anyremote.sourceforge.net/pre.html 安装  -xtest apt-get install libxtst-dev 安装 glib sudo ...

  5. UML示例图

  6. 基于Win32 SDK实现的一个简易线程池

    利用C++实现了一个简易的线程池模型(基于Win32 SDK),方便使用多线程处理任务.共包含Thread.h.Thread.cpp.ThreadPool.h.ThreadPool.cpp四个源文件. ...

  7. 转 EXPDP ORA-39095 ORA-3909 错误

    今天帮同事在测试库上导出两张表,第一张表大小为30M,第二章表大小为7G,以下是expdp语法 expdp tranuser/******** parallel=4 content=data_only ...

  8. springmvc 关于controller的字符编码

    在使用springMVC框架构建web应用,客户端常会请求字符串.整型.json等格式的数据,通常使用@ResponseBody注解使 controller回应相应的数据而不是去渲染某个页面.如果请求 ...

  9. Learning Java 8 Syntax (Java in a Nutshell 6th)

    Java is using Unicode set Java is case sensitive Comments, C/C++ style abstract, const, final, int, ...

  10. mysql 修改 添加 删除 表字段

    添加表的字段    alter table 表名  add  字段名  字段的类型 例子:        alter table table1 add transactor varchar(10) n ...