hdu1540(线段树)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1540
题意:是一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点。
线段树功能:单点修改,区间求值。
分析: pre数组记录区间左端点开始的最大连续个数, suf数组记录区间右端点开始往左的最大的连续个数,sum数组表示该区间最大的连续点的个数。
sum[rt]最大值是左区间的最大值或右区间的最大值或左区间的suf+右区间的pre。
#pragma comment(linker,"/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define N 50010
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std; int sum[N<<],pre[N<<],suf[N<<];
int a[N];
void Pushup(int rt,int len)
{ pre[rt]=pre[rt<<];
suf[rt]=suf[rt<<|];
if(pre[rt<<]==(len-(len>>)))pre[rt]=pre[rt<<]+pre[rt<<|];
if(suf[rt<<|]==(len>>))suf[rt]=suf[rt<<]+suf[rt<<|];
sum[rt]=max(suf[<<]+pre[<<|],max(sum[rt<<],sum[rt<<|]));
}
void build(int l,int r,int rt)
{
if(l==r)
{
sum[rt]=pre[rt]=suf[rt]=;
return;
}
int m=(l+r)>>;
build(lson);
build(rson);
Pushup(rt,r-l+);
}
void update(int pos,int c,int l,int r,int rt)
{
if(l==r)
{
sum[rt]=suf[rt]=pre[rt]=c;
return;
}
int m=(l+r)>>;
if(pos<=m)update(pos,c,lson);
else update(pos,c,rson);
Pushup(rt,r-l+);
}
int query(int pos,int l,int r,int rt)
{
if(l==r)
return sum[rt];
int m=(l+r)>>;
if(pos<=m)
{
if(pos+suf[rt<<]>m)return suf[rt<<]+pre[rt<<|];
else return query(pos,lson);
}
else
{
if(m+pre[rt<<|]>=pos)return pre[rt<<|]+suf[rt<<];
else return query(pos,rson);
}
}
int main()
{
int n,m,x,tot;
char op[];
while(scanf("%d%d",&n,&m)>)
{
build(,n,);
tot=;
while(m--)
{
scanf("%s",op);
if(op[]=='Q')
{
scanf("%d",&x);
printf("%d\n",query(x,,n,));
}
else if(op[]=='D')
{
scanf("%d",&x);
a[++tot]=x;
update(x,,,n,);
}
else
{
x=a[tot--];
update(x,,,n,);
}
}
}
}
hdu1540(线段树)的更多相关文章
- hdu-1540线段树刷题
title: hdu-1540线段树刷题 date: 2018-10-18 19:55:21 tags: acm 刷题 categories: ACM-线段树 概述 哇,,,这道线段树的题可以说是到目 ...
- Tunnel Warfare(hdu1540 线段树)
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- Tunnel Warfare(HDU1540+线段树+区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...
- hdu1540线段树
https://vjudge.net/contest/66989#problem/I #include<iostream> #include<cstdio> #include& ...
- hdu1540线段树连续区间
模板题>.<当初学了一波又忘了 #include<map> #include<set> #include<cmath> #include<queu ...
- HDU1540(线段树统计连续长度)
---恢复内容开始--- Tunnel Warfare Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d &am ...
- hdu1540之线段树单点更新+区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- hdu1540 Tunnel Warfare 线段树/树状数组
During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...
- kuangbin专题七 HDU1540 Tunnel Warfare (前缀后缀线段树)
During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...
随机推荐
- poj2531
看了一下0ms,16ms,100ms左右过了的代码,思维量对我来说比較大,不是非常easy理解. 我的作法: 用并查集算权值和. 用dfs枚举两个点集的全部可能,因为是全然图,枚举一半的点就可以. # ...
- Selenium WebDriver TestNg Maven Eclipse java 简单实例
环境准备 前提条件Eclipse 已经安装过 TestNg ,Maven 插件 新建一个普通的java项目 点击右键 configure->convert to Maven Project 之后 ...
- Ubuntu_开启root 登陆
默认的安装完ubuntu ,root 用户没有开启 1.使用安装时的用户,先给root用户设置密码 设置root密码 sudo passwd root 之后会提示输入新的密码 切换到root用户 su ...
- c#1所搭建的核心基础之类型系统的特征
类型系统的特征简介 几乎每种编程语言都有某种形式的一个类型系统.类型系统大致被分为:强/弱,安全/不安全,静态/动态,显式/隐式等类型. c#在类型系统世界中的位置 c#1的类型系统是静态的.显式的和 ...
- uva 129
暴力求解 大致题意 如果一个字符串含有相邻的重复字串称为容易的串,反之为非容易 求字典序第n困难的串…… 大致思路,暴力如果是容易的串停过,然后困难的串继续求解tot++ 总之先记着吧…… 最后输出格 ...
- Appium 出现 > error: com.test/.activity1 never started. Current: com.test/.activity2
在apium 运行的时候,会出现提示 activity 没有启动,当前是 activity 出现原因: 出现这种情况是因为 launch activity 再启动 app 之后 无法找到,变成了app ...
- 解决sqlserver2008 r2 登陆时报错:provider 命名管道提供程序, error40 错误2
错误截图: 这种错误是因为无法启动sqlserver服务,进入命令行,输入 services.msc 进入服务管理,找到sqlserver服务如下图. 在这里启动该服务会报错如下图: 此服务无法启 ...
- php运行
运行命令: $php 1.php php教程: http://www.w3school.com.cn/php/php_variables.asp
- 使用CUNIT测试
使用CUNIT测试 一:概述 CUnit是一个c语言的单元测试框架,它是以静态链接库的形式,连接到用户代码中的,主要的功能就是提供了语义丰富的断言和多种测试结果输出接口,可以方便地生成测试报告. 但是 ...
- IT痴汉的工作现状18-思维定式
前阵子周权出差给我带回来一个净水器,是直接安装在水龙头上的,小巧方便.我依照安装说明一步一步组装好了,感觉说明书还是比較靠谱的,没有遇到意外.但我发现它的净水.原水的button好像是有问题.它的结构 ...