https://cn.vjudge.net/problem/HDU-1540

题意

D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少。

分析

线段树的区间内,我们要用三个变量记录左边连续区间,右边连续区间和最大连续区间。

其它看代码,要比较仔细。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <set>
#include <bitset>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ms(a, b) memset(a, b, sizeof(a))
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define eps 0.0000000001
#define IOS ios::sync_with_stdio(0);cin.tie(0);
#define random(a, b) rand()*rand()%(b-a+1)+a
#define pi acos(-1)
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const int inf = 0x3f3f3f3f;
const int maxn = + ;
const int maxm = + ;
const int mod = ;
struct ND{
int l,r;
int ls,rs,ms;
}tree[maxn<<];
int n,m,top,s[maxn];
void pushup(int rt){
tree[rt].ls=tree[rt<<].ls;
tree[rt].rs=tree[rt<<|].rs;
//父亲区间内的最大区间必定是,左子树最大区间,右子树最大区间,左右子树合并的中间区间,三者中最大的区间值
tree[rt].ms=max(max(tree[rt<<].ms,tree[rt<<|].ms),tree[rt<<].rs+tree[rt<<|].ls);
//左子树区间满了的话,父亲左区间要加上右孩子的左区间
if(tree[rt<<].ls==tree[rt<<].r-tree[rt<<].l+)
tree[rt].ls+=tree[rt<<|].ls;
if(tree[rt<<|].rs==tree[rt<<|].r-tree[rt<<|].l+)//同上
tree[rt].rs+=tree[rt<<].rs;
}
void build(int rt,int l,int r){
tree[rt].l=l,tree[rt].r=r;
tree[rt].ls=tree[rt].rs=tree[rt].ms=r-l+;
if(l==r) return;
int mid=(l+r)>>;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
}
void update(int rt,int x,int val){
if(tree[rt].l==tree[rt].r){
tree[rt].ls=tree[rt].rs=tree[rt].ms=val;
return;
}
int mid=(tree[rt].l+tree[rt].r)>>;
if(mid>=x) update(rt<<,x,val);
if(mid<x) update(rt<<|,x,val);
pushup(rt);
} int query(int rt,int x){
//到了叶子节点或者该访问区间为空或者已满都不必要往下走了
if(tree[rt].l==tree[rt].r||tree[rt].ms==||tree[rt].ms==tree[rt].r-tree[rt].l+)
return tree[rt].ms;
int mid=(tree[rt].l+tree[rt].r)>>;
if(x<=mid){//因为x<=mid,看左子树,
///tree[rt<<1].r-tree[rt<<1].rs+1代表左子树右边连续区间的左边界值,如果t在左子树的右区间内,则要看右子树的左区间有多长并返回
if(x>=tree[rt<<1].r-tree[rt<<1].rs+1)
return query(rt<<1,x)+query(rt<<1|1,mid+1);
else return query(rt<<1,x);
}else{
if(x<=tree[rt<<|].ls+tree[rt<<|].l-)
return query(rt<<,mid)+query(rt<<|,x);
else return query(rt<<|,x);
}
}
int main() {
#ifdef LOCAL
freopen("in.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
int t,cas=;
char op[];
// scanf("%d",&t);
while(~scanf("%d%d",&n,&m)){
top=;
build(,,n);
while(m--){
int x;
scanf("%s",op);
if(op[]=='D'){
scanf("%d",&x);
update(,x,);
s[top++]=x;
}else if(op[]=='Q'){
scanf("%d",&x);
printf("%d\n",query(,x));
}else{
if(x>){
x=s[--top];
update(,x,);
}
}
}
}
return ;
}

HDU - 1540 Tunnel Warfare(线段树区间合并)的更多相关文章

  1. HDU 1540 Tunnel Warfare 线段树区间合并

    Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...

  2. hdu 1540 Tunnel Warfare 线段树 区间合并

    题意: 三个操作符 D x:摧毁第x个隧道 R x:修复上一个被摧毁的隧道,将摧毁的隧道入栈,修复就出栈 Q x:查询x所在的最长未摧毁隧道的区间长度. 1.如果当前区间全是未摧毁隧道,返回长度 2. ...

  3. hdu 1540 Tunnel Warfare(线段树区间统计)

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

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

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

  5. Tunnel Warfare 线段树 区间合并|最大最小值

    B - Tunnel WarfareHDU - 1540 这个有两种方法,一个是区间和并,这个我个人感觉异常恶心 第二种方法就是找最大最小值 kuangbin——线段树专题 H - Tunnel Wa ...

  6. HDU 1540 Tunnel Warfare (线段树)

    Tunnel Warfare Problem Description During the War of Resistance Against Japan, tunnel warfare was ca ...

  7. HDU 1540 Tunnel Warfare (线段树)

    题目大意: n 个村庄排列在一条直线上,相邻的村庄有地道连接,除首尾两个村庄外,其余村庄都有两个相邻的村庄.其中有 3 中操作 D x :表示摧毁编号为 x 的村庄,Q x:表示求出包含村庄 x 的最 ...

  8. HDU 1540 Tunnel Warfare (线段树或set水过)

    题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 析:首先可以用set水过,set用来记录每个被破坏的村庄,然后查找时,只要查找左右两个端点好. 用线段 ...

  9. HDU1540 Tunnel Warfare —— 线段树 区间合并

    题目链接:https://vjudge.net/problem/HDU-1540 uring the War of Resistance Against Japan, tunnel warfare w ...

  10. HDU 6638 - Snowy Smile 线段树区间合并+暴力枚举

    HDU 6638 - Snowy Smile 题意 给你\(n\)个点的坐标\((x,\ y)\)和对应的权值\(w\),让你找到一个矩形,使这个矩阵里面点的权值总和最大. 思路 先离散化纵坐标\(y ...

随机推荐

  1. 故障排错-ping dup!

    ping DUP! ping一个vc中虚拟机的地址发现如下,出现了DUP! . 解决方式如下: 1.根据mac地址找到虚拟机网卡的端口组 然后编辑绑定和故障切换,切换负责平衡

  2. optimize PHP-FPM优化

    php-fpm进程pidpids=$(ps aux | grep ${process} | grep -v "grep" | awk '{print $2}') php-fpm 关 ...

  3. HR_Hash Tables: Ransom Note

    1 题目重点:whole words | case-sensitive #!/bin/python3 import math import os import random import re imp ...

  4. HR_Minimum Swaps 2

    源代码超时 看了评论区改用了字典序列. #!/bin/python3 import math import os import random import re import sys # Comple ...

  5. bzoj1014 火星人 (hash+splay+二分答案)

    求公共前缀的问题可以用hash+二分来解决,但这个是动态的,所以我们用平衡树来维护区间的hash值 复杂度$O(mlog^2n)$ #include<bits/stdc++.h> #def ...

  6. 20165223《JAVA程序设计》第一周学习总结

    20165223 <JAVA程序设计>第一周学习总结 教材学习内容总结 通过网站JAVA第一章视频教程.教材.老师所给的教程及网上查询进行学习 第一章要点 JAVA地位和特点 地位:网络. ...

  7. empty() 与 html("") 的区别

    empty,首先循环给后代元素移除绑定.清除jquery给此dom的cache,然后循环removeFirstChild. 而html(''),则是简单暴力的设置innerHTML = ''; 查看文 ...

  8. CF 1013E Hills

    这是一道DP题...我居然有那么半个小时思考非DP解决方案,实在是太弱了. 题意:给您若干山,您可以花费1代价削去1高度,求有k个山峰时的最小代价. 输出k = 1 ~ (n + 1) >> ...

  9. Django 配置数据库

    Django提到配置那大多数都是在settings.py配置文件 在配置文件里的 DATABASES 内进行设置 # 数据库配置 DATABASES = { #连接mysql 'default': { ...

  10. 判断JDK安装成功的方法

    JDK安装成功之后,主要是要写入环境变量