hdu 1540(线段树区间合并)
题目链接:传送门
参考文章:传送门
题意:n个数字初始连在一条线上,有三种操作,
D x表示x号被摧毁;
R 表示恢复剩下的通路
Q表示查询标号为x所在的串的最长长度。
思路:线段树的区间合并。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = ;
struct Node{
int l,r;
int ls,rs,ms;
}cur[maxn<<];
int ss[maxn],m,n;
void build(int x,int l,int r) //初始化建树
{
cur[x].l=l;cur[x].r=r;
cur[x].ls=cur[x].rs=cur[x].ms=r-l+;
if(l==r) return ;
int mid=(l+r)>>;
build(x*,l,mid);
build(x*+,mid+,r);
}
int MAX(int x,int y)
{
return x>y?x:y;
}
void update(int x,int pos,int fg)
{
if(cur[x].l==cur[x].r)
{
if(fg==) cur[x].ls=cur[x].rs=cur[x].ms=; //删除
else cur[x].ls=cur[x].rs=cur[x].ms=; //更新
return ;
}
int mid=(cur[x].l+cur[x].r)>>;
if(pos<=mid) update(x*,pos,fg);
else update(x*+,pos,fg);
//pushup操作,更新左子区间,右子区间的最长长度
cur[x].ls=cur[x*].ls;
cur[x].rs=cur[x*+].rs;
cur[x].ms=MAX(MAX(cur[x*].ms,cur[x*+].ms),cur[x*].rs+cur[x*+].ls);
if(cur[x*].ls==cur[x*].r-cur[x*].l+) cur[x].ls+=cur[x*+].ls; //如果区间的左子树的左区间已经满了,就加上右子树的左子区间
if(cur[x*+].rs==cur[x*+].r-cur[x*+].l+) cur[x].rs+=cur[x*].rs; // 如果右子树的右子区间已经满了,就加上左子树的右子区间
}
int query(int x,int pos)
{
if(cur[x].ms==||cur[x].l==cur[x].r||cur[x].ms==cur[x].r-cur[x].l+) return cur[x].ms;
int mid=(cur[x].l+cur[x].r)>>;
if(pos<=mid)
{
if(pos>=cur[x*].r-cur[x*].rs+) return query(x*,pos)+query(x*+,mid+);//如果在左子区间的右边界,就遍历两个区间
return query(x*,pos);
}
else
{
if(pos<=cur[x*+].l+cur[x*+].ls-) return query(x*+,pos)+query(x*,mid); //如果在右子区间的左边界,就遍历两个区间
return query(x*+,pos);
}
}
int main(void)
{
while(~scanf("%d%d",&n,&m))
{
build(,,n);
char op[];
int x,top=;
while(m--)
{
scanf("%s",op);
if(op[]=='D')
{
scanf("%d",&x);
ss[top++]=x;
update(,x,);
}
else if(op[]=='Q')
{
scanf("%d",&x);
printf("%d\n",query(,x));
}
else if(op[]=='R')
{
x=ss[--top];
update(,x,);
}
}
}
return ;
}
hdu 1540(线段树区间合并)的更多相关文章
- HDU 3911 线段树区间合并、异或取反操作
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...
- HDU - 1540 线段树的合并
这个题题意我大概解释一下,就是一开始一条直线,上面的点全是联通的,有三种操作 1.操作D把从左往右第x个村庄摧毁,然后断开两边的联通. 2.询问Q节点相联通的最长长度 3.把最后破坏的村庄重建. 这个 ...
- hdu 3308(线段树区间合并)
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 3911 线段树区间合并
北京赛区快了,准备袭击数据结构和图论.倒计时 18天,线段树区间合并.维护一个最长连续.. 题意:给一个01串,以下有一些操作,问区间最长的连续的1的个数 思路:非常裸的线段树区间合并 #includ ...
- hdu 1806(线段树区间合并)
Frequent values Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu 3308 线段树 区间合并+单点更新+区间查询
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 3308 LCIS (线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...
- hdu 3911 Black And White (线段树 区间合并)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3911 题意: 给你一段01序列,有两个操作: 1.区间异或,2.询问区间最长的连续的1得长度 思路: ...
- HDU 3308 (线段树区间合并)
http://acm.hdu.edu.cn/showproblem.php?pid=3308 题意: 两个操作 : 1 修改 单点 a 处的值. 2 求出 区间[a,b]内的最长上升子序列. 做法 ...
- HDU 6638 - Snowy Smile 线段树区间合并+暴力枚举
HDU 6638 - Snowy Smile 题意 给你\(n\)个点的坐标\((x,\ y)\)和对应的权值\(w\),让你找到一个矩形,使这个矩阵里面点的权值总和最大. 思路 先离散化纵坐标\(y ...
随机推荐
- stm32初做项目心得
在导师的带领下,基本了解了嵌入式的开发的基本流程: 1.首先从厂家拿到样板之后,首先进行检测,检测什么呢,先检测电源系统,看你的电源系统是否能够正常工作,就是各个管脚是否短路,断路. 2.检测完之后, ...
- 微信小程序开发——超链接或按钮点击跳转到其他页面失效
1. 超链接导航失效: 小程序规则——wx.navigateTo 和 wx.redirectTo 不允许跳转到 tabbar 页面,只能用 wx.switchTab 跳转到 tabbar 页面
- swift -2018 - 创建PCH文件
第一种:简单方式 在swift文件 创建一个OC文件 1> command + n 2> 3> 此时 你会发现有提示 让你创建桥接文件 4>删除 OC文件 5> 直接复制 ...
- Validate常用校验
1.首先将jQuery.js和jquery.validate.js加入对应的页面中,如果要中文的提示语还要把messages_zh.js加入,以及对应的css文件. <link href=&qu ...
- ret和retf
ret指令用栈中的数据,修改IP的内容,从而实现近转移; retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移. CPU执行ret指令时,进行下面两步操作: (IP) = ((ss)*16+ ...
- vue tab切换
<template> <div class="box"> <ul> <li v-for="(item,index) in arr ...
- 模块二 hashlib模块、configparser模块、logging模块
算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常 ...
- Jmeter常用脚本开发之Junit Request
说明:Junit Request就是把Junit测试框架的自动化用例在jmeter上执行 步骤: 1.创建Java工程,编写Junit自动化测试用例 2.然后把用例打成jar包,复制到Jmter的li ...
- springboot添加fluent日志记录
istio默认会进行日志的记录,但是仅仅记录到服务.以及服务之间调用的信息,不记录业务日志. 如: 所以需要添加业务日志记录. 1.引入依赖 <dependency> <gr ...
- java基础之—类加载器
要了解类加载器先要了解类的加载 一.类的加载(类的加载概述) 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 1.加载 就是指将clas ...