线段树 区间合并 单点修改 区间查询。又是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. Qt 学习之路 2(84):Repeater

    前面的章节我 们介绍过模型视图.这是一种数据和显示相分离的技术,在 Qt 中有着非常重要的地位.在 QtQuick 中,数据和显示的分离同样也是利用这种"模型-视图"技术实现的.对 ...

  2. 笨方法学python--打印

    1 print 语句 尾端的逗号 end1 = "C" end2 = "h" end3 = "e" end4 = "e" ...

  3. JQuery获取input type="text"中的值的各种方式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. php composer 安装

  5. 转载,find.sh

    #!/bin/bash #find files contains a keyword #write by xiaojing.zhao #2012.12.14 echo -e "\nThis ...

  6. Sanatorium

    Sanatorium time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  7. Struts中的数据处理的三种方式

    Struts中的数据处理的三种方式: public class DataAction extends ActionSupport{ @Override public String execute() ...

  8. 什么是dtd文件,为什么需要

    DTD为英文Document Type Definition,中文意思为“文档类定义”.DTD肩负着两重任务:一方面它帮助你编写合法的代码,另一方面它让浏览器正确地显示器代码.也许你会问它们居然有这样 ...

  9. 完整版getByClass2016/4/20

    function getByclass(parent,sclass) { var re=new RegExp('\\b'+sclass+'\\b','i') var aEli=parent.getEl ...

  10. VirtualBox中CentOS通过Host-Only方式实现虚拟机主机互相访问、共享上网

    VirtualBox常用的网络配置如下: 连接方式 主机访问虚拟机 虚拟机访问主机 虚拟机访问虚拟机 虚拟机访问外网 说明 网络地址转换(NAT) 不支持 支持 不支持 支持 默认连接方式,虚拟IP, ...