大牛blog

这题的题解写给自己看……

总结(瞎扯一点):

之前只会思考,len,sum,然后GG,如果只是sum和len的去用的话,就是在mid的时候会GG。然后这次也是参考大牛的写法,其实还是蛮简单的,写完以后觉得。。。直接搞两个左边连续,右边连续,然后区间最大,直接弄弄就好了,但是具体实现,如果没有很多的练习,绝对是错误百出啊!

先讲小东西:

①:建树,以后再根据自己的瞎瘠薄在挑战上看了文字自己写的建树真是丑爆了,以后还是用好看的写法写,,,,

小东西没有了。

大东西:

①:update,卧槽,看完大牛blog后面自己写,直接蒙比了///完全就是乱写带节奏。。。其实很简单:一、找一个能return的条件,return掉;二、如果不能,下来的步骤就是继续(搜索)下去,本来就是个递归嘛。三、搜索完以后,你回来的那个节点还没有处理过,也就是那个节点的我所需要的信息还没有处理过。那么就要考虑各种情况,把这个节点处理的干干净净,处理的非常奈斯。

二、query,主要还是线段树的节点信息处理的好的话,query就非常方便,这也不讲了。

PS:这题恶心到的是,特么还是多组数据,先是打完代码,找了半小时错误,然后莫名其妙再wa了5,6发,哎,心累。。。讲道理,这道题目有说多组数据么?

再说一下,线段树对于练习的话,在DEV编译器练习比较不错,什么提示都没有,完全看自己思路。

OK,GG,贴份挫code跑。。。

挫code……………

#include<cstdio>
#include<math.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL; const int N=1e4+10; struct asd{
int left,right;
int ls,rs;
int ms;
};
asd q[N*20]; void build(int num,int L,int R)
{
q[num].left=L;
q[num].right=R;
q[num].ls=q[num].rs=q[num].ms=R-L+1;
if(L!=R)
{
int mid=(L+R)/2;
build(2*num,L,mid);
build(2*num+1,mid+1,R);
}
} int query(int num,int t)
{
if(q[num].left==q[num].right||q[num].ms==0||q[num].ms==(q[num].right-q[num].left+1))
return q[num].ms;
int mid=(q[num].right+q[num].left)/2; if(t<=mid)
{
if(t>=(q[2*num].right-q[2*num].rs+1))
return query(2*num,t)+query(2*num+1,mid+1);
else
return query(2*num,t);
}
else
{
if(t<=q[2*num+1].left+q[2*num+1].ls-1)
return query(2*num+1,t)+query(2*num,mid);
else
return query(2*num+1,t);
}
} void update(int num,int t,int x)
{
if(q[num].left==q[num].right)
{
if(x==1)
q[num].ls=q[num].rs=q[num].ms=1;
else
q[num].ls=q[num].rs=q[num].ms=0;
return;
} int mid=(q[num].left+q[num].right)/2; if(mid>=t)
update(2*num,t,x);
else
update(2*num+1,t,x); q[num].ls=q[2*num].ls;
q[num].rs=q[2*num+1].rs; q[num].ms=max(q[2*num].ms,max(q[2*num+1].ms,q[2*num].rs+q[2*num+1].ls)); if(q[2*num].ls==(q[2*num].right-q[2*num].left+1))
q[num].ls+=q[2*num+1].ls;
if(q[2*num+1].rs==(q[2*num+1].right-q[2*num+1].left+1))
q[num].rs+=q[2*num].rs;
} int re[N*5];
int main()
{
char ss[5];
int n,m,x,pos,u;
while(~scanf("%d%d",&n,&m))
{
scanf("%d%d",&n,&m);
build(1,1,n);
pos=0;
for(int i=0;i<m;i++)
{
scanf("%s",ss);
if(strcmp(ss,"R")==0)
{
u=re[pos];
pos--;
update(1,u,1);
}
else if(strcmp(ss,"D")==0)
{
scanf("%d",&x);
re[++pos]=x;
update(1,x,0);
}
else
{
scanf("%d",&x);
printf("%d\n",query(1,x));
}
}
}
return 0;
}

hdoj1540 【线段树的表示】的更多相关文章

  1. HDOJ-1540(线段树+较复杂的单点修改和区间查询)

    Tunnel Warfare HDOJ-1540 这题关于线段树的操作有一定的难度,需要较好的思维能力. 关于题目的详细解答已经在代码中体现了. #include<iostream> #i ...

  2. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  3. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  4. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  5. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  6. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  7. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  8. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  9. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

随机推荐

  1. Linux中修改docker镜像源及安装docker

    1.首先备份系统自带yum源配置文件/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.re ...

  2. 【leetcode】 26. Remove Duplicates from Sorted Array

    @requires_authorization @author johnsondu @create_time 2015.7.22 18:58 @url [remove dublicates from ...

  3. 很不错的js特效

    这里有好多的js特效:http://www.jsfoot.com/jquery/images/qh/ jquery图片特效 jquery幻灯片 .... 有什么js需要可以到这里来下载:http:// ...

  4. location.href用法总结

    javascript中的location.href有很多种用法,主要如下. self.location.href=”/url” 当前页面打开URL页面 location.href=”/url” 当前页 ...

  5. C#串口通讯教程 简化一切 只保留核心功能 这可能是最易于理解的一篇教程

    C#串口通讯教程 简化一切 只保留核心功能 这可能是最易于理解的一篇教程   串口的定义,请自行了解. C#操作串口通讯在.Net强大类库的支持下,只需要三个步骤: 1 创建 2 打开 3 发送/接受 ...

  6. IOS版DesiredCapabilities参数配置

    前言 相比较Android的DesiredCapabilities参数配置,IOS的相对而言比较复杂. 特别是在真机上跑的时候,参数就更加复杂. DesiredCapabilities参数配置 模拟器 ...

  7. Django 之ORM操作

    1.什么是ORM? 全称关系对象映射Object Relational Mapping(简称ORM),是通过描述面向对象与数据库之间的对应的元数据,将对象持久化的更新到数据库中. 有了ORM,就不需要 ...

  8. JVM的CPU资源占用过高问题的排查

    互联网后端架构 https://mp.weixin.qq.com/s/LiqAy2DikbmZzqogb5XRdA JVM的CPU资源占用过高问题的排查 互联网后端架构  今天 上午线上某应用的一台J ...

  9. POJ3111 K Best —— 01分数规划 二分法

    题目链接:http://poj.org/problem?id=3111 K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissio ...

  10. sid, pid, gid

    (一) 参考 :https://unix.stackexchange.com/questions/18166/what-are-session-leaders-in-ps 命令: ps xao pid ...