HDU1540(线段树统计连续长度)
---恢复内容开始---
Tunnel Warfare
Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
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
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
Sample Input
Sample Output
- #include"cstdio"
- #include"algorithm"
- using namespace std;
- const int MAXN=;
- struct node{
- int l,r;
- int ll,rl,ml;
- }a[MAXN*];
- void build(int rt,int l,int r)
- {
- a[rt].l=l;
- a[rt].r=r;
- a[rt].ll=a[rt].rl=a[rt].ml=r-l+;
- if(l==r) return ;
- int mid=(l+r)>>;
- build(rt<<,l,mid);
- build((rt<<)|,mid+,r);
- }
- void merge(int rt)
- {
- //若左子树已满,则应与右子树左区间合并
- a[rt].ll=a[rt<<].ll;
- if(a[rt<<].ll==(a[rt<<].r-a[rt<<].l+))
- {
- a[rt].ll+=a[(rt<<)|].ll;
- }
- //若右子树已满,则应与左子树的有区间合并
- a[rt].rl=a[(rt<<)|].rl;
- if(a[(rt<<)|].rl==(a[(rt<<)|].r-a[(rt<<)|].l+))
- {
- a[rt].rl+=a[rt<<].rl;
- }
- //该子树的最大连续长度为 左或右子树连续长度的最大者 或者 将左子树右区间与右子树左区间合并的长度
- a[rt].ml=max(max(a[rt<<].ml,a[(rt<<)|].ml),a[rt<<].rl+a[(rt<<)|].ll);
- }
- void update(int rt,int pos,int val)
- {
- if(a[rt].l==a[rt].r)
- {
- if(val) a[rt].ll=a[rt].rl=a[rt].ml=;
- else a[rt].ll=a[rt].rl=a[rt].ml=;
- return ;
- }
- int mid=(a[rt].l+a[rt].r)>>;
- if(pos<=mid) update(rt<<,pos,val);
- else update((rt<<)|,pos,val);
- merge(rt);
- }
- int query(int rt,int pos)
- {
- if(a[rt].l==a[rt].r||a[rt].ml==||a[rt].ml==a[rt].r-a[rt].l+)//到达叶子节点或者该节点已满或空,那么不必向下走了
- {
- return a[rt].ml;
- }
- int mid=(a[rt].l+a[rt].r)>>;
- if(pos<=mid)//在左子树中
- {
- if(pos>=a[rt<<].r-a[rt<<].rl+)//若在左子树的右区间
- {
- return query(rt<<,pos)+query((rt<<)|,mid+);//则需要查询右子树
- }
- else
- {
- return query(rt<<,pos);
- }
- }
- else
- {
- if(pos<=a[(rt<<)|].l+a[(rt<<)|].ll-)//若在右子树的左区间
- {
- return query((rt<<)|,pos)+query(rt<<,mid);//则需要查询左子树
- }
- else
- {
- return query((rt<<)|,pos);
- }
- }
- }
- int stack[MAXN];
- int top;
- int main()
- {
- int n,m;
- while(scanf("%d%d",&n,&m)!=EOF)
- {
- int pos;
- top=;
- build(,,n);
- while(m--)
- {
- scanf("%*c");
- char op;scanf("%c",&op);
- if(op=='D')
- {
- scanf("%d",&pos);
- stack[top++]=pos;
- update(,pos,);
- }
- else if(op=='Q')
- {
- scanf("%d",&pos);
- printf("%d\n",query(,pos));
- }
- else
- {
- pos=stack[--top];
- update(,pos,);
- }
- }
- }
- }
---恢复内容结束---
HDU1540(线段树统计连续长度)的更多相关文章
- hdu-1540线段树刷题
title: hdu-1540线段树刷题 date: 2018-10-18 19:55:21 tags: acm 刷题 categories: ACM-线段树 概述 哇,,,这道线段树的题可以说是到目 ...
- ZOJ 2301 / HDU 1199 Color the Ball 离散化+线段树区间连续最大和
题意:给你n个球排成一行,初始都为黑色,现在给一些操作(L,R,color),给[L,R]区间内的求染上颜色color,'w'为白,'b'为黑.问最后最长的白色区间的起点和终点的位置. 解法:先离散化 ...
- HDU 6070 (线段树)(统计颜色)
HDU 6070 Partition Problem : 给一段长度为n的序列,要求找出一段区间,使得这段区间的数字种类除以区间长度最小.输出最后的答案即可.(n <= 60000)(9s时限) ...
- 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& ...
- Tunnel Warfare--- hdu1540 线段树求连续子区间
题目链接 题意:有n个村庄,编号分别为1-n:由于战争会破坏村庄,但是我们也会修复: D x代表村庄x被破坏: Q x是求与x相连的有几个没有被破坏: R 是修复最后一次被破坏的村庄: 接下来有m个操 ...
- [题解](线段树最大连续子段和)POJ_3667_Hotel
题意:1.求一个最靠左的长x的区间全部为0,并修改为1,输出这个区间的左端点 2.修改一个区间为0 实际上是维护最大连续子段和,原来也写过 大概需要维护一个左/右最大子段和,当前这段最大子段长,再维护 ...
- hdu1540线段树连续区间
模板题>.<当初学了一波又忘了 #include<map> #include<set> #include<cmath> #include<queu ...
随机推荐
- kvm&vnc 简单安装shell脚本
#!/bin/bash # created on 2014/7/15 #author : derrick.jiang (Email: derrick.jiang.maichuang.net) echo ...
- 【转】Android中的Apk的加固(加壳)原理解析和实现
一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...
- 【BZOJ2427】[HAOI2010]软件安装 Tarjan+树形背包
[BZOJ2427][HAOI2010]软件安装 Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为 ...
- 怎么用cookie解决选项卡问题刷新后怎么保持原来的选项?
什么是cookie? Cookies虽然一般都以英文名呈现,但是它还是有一个可爱的中文名“小甜饼”.Cookies是指服务器暂存放在你的电脑里的txt格式的文本文件资料,主要用于网络服务器辨别电脑使用 ...
- HttpModule与HttpHandler详解(转)
ASP.NET对请求处理的过程:当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,A ...
- 九度OJ 1179:阶乘 (循环)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5149 解决:1523 题目描述: 输入n, 求y1=1!+3!+...m!(m是小于等于n的最大奇数) y2=2!+4!+...p!(p是 ...
- 九度OJ 1019:简单计算器 (基础题、DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6725 解决:2454 题目描述: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 输入: ...
- 【题解】 CF734F 【Anton and School】
题解 CF734F [Anton and School] 传送门 这种将位运算和普通运算结合起来的题目要拆位来考虑,可以得到\(log_{2}(\)值域\()\)的算法,甚至将值域看成常数. 根据 \ ...
- redis下载及安装服务
1 . 要安装Redis,首先要获取安装包. Windows的Redis安装包需要到以下GitHub链接找到. 链接:https://github.com/MSOpenTech/redis 打开网站后 ...
- springboot 默认tomcat配置
1. Spring Boot 能支持的最大并发量主要看其对Tomcat的设置,可以在配置文件中对其进行更改.当在配置文件中敲出max后提示值就是它的默认值. 我们可以看到默认设置中,Tomcat的最大 ...