http://acm.hdu.edu.cn/showproblem.php?pid=1540

Tunnel Warfare

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3168    Accepted Submission(s): 1216

Problem Description
During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast areas of north China Plain. Generally speaking, villages connected by tunnels lay in a line. Except the two at the ends, every village was directly connected with two neighboring ones.
Frequently the invaders launched attack on some of the villages and destroyed the parts of tunnels in them. The Eighth Route Army commanders requested the latest connection state of the tunnels and villages. If some villages are severely isolated, restoration of connection must be done immediately!
 
Input
The first line of the input contains two positive integers n and m (n, m ≤ 50,000) indicating the number of villages and events. Each of the next m lines describes an event.
There are three different events described in different format shown below:
D x: The x-th village was destroyed.
Q x: The Army commands requested the number of villages that x-th village was directly or indirectly connected with including itself.
R: The village destroyed last was rebuilt.
 
Output
Output the answer to each of the Army commanders’ request in order on a separate line.
 
Sample Input
7 9
D 3
D 6
D 5
Q 4
Q 5
R
Q 4
R
Q 4
 
Sample Output
1
0
2
4
 
Source
 
【题解】:
区间线段树树:
节点:
struct Nod
{
    int l,r;   //左右
    int ll,ml,rl;   //左边开始连续的最大长度、中间的最大长度、右边开始最大的连续长度(对没摧毁的村庄来说)
}node[N<<2];
建树和更新应该是没问题的
下面我说下查询:
int query(int id,int p)  //传入参数
{
    if(node[p].l==node[p].r||node[p].ml==0||node[p].ml==node[p].r-node[p].l+1)
    {
        return node[p].ml;
    }
    int mid = (node[p].l+node[p].r)>>1;
    if(id<=mid)
    {
        if(id>=node[lson].r-node[lson].rl+1)   return query(id,lson)+query(mid+1,rson);  //1
        else query(id,lson);
    }
    else
    {
        if(id<=node[rson].l+node[rson].ll-1)   return query(mid,lson)+query(id,rson);  //2
        else query(id,rson);
    }
}
附上图形解释:
 
【code】:
 #include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<stack>
#define N 50005
#define lson p<<1
#define rson p<<1|1 using namespace std; struct Nod
{
int l,r; //左右
int ll,ml,rl; //左边开始连续的最大长度、中间的最大长度、右边开始最大的连续长度(对没摧毁的村庄来说)
}node[N<<]; void building(int l,int r,int p) //建树
{
node[p].l = l;
node[p].r = r;
node[p].ll=node[p].ml=node[p].rl=r-l+;
if(l==r) return;
int mid = (l+r)>>;
building(l,mid,lson);
building(mid+,r,rson);
} void update(int id,int p,int ok)
{
if(node[p].l==node[p].r)
{
if(ok==) node[p].ll=node[p].ml=node[p].rl=;
else node[p].ll=node[p].ml=node[p].rl=;
return ;
}
int mid = (node[p].l+node[p].r)>>;
if(id<=mid) update(id,lson,ok);
else update(id,rson,ok); node[p].ml = max(node[lson].ml,node[rson].ml);
node[p].ml = max(node[p].ml,node[lson].rl+node[rson].ll); //最大中间值是 左右孩子的中间值 与 左边右最大+右边左最大 三者的最大值 node[p].ll = node[lson].ll; //左孩子的左最大
node[p].rl = node[rson].rl; //右孩子的右最大 if(node[lson].ll==node[lson].r-node[lson].l+) node[p].ll+=node[rson].ll;
if(node[rson].rl==node[rson].r-node[rson].l+) node[p].rl+=node[lson].rl;
} int query(int id,int p)
{
if(node[p].l==node[p].r||node[p].ml==||node[p].ml==node[p].r-node[p].l+)
{
return node[p].ml;
}
int mid = (node[p].l+node[p].r)>>;
if(id<=mid)
{
if(id>=node[lson].r-node[lson].rl+) return query(id,lson)+query(mid+,rson); //
else query(id,lson);
}
else
{
if(id<=node[rson].l+node[rson].ll-) return query(mid,lson)+query(id,rson); //
else query(id,rson);
}
} int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
char op[];
int id;
stack<int> stk;
building(,n,);
while(m--)
{
scanf("%s",op);
if(op[]=='D')
{
scanf("%d",&id);
stk.push(id);
update(id,,);
}
else if(op[]=='Q')
{
scanf("%d",&id);
printf("%d\n",query(id,));
}
else if(op[]=='R')
{
id = stk.top();
stk.pop();
update(id,,);
}
}
while(!stk.empty()){stk.pop();}
}
return ;
}

hdu 1540 Tunnel Warfare (区间线段树(模板))的更多相关文章

  1. HDU 1540 Tunnel Warfare 平衡树 / 线段树:单点更新,区间合并

    Tunnel Warfare                                  Time Limit: 4000/2000 MS (Java/Others)    Memory Lim ...

  2. HDU - 1540 Tunnel Warfare(线段树区间合并)

    https://cn.vjudge.net/problem/HDU-1540 题意 D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 分析 线段树的区间内,我 ...

  3. hdu 1540 Tunnel Warfare (线段树 区间合并)

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  4. hdu 1540 Tunnel Warfare(线段树)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1540 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. ...

  5. hdu 1540 Tunnel Warfare (线段树,维护当前最大连续区间)

    Description During the War of Resistance Against Japan, tunnel warfare was carried out extensively i ...

  6. HDU 1540 Tunnel Warfare(线段树+区间合并)

    http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目大意:抗日战争期间进行地道战,存在n个村庄用地道连接,输入D表示破坏某个村庄(摧毁与其相连的地道, 包 ...

  7. HDU 1540 Tunnel Warfare(最长连续区间 基础)

    校赛,还有什么途径可以申请加入ACM校队?  Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/ ...

  8. HDU--1540 Tunnel Warfare(线段树区间更新)

    题目链接:1540 Tunnel Warfare 以为单组输入 这个题多组输入 结构体记录每个区间左边和右边的连续区间 ms记录最大 在查询操作时: 1.这个点即将查询到右区间 看这个点 x 是否存在 ...

  9. hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并

    Tunnel Warfare Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

随机推荐

  1. TextView设置动态改变颜色

    通过TextView的setTextColor方法进行文本颜色的设置, 这里可以有3种方式进行设置: 第1种:tv.setTextColor(android.graphics.Color.RED);/ ...

  2. [置顶] 运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy),三大件(bigthree problem)

    一般的我们喜欢这样对对象赋值: Person p1;Person p2=p1; classT object(another_object), or    A a(b); classT object = ...

  3. onsubmit表单验证

    <script type="text/javascript"> function check(){ var username=document.getElementBy ...

  4. C#学习笔记9:C#中的变量、转义符、显式转换和隐式转换

    1.变量的特性:可以重复的赋值 int a=4;  a=9; 2.常量:const int  number=10:这个常量不可变 如果你声明的变量,不想被其他人修改,那么就修饰为常量 声明在类的下面, ...

  5. Fragment的数据传递

    开发之中用到的Fragment的次数越来越多,很多小的项目都已经直接在使用Fragment作为Activity的载体来切换页面.而在开发之中页面的切换我们最关心的问题就是数据的传递了.今天我们主要来研 ...

  6. ping 命令详解

    Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说"ping一下某机器,看是不是开着".不能打开网页时会说"你先ping网关地址 ...

  7. Extjs搜索域使用

    要在使用的panel在预先加载搜索域类requires : ["Ext.ux.form.SearchField"],

  8. 第二十篇、自定义UIButton(设置title和image的位置)

    #import "CustomButton.h" #define ImageW 15 #define ImageH 15 #define KRadio 0.75 @implemen ...

  9. Java实战之03Spring-03Spring的核心之AOP(Aspect Oriented Programming 面向切面编程)

    三.Spring的核心之AOP(Aspect Oriented Programming 面向切面编程) 1.AOP概念及原理 1.1.什么是AOP OOP:Object Oriented Progra ...

  10. [位运算] [搜索] [递推优化] [计算几何] TEST 2016.7.15

    NOIP2014 提高组模拟试题 第一试试题 题目概况: 中文题目名称 合理种植 排队 科技节 源程序文件名 plant.pas/.c/.cpp lineup.pas/.c/.cpp scifest. ...