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] ...
随机推荐
- Andriod DiskLruCache的使用案例
DiskLruCache是谷歌推荐的用来实现硬盘缓存的类,本案例将对DiskLruCache的基本用法做一个总结,包括:创建缓存.查找使用缓存.移除缓存等等. 实现效果图 创建DiskLruCache ...
- oracle user locke
1:管理员登录 sqlplus sys/pwd as sysdba sql->alter user jd account unlock; commit; SQL> password new ...
- MySQL 数据库 的安装和基本管理
03-MySql安装和基本管理 本节掌握内容: mysql的安装.启动 mysql破解密码 统一字符编码 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Orac ...
- Java程序员从笨鸟到菜鸟之(十四)Html基础积累总结(上)
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 注:由于本文内含有大量html标签,所以在排版上有些困难,所以排版有点难看,请大家见谅 ...
- Hibernate exception
1.a different object with the same identifier value was already associated with the session. 错误原因:在h ...
- safair 的css hack
在css里面使用[;attribute:value;] css参考如下: .header-share li{float: right; margin-left: 20px; [;width: 50px ...
- 利用WebViewJavascriptBridge与UIWebView进行交互
事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS ...
- vim使用手册出现 找到 tag:1/9或更多 查看别的定义的方法
:ts 或 tselect 查看有相同地方的定义 通过这种方式会出现一个列表,输入:q 然后通过数字键和回车查看某一个定义,个人经常用:ts :tn或tnext 查找下一个定义地方. :tp 查找上一 ...
- JS/TS 的 import 和 export 用法小结
ES6 export 和 export default的区别 昨天帮一个网友解决一个typescript的问题,看了一下,归根结底还是对js的import和export用法的不熟悉.让我想起来当年学这 ...
- jQuery插件之ajaxFileUpload API文档
ajaxFileUpload是一个异步上传文件的jQuery插件. 语法:$.ajaxFileUpload([options]) options参数说明: 1.url 上传处理程序地址. 2,fil ...