大牛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. DW格式与布局

  2. 【转载】.NET Remoting学习笔记(三)信道

    目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:♂风车车.Net .NET Framework ...

  3. HDOJ 5091 Beam Cannon 扫描线

    线段树+扫描线: 我们用矩形的中心点来描写叙述这个矩形,然后对于每一个敌舰,我们建立一个矩形中心的活动范围,即矩形中心在该范围内活动就能够覆盖到该敌舰.那么我们要求的问题就变成了:随意一个区域(肯定也 ...

  4. 算法和流程控制 --《高性能JavaScript》

    总结: 1.for, while, do-while循环性能相当,并没有一种循环类型明显快于或满于其他类型. 2.避免使用for-in循环,除非要遍历一个属性数量未知的对象. 3.改善循环性能的最佳形 ...

  5. 给大二学生——能够再坚持一年的ACM

    [来信] 我是大二学生,就读于一所非常普通的大学.学校ACM基本零起步,去年才開始搞,我大一大二花了非常多时间搞acm,如今不太想放弃.但学校基本没人愿意搞这个. 非常快就要大三了,我一直在纠结要不要 ...

  6. Git使用之Permission Denied问题解决

    今天碰到了Git的Permission Denied问题. 在安装好git之后,我们通常会配置username和邮箱 git config --global user.name "zengj ...

  7. Spring Boot 动态数据源(多数据源自己主动切换)

    本文实现案例场景: 某系统除了须要从自己的主要数据库上读取和管理数据外.另一部分业务涉及到其它多个数据库,要求能够在不论什么方法上能够灵活指定详细要操作的数据库. 为了在开发中以最简单的方法使用,本文 ...

  8. CH 5302 金字塔(区间DP)

    CH 5302 金字塔 \(solution:\) 很神奇的一道题目,当时看到还以为是一道字符串求回文子串的题目.但是数据范围很小,而且只知道回文串也不好做.但是我们观察可得,如果是深度搜索便利,那么 ...

  9. 安装程序工具 (Installutil.exe)

    网址:https://msdn.microsoft.com/zh-cn/library/50614e95(VS.80).aspx  安装程序工具 (Installutil.exe) .NET Fram ...

  10. 阮一峰 KMP BM算法

    存一个链接,讲得好啊! 点击这里打开     字符串KMP 点击这里打开     字符串匹配的Boyer-Moore算法