`
Simone_chou
  • 浏览: 192810 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

Tunnel Warfare(线段树 + 区间合并)

    博客分类:
  • HDOJ
 
阅读更多

Tunnel Warfare

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


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

      题意:

      给出 n,m(1 ~ 50000),代表有 n 个连续的城市 和 m 个操作,操作有 3 类,D ans,代表要把编号为 ans 的城市毁灭,R 代表要重建最后毁灭的那么 城市,Q ans 代表询问包含 ans 的完好的连续城市有几个。每次 Q 给出一个结果。

  

      思路:

      线段树,区间合并。注意 updata 的时候要判断往左还是往右,如果不判断的话,则会 TLE。

 

      AC:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>

using namespace std;

const int MAX = 500050;

int lmax[MAX], rmax[MAX], mmax[MAX];

void push_up(int node, int l, int r) {
        lmax[node] = lmax[node << 1];
        rmax[node] = rmax[node << 1 | 1];

        int mid = (r + l) >> 1;
        if (lmax[node] == mid - l + 1) lmax[node] += lmax[node << 1 | 1];
        if (rmax[node] == r - mid) rmax[node] += rmax[node << 1];

        mmax[node] = max(rmax[node << 1] + lmax[node << 1 | 1],
                         max(mmax[node << 1], mmax[node << 1 | 1]));
}

void build (int node, int l, int r) {
        if (l == r) {
                lmax[node] = rmax[node] = mmax[node] = 1;
        } else {
                int mid = (r + l) >> 1;
                build(node << 1, l, mid);
                build(node << 1 | 1, mid + 1, r);
                push_up(node, l, r);
        }
}

void update(int node, int l, int r, int loc, int s) {
        if (l == r) {
                if (l == loc) {
                        mmax[node] = lmax[node] =
                        rmax[node] = (s ? 0 : 1);
                }
                return;
        }

        int mid = (r + l) >> 1;
        if (loc <= mid) update(node << 1, l, mid, loc, s);
        else update(node << 1 | 1, mid + 1, r, loc, s);
        push_up(node, l, r);
}

int query (int node, int l, int r, int loc) {
        int mid = (r + l) >> 1;

        if (mmax[node] == r - l + 1 || !mmax[node])
            return mmax[node];

        if (loc <= mid) {
                if (loc >= mid - rmax[node << 1] + 1)
                        return query(node << 1, l, mid, loc) +
                               query(node << 1 | 1, mid + 1, r, mid + 1);
                else return query(node << 1, l, mid, loc);
        } else {
                if (loc <= mid + 1 + lmax[node << 1 | 1] - 1)
                        return query(node << 1, l, mid, mid) +
                               query(node << 1 | 1, mid + 1, r, loc);
                else return query(node << 1 | 1, mid + 1, r, loc);
        }
}

int main() {
        int n, m;

        while(~scanf("%d%d", &n, &m)) {
                stack<int> s;

                build (1, 1, n);

                while (m--) {
                        char op;
                        scanf(" %c", &op);

                        if (op == 'D') {
                                int loc;
                                scanf("%d", &loc);
                                update(1, 1, n, loc, 1);
                                s.push(loc);
                        } else if (op == 'Q') {
                                int loc;
                                scanf("%d", &loc);

                                printf("%d\n", query(1, 1, n, loc));

                        } else {
                                int loc = s.top();
                                s.pop();
                                update(1, 1, n, loc, 0);
                        }
                }

        }

        return 0;
}

 

分享到:
评论

相关推荐

    线段树小总结

    一种常见的方法是将循环数组展开为两个非循环数组,然后在两个数组上分别构建线段树,通过合并两个查询结果来得到最终答案。 #### 总结 通过上述几个例子可以看出,线段树在解决区间问题时非常有效,尤其是在需要...

    tunnel:C ++中的简单通道通信

    一个简单的并行示例# include &lt; tunnel&gt;# include &lt; iostream&gt;# include &lt; thread&gt;int main () { // instanciate a new tunnel auto comm = tunnel::make(); // get the channel auto chan = std::move (std::get...

    http-tunnel http-tunnel http-tunnel http-tunnel

    http-tunnel http-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnel

    淘宝开源timetunnel入门文档

    淘宝开源 TimeTunnel 入门文档 淘宝开源的 TimeTunnel 是一个分布式的消息队列系统,旨在提供高效、可靠、可扩展的消息传输服务。在本文档中,我们将从基本概念、环境准备、编译安装、配置文件调整、测试等方面对 ...

    Tunnelblick_3.7.0 for mac 下载

    链接:https://www.tunnelblick.net/downloads.html

    IPv6 tunnel broker服務

    根据提供的文件内容,我们可以深入探讨IPv6 Tunnel Broker服务的相关知识点,包括其定义、运作原理以及在IPv4到IPv6过渡期间的应用。 ### IPv6 Tunnel Broker服务概述 IPv6 Tunnel Broker服务是一种通过现有的IPv4...

    怎样用putty设置SSH tunnel

    怎样用putty设置SSH tunnel 凡是不晓得SSH为何物的朋友可以略过,也可以google SSH开始了解它。这儿不重复了。

    Tunnelblick_3.8.5 for mac 下载

    Tunnelblick_3.8.5.dmg for mac应用文件,下载即可使用

    BPDU Tunnel

    如果没有BPDU Tunnel这样的技术,当二层协议报文在运营商网络中无法透传时,用户的网络就无法独立地进行二层协议的计算(例如STP协议的生成树计算),这会导致用户的网络与运营商网络的二层协议计算相互干扰。...

    TUNNEL隧道实验

    内附;TUNNEL隧道实验拓扑图,实验步骤和解释,还有实验文档,PDF文档。

    Carpal Tunnel

    【标题】:Carpal Tunnel综合症与计算机用户 【描述】:Carpal Tunnel(腕管综合症)是一种常见的职业病,特别是在长时间使用键盘和鼠标的IT行业中尤为普遍。它与字体设计也有一定的关联,因为合适的字体选择可以...

    httptunnel

    httptunnel下载,httptunnel下载地址,httptunnel下载说明

    httptunnel源代码(难得的windows版)

    HttpTunnel是一个开源的HTTP隧道实现。利用它能够方便的将自己应用的通讯进行HTTP封装,而不需要对应用作任何修改。是穿透防火墙的利器。现在一般能找到的是linux版本。有人将其移植到了windows平台。

    华为 NE05E&NE08E V300R003C10SPC500 特性描述 - BPDU Tunnel

    【华为 NE05E&NE08E V300R003C10SPC500 特性描述 - BPDU Tunnel】特性主要关注的是在运营商网络中如何实现BPDU(Bridge Protocol Data Unit)报文的透明传输。BPDU是用于STP(Spanning Tree Protocol)和MSTP...

    IPSec over GRE -Tunnel口

    IPSec over GRE Tunnel IPSec over GRE Tunnel 是一种安全的隧道技术,结合了 IPSec 和 GRE 两种技术的优势,提供了高级别的安全保护和灵活的网络拓扑结构。本文将通过实验环境,详细介绍 IPSec over GRE Tunnel 的...

    Tunnelblick_3.7.5beta02 for mac

    Tunnelblick_3.7.5beta02_build_4930.dmg 最新链接:https://www.tunnelblick.net/downloads.html

    WindTunnel CFD apk 流体力学仿真模拟软件

    WindTunnel CFD apk 流体力学仿真模拟软件,apk版本,主要可模拟仿真空气阻力线模型,仿真无人机滑翔机空气阻力分布

    开源项目-koding-tunnel.zip

    开源项目“Koding Tunnel”是一个创新的解决方案,旨在提供一种可插拔的隧道代理服务,让你能够轻松地从远程访问本地主机的服务。这个项目的核心在于它的灵活性和易用性,使得开发者可以不受地理位置限制地测试和...

    GNU Httptunnel Code

    开源的Httptunnel,版本3.0.5,稳定版

Global site tag (gtag.js) - Google Analytics