这道题是CD老OJ上面的一道题,现在在新OJ上的题号是360,开始在VJ上做的提交一直RE(囧)。后来才知道OJ移位了。

这道题是一个简单的成段更新+区间合并的线段树的题,1A还让我小激动了一下

这道题的大概意思是有两种操作,一种是成段地增加一个值,另外一种是询问从l到r这段区间内的最长递增子序列

首先先分析一下,如果某一段的值成段地增加一个量,那么该区间内的数的相对大小是不变的,因此递增子序列的长度是不会改变的

是要分析对于结果有影响的信息与值:一是每个子区间中的最值,二是有可能在两个区间合并之后的两个区间的中间的两段成为新的最值,因此我们需要判断中间的两个值是否可以合并,从何得知:我们需要在运算过程中分别记录下左端点的值和右端点的值,来判断是否可以合并。因此在每个节点增设两个值lv,rv。

还有一个问题就是在查询过程中,可能会存在查询的范围R-mid比lsum[rt<<1|1]小(mid-L+1比rsum[rt<<1]小),因此用比较取较小值相加就OK;额

 1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 const int SIZEN=100005;
6 int sum[SIZEN<<2],lsum[SIZEN<<2],rsum[SIZEN<<2];
7 int lv[SIZEN<<2],rv[SIZEN<<2],add[SIZEN<<2];
8 int a[SIZEN];
9 void pushup(int len,int rt){
10 int tmp;
11 lsum[rt]=lsum[rt<<1];
12 rsum[rt]=rsum[rt<<1|1];
13 lv[rt]=lv[rt<<1];rv[rt]=rv[rt<<1|1];
14 if(lsum[rt]==(len-(len>>1))&&rv[rt<<1]<lv[rt<<1|1]) lsum[rt]+=lsum[rt<<1|1];
15 if(rsum[rt]==(len>>1)&&rv[rt<<1]<lv[rt<<1|1]) rsum[rt]+=rsum[rt<<1];
16 tmp=rsum[rt<<1]+lsum[rt<<1|1];
17 if(rv[rt<<1]<lv[rt<<1|1])
18 sum[rt]=max(tmp,max(sum[rt<<1],sum[rt<<1|1]));
19 else sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
20 }
21 void pushdown(int rt){
22 if(add[rt]!=0){
23 add[rt<<1]+=add[rt];
24 add[rt<<1|1]+=add[rt];
25 lv[rt<<1]+=add[rt];rv[rt<<1]+=add[rt];
26 lv[rt<<1|1]+=add[rt];rv[rt<<1|1]+=add[rt];
27 add[rt]=0;
28 }
29 }
30 void update(int L,int R,int o,int l,int r,int rt){
31 if(L<=l&&r<=R){
32 add[rt]+=o;
33 lv[rt]+=o;rv[rt]+=o;
34 return;
35 }
36 pushdown(rt);
37 int mid=(l+r)>>1;
38 if(L<=mid) update(L,R,o,l,mid,rt<<1);
39 if(mid+1<=R) update(L,R,o,mid+1,r,rt<<1|1);
40 pushup(r-l+1,rt);
41 }
42 void build(int l,int r,int rt){
43 add[rt]=0;
44 if(l==r){
45 sum[rt]=lsum[rt]=rsum[rt]=1;
46 lv[rt]=rv[rt]=a[l];
47 return;
48 }
49 int mid=(l+r)>>1;
50 build(l,mid,rt<<1);
51 build(mid+1,r,rt<<1|1);
52 pushup(r-l+1,rt);
53 }
54 int query(int L,int R,int l,int r,int rt){
55 if(L<=l&&r<=R){
56 return sum[rt];
57 }
58 int mid=(l+r)>>1,r1,r2,r3;
59 int len=r-l+1;
60 r1=r2=r3=-1;
61 pushdown(rt);
62 if(L<=mid) r1=query(L,R,l,mid,rt<<1);
63 if(mid+1<=R) r2=query(L,R,mid+1,r,rt<<1|1);
64 if(rv[rt<<1]<lv[rt<<1|1]) r3=min(rsum[rt<<1],mid-L+1)+min(lsum[rt<<1|1],R-mid);
65 return max(r1,max(r2,r3));
66 }
67 int main()
68 {
69 //freopen("data.in","r",stdin);
70 int i,j,_;
71 char c;
72 int l,r,o;
73 int n,q,txt=1;
74 scanf("%d",&_);
75 while(_--){
76 printf("Case #%d:\n",txt++);
77 scanf("%d%d",&n,&q);
78 for(i=1;i<=n;i++)
79 scanf("%d",&a[i]);
80 build(1,n,1);
81 while(q--){
82 scanf(" %c",&c);
83 if(c=='a'){
84 scanf("%d%d%d",&l,&r,&o);
85 update(l,r,o,1,n,1);
86 }
87 else{
88 scanf("%d%d",&l,&r);
89 int ret=query(l,r,1,n,1);
90 printf("%d\n",ret);
91 }
92 }
93 }
94 return 0;
95 }

UESTC 360(1425) another LCIS的更多相关文章

  1. O(mn)实现LCIS

    序: LCIS即求两序列的最长公共不下降子序列.思路于LCS基本一致. 用dp[i][j]记录当前最大值. 代码实现: /* About: LCIS O(mn) Auther: kongse_qi D ...

  2. 全景VR视频外包公司:长年承接VR全景视频外包(技术分享YouTube的360全景视频)

    虽然比预期来得晚了些,但YouTube终于支持360度全景视频了,这应该会吸引不少VR(虚拟现实)爱好者.今年1月,Google就表示这一功能将在“接下来”的几周出现.现在YouTube上已经有了一些 ...

  3. C#制作高仿360安全卫士窗体(四)- 水晶按钮

    项目越来越紧,我也乐此不疲.自从上次C#制作高仿360安全卫士窗体(三)出来之后,就开始有一些人在说为什么还在坚持写这么落后的东西.我想说的是,我是从事企业信息化工作的,所有程序都只对内部使用.所以只 ...

  4. C#制作高仿360安全卫士窗体(三)

    距上篇C#制作高仿360安全卫士窗体(二)也将近一个多月了,这个月事情还是像往常一样的多.不多我也乐在其中,毕竟我做的是我喜欢做的东西.今天特地抽空把怎么制作文本框写一下.同时也希望有爱好这些玩意的同 ...

  5. 【360开源】thinkjs:基于Promise的Node.js MVC框架 (转)

    thinkjs是360奇舞团开源的一款Node.js MVC框架,该框架底层基于Promise来实现,很好的解决了Node.js里异步回调的问题.360奇舞团(奇虎75Team),是奇虎360公司We ...

  6. 《刺杀金正恩》1080p全高清无水印,附中文字幕 bt种子下载,附字母(百度网盘/360云盘)

    <刺杀金正恩>1080p全高清无水印,附中文字幕下载(百度网盘/360云盘) 种子和字幕下载地址: thunder://QUFlZDJrOi8vfGZpbGV8JUU5JTg3JTg3JU ...

  7. 插件开发之360 DroidPlugin源码分析(五)Service预注册占坑

    请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52264977 在了解系统的activity,service,broa ...

  8. 插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑

    请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52258434 在了解系统的activity,service,broa ...

  9. wing带你玩转自定义view系列(1) 仿360内存清理效果

    本篇是接自 手把手带你做自定义view系列 宗旨都是一样,带大家一起来研究自定义view的实现,与其不同的是本系列省去了简单的坐标之类的讲解,重点在实现思路,用简洁明了的文章,来与大家一同一步步学习. ...

随机推荐

  1. PHP 导入Excel数据 到数据库

    /** * 导入excel * @throws \PHPExcel_Exception * @throws \PHPExcel_Reader_Exception */ public function ...

  2. TR2021_0000偶发数据库连接异常问题排查

    [问题描述] 数据库连接异常是很难排查的一类问题.因为它牵涉到应用端,网络层和服务器端.任何一个组件异常,都会导致数据库连接失败.开发遇到数据库连接不上的问题,都会第一时间找DBA来协助查看,DBA除 ...

  3. vue-vite浅析

    大家好,我是小雨小雨,致力于分享有趣的.实用的文章. 内容分为原创和翻译,如果有问题,欢迎随时评论或私信,很乐意和大家一起探讨,一起进步. 分享不易,希望能够得到大家的支持和关注. vite出了好久了 ...

  4. Docker学习笔记之搭建Docker私有仓库

    Docker仓库服务器名为Docker注册(registry)服务器.可以使用docker push命令将镜像上传到注册服务器,也可以使用docker pull命令下载服务器的镜像. Docker注册 ...

  5. 【Oracle】什么是DRM,怎么关闭

    DRM 分析及案例讲解 什么是DRM DRM(Dynamic Resource management)是oracle10.10.2里面推出来的一个新特性,一直到现在最新的12cR1,都存在,且bug非 ...

  6. CSAPP:Lab0 -Docker搭建纯净Linux环境

    1. 安装docker 在mac-os下我们可以利用homebrew很容易的安装docker. brew install docker 当然去官网下载也很容易 Empowering App Devel ...

  7. kafka安装流程

    本文是作者原创,版权归作者所有.若要转载,请注明出处. 安装前的环境准备 1.由于Kafka是用Scala语言开发的,运行在JVM上,在安装之前需要先安装JDK(省略) 2.kafka依赖zookee ...

  8. 未使用绑定变量对share_pool的影响

    oracle SGA中包含数据高速缓冲,重做日志缓冲,以及共享池(share_pool).共享池中包含库高速缓冲(所有的SQL,执行计划等)和数据字典缓冲(对象的定义,权限等). 所以,如果SQL中没 ...

  9. oracle创建恢复编录(recovery catalog)

    1.在要作为恢复编录的数据库创建用户 create user rman identified by oracle default tablespace system temporary TABLESP ...

  10. bootstrap弹出层嵌套弹出层后文本框不能获得焦点输入

    如图上 我从页面打开一个bootstrap弹出层 然后又在 bootstrap弹出层的基础上打开一个layui的弹出层  打开后发现文本域获取不到焦点不能输入内容 而该弹出层显示的层级体现出来了 按钮 ...