hdu1540(线段树)
来源:互联网 发布:海关出口数据 编辑:程序博客网 时间:2024/06/08 06:21
题意是跟新查找
不同的时候要输出这个字符位置最长字符串,用ls表示从这个区间左端开始的最长字符串,rs表示从右边开始,ms是中间最长(a[i].ms=max(a[i*2].ms,max(a[i*2+1].ms,(a[i*2].rs+a[i*2+1].ls)));
注意查找的时候
if(t<=a[i*2+1].ls+a[i*2+1].l-1)
return qurry(i*2,mid)+qurry(i*2+1,t);
当右边区间满足不了t时,就需要加上左区间的长度了
//
// main.cpp
// 1540
//
// Created by Mr.Xue on 17/7/24.
// Copyright © 2017年 Mr.Xue. All rights reserved.
//
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <stdlib.h>
using namespacestd;
const int maxn =50000+10;
int n,m;
int s[maxn],top;//s为模拟栈
struct node
{
int l,r;
int ls,rs,ms;//ls,左端最大连续区间,rs右端最大连续区间,ms区间内最大连续区间
} a[maxn<<2];
void build(int l,int r,int i)
{
a[i].l=l;
a[i].r=r;
a[i].ls=a[i].rs=a[i].ms=r-l+1;
if(l==r)
return;
int mid=(l+r)/2;
build(l,mid,i*2);
build(mid+1,r,i*2+1);
}
void insert(int i,int t,int x)
{
if(a[i].l==a[i].r&&a[i].l==t)
{
if(x==0)
a[i].ls=a[i].rs=a[i].ms=0;
else
a[i].ls=a[i].rs=a[i].ms=1;
return ;
}
int mid=(a[i].l+a[i].r)/2;
if(t<=mid)
insert(i*2,t,x);
else
insert(i*2+1,t,x);
a[i].ms=max(a[i*2].ms,max(a[i*2+1].ms,(a[i*2].rs+a[i*2+1].ls)));
a[i].ls=a[i*2].ls;
a[i].rs=a[i*2+1].rs;
if(a[i*2+1].rs==a[i*2+1].r-a[i*2+1].l+1)
a[i].rs+=a[i*2].rs;
if(a[i*2].ls==a[i*2].r-a[i*2].l+1)
a[i].ls+=a[i*2+1].ls;
}
int qurry(int i,int t)
{
if(a[i].l==a[i].r||a[i].ms==a[i].r-a[i].l+1||a[i].ms==0)
returna[i].ms;
int mid=(a[i].l+a[i].r)/2;
if(t>mid)
{
if(t<=a[i*2+1].ls+a[i*2+1].l-1)
returnqurry(i*2,mid)+qurry(i*2+1,t);
else
returnqurry(i*2+1,t);
}
else
{
if(t>=(a[i*2].r-a[i*2].rs+1))
returnqurry(i*2+1,mid+1)+qurry(i*2,t);
else
returnqurry(i*2,t);
}
}
int main()
{
int x=0;
char ch[2];
while(~scanf("%d%d",&n,&m))
{
top =0;
build(1,n,1);
while(m--)
{
scanf("%s",ch);
if(ch[0] =='D')
{
scanf("%d",&x);
s[top++] = x;
insert(1,x,0);
}
elseif(ch[0] =='Q')
{
scanf("%d",&x);
printf("%d\n",qurry(1,x));
}
else
{
if(x>0)
{
x = s[--top];
insert(1,x,1);
}
}
}
}
return0;
}
- hdu1540(线段树)
- hdu1540(线段树区间合并)
- hdu1540 Tunnel Warfare(线段树)
- poj2892&&HDU1540 Tunnel Warfare(线段树)
- HDU1540--线段树(最长连续区间)
- HDU1540(线段树)
- hdu1540(线段树,求点所在线段大小)
- hdu1540 线段树区间合并
- hdu1540线段树区间合并
- 线段树处理 poj2892 hdu1540
- hdu1540(线段树区间合并)
- hdu1540 Tunnel Warfare(线段树)(好题)
- hdu1540 Tunnel Warfare(线段树区间合并详解)
- hdu1540(线段树求连续区间最大和)
- HDU1540-Tunnel Warfare(线段树区间合并)
- hdu1540 Tunnel Warfare 线段树中等难题
- hdu1540&poj2892Tunnel Warfare(线段树单点更新)
- HDU1540:Tunnel Warfare(线段树区间合并)
- RTP协议简介
- c++实现快速排序
- bingo update1
- poj 食物链
- 创建ExecutorService并行处理任务,导致内存不足
- hdu1540(线段树)
- 不允许保存更改,阻止保存要求重新创建表的更改
- SVN坑填一发
- Springboot中添加contextPath
- PHP导出数据表数据生成Excel表格文件
- 手动模拟attach cinder volume的过程
- c++实现简单选择排序
- javascript开发:javascript创建对象方法总结
- Web前端研发工程师编程能力飞升之路