Tunnel Warfare(HDU1540+线段树+区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540
题目:
题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的村庄相连接的城市数量。
思路:线段树+区间合并。
代码实现如下:
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long ll;
typedef unsigned long long ull; #define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define bug printf("*********\n");
#define FIN freopen("D://code//in.txt", "r", stdin);
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define IO ios::sync_with_stdio(false),cin.tie(0); const double eps = 1e-;
const int mod = 1e8;
const int maxn = 5e4 + ;
const double pi = acos(-);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f; inline int read() {//读入挂
int ret = , c, f = ;
for(c = getchar(); !(isdigit(c) || c == '-'); c = getchar());
if(c == '-') f = -, c = getchar();
for(; isdigit(c); c = getchar()) ret = ret * + c - '';
if(f < ) ret = -ret;
return ret;
} int n, q, x, t;
char op[];
int tack[maxn]; struct node {
int l, r, mx, ls, rs; //ls为左端最大连续区间,rs为右端最大连续区间,mx为区间内最大连续区间
}segtree[maxn*]; void build(int i, int l, int r) {
segtree[i].l = l, segtree[i].r = r;
segtree[i].mx = segtree[i].ls = segtree[i].rs = r - l + ;
if(l == r) return;
int mid = (l + r) >> ;
build(lson);
build(rson);
} void update(int i, int pos, int x) {
if(segtree[i].l == segtree[i].r) {
if(x == ) segtree[i].mx = segtree[i].ls = segtree[i].rs = ; //此处为修复操作
else segtree[i].mx = segtree[i].ls = segtree[i].rs = ; //摧毁操作
return;
}
int mid = (segtree[i].l + segtree[i].r) >> ;
if(pos <= mid) {
update(i * , pos, x);
} else {
update(i * + , pos, x);
}
segtree[i].ls = segtree[i*].ls;
segtree[i].rs = segtree[i*+].rs;
segtree[i].mx = max(max(segtree[i*].mx, segtree[i*+].mx), segtree[*i].rs + segtree[i*+].ls);
if(segtree[i*].ls == segtree[i*].r - segtree[i*].l + ) { //如果左端全是连接的,那么ls还要右子树的ls
segtree[i].ls += segtree[i*+].ls;
}
if(segtree[i*+].rs == segtree[i*+].r - segtree[i*+].l + ) { //同理
segtree[i].rs += segtree[i*].rs;
}
} int query(int i, int pos) {
if(segtree[i].l == segtree[i].r || segtree[i].mx == segtree[i].r - segtree[i].l + || segtree[i].mx == ) {
return segtree[i].mx;
}
int mid = (segtree[i].l + segtree[i].r) >> ;
if(pos <= mid) {
if(pos >= segtree[*i].r - segtree[i*].rs + ) { //如果pos与右边连接,那么还需要跑另一棵子树
return query(i * , pos) + query(i * + , mid + );
} else {
return query(i * , pos);
}
} else {
if(pos <= segtree[i * + ].l + segtree[i*+].ls - ) { //同理
return query(i * + , pos) + query(i * , mid);
} else {
return query(i * + , pos);
}
}
} int main() {
//FIN;
while(~scanf("%d%d", &n, &q)) {
build(, , n);
t = ;
while(q--) {
scanf("%s", op);
if(op[] == 'D') {
scanf("%d", &x);
tack[++t] = x;
update(, x, );
} else if(op[] == 'R') {
if(t > ) {
x = tack[t--];
update(, x, );
}
} else {
scanf("%d", &x);
printf("%d\n", query(, x));
}
}
}
return ;
}
Tunnel Warfare(HDU1540+线段树+区间合并)的更多相关文章
- hdu 1540/POJ 2892 Tunnel Warfare 【线段树区间合并】
Tunnel Warfare Time Limit: 4000/2000 MS ...
- HDU - 1540 Tunnel Warfare(线段树区间合并)
https://cn.vjudge.net/problem/HDU-1540 题意 D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 分析 线段树的区间内,我 ...
- HDU 1540 Tunnel Warfare(线段树+区间合并)
http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目大意:抗日战争期间进行地道战,存在n个村庄用地道连接,输入D表示破坏某个村庄(摧毁与其相连的地道, 包 ...
- hdu 1540 Tunnel Warfare (线段树 区间合并)
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU--1540 Tunnel Warfare(线段树区间更新)
题目链接:1540 Tunnel Warfare 以为单组输入 这个题多组输入 结构体记录每个区间左边和右边的连续区间 ms记录最大 在查询操作时: 1.这个点即将查询到右区间 看这个点 x 是否存在 ...
- HDU1540 Tunnel Warfare(线段树区间维护&求最长连续区间)题解
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- hdu1540-Tunnel Warfare (线段树区间合并)
题意:n个村庄,有三种操作,D x 破坏位置为x的村庄,R 修复上一次被破坏的村庄,Q x 输出含有x村庄的连续村庄的最大个数.线段树搞之,区间合并. ls[maxn]为当前节点左面的连续区间,rs[ ...
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
- HDU 3911 线段树区间合并、异或取反操作
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...
随机推荐
- iOS-开发将文本复制到剪切板
下面方法可以将文本复制到剪切板 UIPasteboard *pboard = [UIPasteboard generalPasteboard]; pboard.string = @"邀请码& ...
- c++设计模式----装饰模式
前言 在实际开发时,你有没有碰到过这种问题:开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作:而有一些非核心的操作,可能会使用,也可能不会使用:现在该怎么办呢? 将这 ...
- laravel5.6 后台无法退出,必须清楚浏览器缓存才能退出
方法一: 在后台,admin/logincontroleer.php 中 可行 public function logout(Request $request) { Auth::logout(); ...
- QObject类 moc处理后代码
QObject在QT中是所有类的基类,经过MOC处理后代码如下 之所以贴出这段代码,是因为很多流程追踪到最后一些关键性函数都是出自这个类 源码 4.8.6 MOC版本 63 /************ ...
- java 基础 --int 和Integer的区别
感到脸红:int是整形 -128~127 Integer是正整型,你怎么会想到这样的回答,妈的,有脑子吗?!!! 1,int是基本数据类型,初始为0,Integer为封装类,初始为null ①无论如何 ...
- poj1456——Supermarket
Supermarket Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14656 Accepted: 6656 Desc ...
- [LOJ #2473] [九省联考2018] 秘密袭击coat
题目链接 洛谷. LOJ,LOJ机子是真的快 Solution 我直接上暴力了...\(O(n^2k)\)洛谷要\(O2\)才能过...loj平均单点一秒... 直接枚举每个点为第\(k\)大的点,然 ...
- Linux相关——关于gdb的checkpoint & breakpoints指令
1,checkpoint ,,,这个指令简直,,,相见恨晚啊,居然现在才发现,.. 好吧来介绍一下这个指令:checkpoint(检查点) 我们调试程序,常常会出现好不容易发现了错误,却已经跑完那个地 ...
- 38 一次 redis 连接泄露的原因 以及 ShardedJedisPool
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011039332/article/details/85381051前言 这个是接着 上次的 这篇文 ...
- BZOJ1023:[SHOI2008]仙人掌图——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1023 Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple ...