hdoj1540 【线段树的表示】
大牛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 【线段树的表示】的更多相关文章
- HDOJ-1540(线段树+较复杂的单点修改和区间查询)
Tunnel Warfare HDOJ-1540 这题关于线段树的操作有一定的难度,需要较好的思维能力. 关于题目的详细解答已经在代码中体现了. #include<iostream> #i ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- CF719E(线段树+矩阵快速幂)
题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
随机推荐
- Python常用的模块
模块,模块就是封装了特殊功能的代码. 模块分为三种: 自定义模块 第三方模块 内置模块 自定义模块 1.自定义模块 2.模块的导入 python有大量的模块可以使用,再使用之前我们只需要导入模块就可以 ...
- C语言之基本算法34—分解质因数(方法一)
//矩阵基础 /* ================================================================== 题目:输入一个正整数.将其分解为质因式,如:6 ...
- 2015 Multi-University Training Contest 3--1011 Work
代码: #include<cstdio> #include<cstring> using namespace std; int n,k; int father[105],son ...
- DICOM-RT:放疗流程与參与角色
背景: 放疗是一个复杂的过程,同一时候须要肿瘤医师.模拟定位技师.剂量师.物理师.治疗技师.护士等多重角色參与.总体流程涉及到成像系统.定位系统.计划系统.治疗系统.质控QA系统.信息管理系统等多个独 ...
- (转)CSS3全局实现所有元素的内边距和边框不增加
全局设置 border-box 很好,首先它符合直觉,其次它可以省去一次又一次的加加减减 它还有一个关键作用——让有边框的盒子正常使用百分比宽度.但是使用了 border-box 可能会与一些依赖默认 ...
- AppFuse 3的乱码问题
书接上回:AppFuse 3常见问题与解决方法,一个新问题:乱码! 在3.0.0版本号下,运行mvn appfuse:full-source命令后使用mvn jetty:run启动工程,页面上就出现了 ...
- (白书训练计划)UVa 11572 Unique Snowflakes(窗体滑动法)
题目地址:UVa 11572 这样的方法曾经接触过,定义两个指针,不断从左向右滑动,推断指针内的是否符合要求. 这个题为了能高速推断是否有这个数,能够用STL中的set. 代码例如以下: #inclu ...
- ORACLE数据库忘记SYS和SYSTEM密码,SYSTEM被锁定怎么办?
本人忘性太大,竟然将ORACLE的Sys用户和system用户密码搞忘,而且多次尝试登录system后,造成system被锁定. 经过一番尝试,终于解决.过程如下: 首先,重建sys密码文件.重建方式 ...
- split+ Pattern切割字符串
今天在对一个String对象进行拆分的时候,总是无法到达预计的结果.呈现数据的时候出现异常,后来debug之后才发现,错误出在String spilt上,于是开始好好研究下这东西,开始对api里的sp ...
- 解决gradle多模块依赖在Idea中能运行,gradle build失败的问题。
最近需要初始化一个SpringBoot新项目遇到一个问题就是:项目中有多个子模块,使用gradle依赖管理成功. 项目结构如下: project --module1 --module2我的mo ...