热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POJ题目2892TunnelWarfare(线段树单点更新查询,求单点所在最大连续区间长度)

TunnelWarfareTimeLimit:1000MS MemoryLimit:131072KTotalSubmissions:7307

Tunnel Warfare















Time Limit: 1000MS   Memory Limit: 131072K
Total Submissions: 7307   Accepted: 2997


Description



During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast areas of north China Plain. Generally speaking, villages connected by tunnels lay in a line. Except the two at the ends, every village was directly connected
with two neighboring ones.


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



The first line of the input contains two positive integers n and
m
(n, m 50,000) indicating the number of villages and events. Each of the next
m lines describes an event.


There are three different events described in different format shown below:



  1. D x: The x-th village was destroyed.
  2. Q x: The Army commands requested the number of villages that x-th village was directly or indirectly connected with including itself.
  3. R: The village destroyed last was rebuilt.



Output



Output the answer to each of the Army commanders request in order on a separate line.



Sample Input


7 9
D 3
D 6
D 5
Q 4
Q 5
R
Q 4
R
Q 4

Sample Output


1
0
2
4

Hint



An illustration of the sample input:


      OOOOOOO

D 3 OOXOOOO

D 6 OOXOOXO

D 5 OOXOXXO

R OOXOOXO

R OOXOOOO


Source


POJ Monthly--2006.07.30, updog


ac代码


#include
#include
#define max(a,b) (a>b?a:b)
struct s
{
int rl,ll,ml;
}node[50500<<2];
int stack[50500],top;
void build(int l,int r,int tr)
{
node[tr].ll=node[tr].rl=node[tr].ml=r-l+1;
if(l==r)
return;
int mid=(l+r)>>1;
build(l,mid,tr<<1);
build(mid+1,r,tr<<1|1);
}
void update(int pos,int l,int r,int tr,int val)
{
if(l==r)
{
if(val)
node[tr].ll=node[tr].rl=node[tr].ml=1;
else
node[tr].ll=node[tr].rl=node[tr].ml=0;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)
{
update(pos,l,mid,tr<<1,val);
}
else
update(pos,mid+1,r,tr<<1|1,val);
node[tr].ll=node[tr<<1].ll;
node[tr].rl=node[tr<<1|1].rl;
node[tr].ml=max(node[tr<<1].ml,node[tr<<1|1].ml);
node[tr].ml=max(node[tr].ml,node[tr<<1].rl+node[tr<<1|1].ll);
if(node[tr<<1].ll==mid-l+1)
node[tr].ll+=node[tr<<1|1].ll;
if(node[tr<<1|1].rl==r-(mid+1)+1)
node[tr].rl+=node[tr<<1].rl;
}
int query(int pos,int l,int r,int tr)
{
if(l==r||node[tr].ml==0||node[tr].ml==r-l+1)
{
return node[tr].ml;
}
int mid=(l+r)>>1;
if(pos<=mid)
{
if(pos>=mid-node[tr<<1].rl+1)
return query(pos,l,mid,tr<<1)+query(mid+1,mid+1,r,tr<<1|1);
return query(pos,l,mid,tr<<1);
}
else
{
if(pos<=mid+1+node[tr<<1|1].ll-1)
return query(pos,mid+1,r,tr<<1|1)+query(mid,l,mid,tr<<1);
return query(pos,mid+1,r,tr<<1|1);
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
build(1,n,1);
top=0;
while(m--)
{
char s[2];
int x;
scanf("%s",s);
if(s[0]==&#39;D&#39;)
{
scanf("%d",&x);
stack[top++]=x;
update(x,1,n,1,0);
}
else
{
if(s[0]==&#39;Q&#39;)
{
int x;
scanf("%d",&x);
int ans=query(x,1,n,1);
printf("%d\n",ans);
}
else
{
int x=stack[top-1];
top--;
update(x,1,n,1,1);
}
}
}
}
}







版权声明:本文为博主原创文章,未经博主允许不得转载。


POJ 题目2892 Tunnel Warfare(线段树单点更新查询,求单点所在最大连续区间长度)



推荐阅读
  • 本文详细介绍了如何手动编写兼容IE的Ajax函数,以及探讨了跨域请求的实现方法和原理,包括JSONP和服务器端设置HTTP头部等技术。 ... [详细]
  • php怎么重新发布网站(2023年最新分享) ... [详细]
  • Redis 教程01 —— 如何安装 Redis
    本文介绍了 Redis,这是一个由 Salvatore Sanfilippo 开发的键值存储系统。Redis 是一款开源且高性能的数据库,支持多种数据结构存储,并提供了丰富的功能和特性。 ... [详细]
  • 题目概述:给定一个数组,计算其中所有连续子序列中平均值不低于给定值k的数量。通过将每个元素减去k并计算前缀和,问题转化为二维数点问题。此问题可以通过离线处理,利用树状数组来高效解决。 ... [详细]
  • 一个产品数组拼图|集合 2 (O(1)空间) ... [详细]
  • 本文详细探讨了 Java 中 Daemon 线程的特点及其应用场景,并深入分析了 Random 类的源代码,帮助开发者更好地理解和使用这些核心组件。 ... [详细]
  • TensorFlow核心函数解析与应用
    本文详细介绍了TensorFlow中几个常用的基础函数及其应用场景,包括常量创建、张量扩展以及二维卷积操作等,旨在帮助开发者更好地理解和使用这些功能。 ... [详细]
  • 本文深入探讨了企业级开发框架NHibernate和Spring.NET的关键特性之一——面向方面编程(AOP)。文章不仅介绍了AOP的基本概念及其如何增强面向对象编程(OOP),还详细说明了Spring.NET中AOP的具体应用,包括事务管理和自定义方面的实现。 ... [详细]
  • PHP中的Content-Type含义及其功能解析
    在PHP中,Content-Type头部信息用于定义资源的媒体类型(MIME类型),这对于确保客户端正确解析服务器响应至关重要。 ... [详细]
  • ipvsadm命令简介:ipvsadm是LVS在应用层的管理命令,我们可以通过这个命令去管理LVS的配置。在fedora14、Linux6.0之后系统中 ... [详细]
  • UnityNGUIScrollView苹果式滑动
    又回来写博客了,这回已经开始上班了,所以就发一发工作中解决的难题吧。单个展示Panel(苹果式)以前对UI的滑动组件很烦心,不是很会用,这回项目要求写一个类似于苹果的文件滑动效果, ... [详细]
  • databasesync适配openGauss使用指导书
    一、database-sync简介database-sync作为一种开源辅助工具,用于数据库之间的表同步,更确切的说法是复制,可以从一个数据库复制表到另一个数据库该工具支持的功能如 ... [详细]
  • 本文详细介绍了RPM包构建过程中Spec文件的结构和各部分的作用,包括包描述、准备阶段、构建过程、安装步骤、清理操作以及文件列表等关键环节。同时,提供了关于RPM宏命令、打包目录结构及常见标签的深入解析。 ... [详细]
  • 本文档详细介绍了服务器与应用系统迁移的策略与实施步骤。迁移不仅涉及数据的转移,还包括环境配置、应用兼容性测试等多个方面,旨在确保迁移过程的顺利进行及迁移后的系统稳定运行。 ... [详细]
  • 本文介绍了使用Node.js开发超市管理系统的经验分享,重点讨论了项目中使用的技术栈及其实现细节,包括前端Bootstrap和后端Express框架的应用,以及MongoDB数据库的操作。 ... [详细]
author-avatar
Bleach1121
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有