线段树 区间合并 单点修改 区间查询。又是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. vb6学习心路

    1.不能加载 'MSCOMCTL.OCX'--继续加载工程吗解决办法:新建一个VB工程,然后按CTRL + T,选中 “Microsoft Windows Common Controls 6.0” 然 ...

  2. JS-如何把字符串转换成数组

    var a = "1,22,33,44"; // 字符串 var b = a.split(","); // 将字符串按照","分割,存入数组 ...

  3. ubuntu 上下载PHP的源代码

    参考: https://vpsineu.com/blog/how-to-build-and-install-php-5-6-9-from-source-on-ubuntu-14-04-vps/ 直接 ...

  4. Jquery 实现原理之 Ajax

    一:Jquery Ajax底层接口有:$.ajaxPrefilters.$.ajaxTransport.$.ajaxSettings.$ajaxSetup.$ajaxSettings; 其中$.aja ...

  5. OpenGL一些函数详解(二)

    OpenGL ES顶点数据绘制技巧 在OpenGL中,绘制一个长方体,需要将每个顶点的坐标放在一个数组中.保存坐标时有一些技巧(由于字母下标不好表示,因此将下标表示为单引号,如A1将在后文中表示为A' ...

  6. Math类的round方法小解

    在Math类中有三个关于“四舍五入”的静态方法(ceil,floor,round): ① Math.ceil(number) 向上取整,Math.ceil(11.2) 结果:12            ...

  7. loadrunner基本概念、安装及术语(一)

    一.初识loadrunner: LoadRunner,是一种预测系统行为和性能的负载测试工具.通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架 ...

  8. PHP AJAX技术

    AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX 通过在后台与服务器进行少量数据交换,使网页实现异步更新.这意味着可以在不重载整个页面的情况下,对网页的某些部分进行更 ...

  9. ffmpeg合并多个视频

    实例1: 把4个视频(1.f4v, 2.f4v, 3.f4v, 4.f4v)合并成一个文件(out.mp4) 基本无损,而且速度飞快! #-vcodec copy -acodec copy   == ...

  10. Linux学习 -- Shell编程 -- 字符处理命令

    sort排序命令 sort [选项] 文件名 -f 忽略大小m写 -n 按数值型,默认字符串型 -r 反向 -t 指定分隔符 -k n[,m] 指定字段范围,默认行尾 eg. sort -n -t & ...