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. PHP免费API调用,使用(CURL)

    <?phpclass GetApiModel{//获取第三方API //获取身份证信息 //返回json /*{ "errNum": 0, "retMsg" ...

  2. Linux 的使用基础---Shell程序设计

    Shell是Linux系统中的一个重要的层次,它是用户与系统交互作用的界面.Shell除了作为命令解释程序以外,还是一种高级程序设计语言.利用Shell程序设计语言可以编写出功能很强.但代码简单的程序 ...

  3. [转]十年前的老文:以 Linux 的名义

    一.灰姑娘的狂欢 今年初,林纳斯·托瓦兹承认:“如果在12年前,有人告诉我Linux会发展到今天的模样,我肯定会惊得目瞪口呆.” 托瓦兹说的是实话.1991年,这名21岁的芬兰赫尔辛基大学的学生,偶然 ...

  4. 通过sql做数据透视表,数据库表行列转换(pivot和Unpivot用法)(一)

    在mssql中大家都知道可以使用pivot来统计数据,实现像excel的透视表功能 一.MSsqlserver中我们通常的用法 1.Sqlserver数据库测试 ---创建测试表 Create tab ...

  5. JavaScript学习笔记(7)——JavaScript语法之函数

    函数就是包裹在花括号中的代码块,前面使用了关键词 function: function functionname() { //这里是要执行的代码 } 当调用该函数时,会执行函数内的代码. 可以在某事件 ...

  6. Redis多机集群

    Redis集群.网上很多教程,只是按着它的步骤来做只能在单机上跑,而已不有点抗.也不用密码验证 开始: 1:redis集群最少需要要6个服务器端,因此先搞6台虚拟机 我用 centOS-7 mini ...

  7. jquery的effect-color对easyui没效果.自己冒险写个边框的颜色闪烁.

    "jquery-ui-effect-color.js" 是从jqueryui下载的color动画部分(自己改了个名字). 链接 <!DOCTYPE html> < ...

  8. JS实现div块的拖放,调换位置

    主要是HTML5 的拖放(Drag 和 Drop) 例子(不需要对div设置ID): <!DOCTYPE HTML> <html> <head> <scrip ...

  9. GZIP 头解析

    在用HttpWebRequest对象时,一般我们都没有开启gzip压缩,如果服务端返回的数据比较大,这是我们需要开启gzip压缩,怎么开启呢? 1.给HttpWebRequest对象,添加如下Head ...

  10. parseInt()、parseFloat()与Number()的比较

    我有一个同学最近在自学JavaScript,偶尔遇到问题了会让我帮忙解决,虽然我也是一个JavaScript菜鸟,但是我还是很乐意帮忙,这样不仅可以帮到别人,也可以让自己在解决问题的过程中学到更多知识 ...