这道题是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. day123:MoFang:直播间列表信息的前后端实现&创建房间的前后端实现

    目录 1.服务端提供所有直播间的列表信息 2.前端显示房间列表 3.创建房间 1.服务端提供所有直播间的列表信息 1.marshmallow.py from marshmallow_sqlalchem ...

  2. 【Spring】Spring IOC

    Spring IOC IOC 的常用注解 小节源码 之前的 XML 配置: <bean id="accountService" class="cn.parzulpa ...

  3. SpringBoot启动报端口已被占用--解决

    问题 启动SpringBoot项目后发现启动失败,控制台输出以下内容 Description: The Tomcat connector configured to listen on port 81 ...

  4. three.js 之cannon.js物理引擎

    今天郭先生说的是一个物理引擎,它十分小巧并且操作简单,没错他就是cannon.js.这些优点都源自于他是基于js编写的,对于js使用者来说cannon.js拥有其他物理引擎没有的纯粹性.从学习成本来看 ...

  5. Xshell与Xftp免费下载安装及步骤

    Xshell与Xftp免费下载安装及步骤 1.进入Xshell的官网:https://www.netsarang.com/zh/ 加粗样式 2.选择你需要的软件进行下载如:Xshell 3.选择家庭和 ...

  6. Nacos集成学习入门

    微服务注册中心nacos学习:先尝试使用它,然后撸它源码搞懂它. 在这里整理一下自己之前集成nacos的内容. 我的github地址:https://github.com/mrxiaobai-wen/ ...

  7. Sklearn 与 TensorFlow 机器学习实战—一个完整的机器学习项目

    本章中,你会假装作为被一家地产公司刚刚雇佣的数据科学家,完整地学习一个案例项目.下面是主要步骤: 项目概述. 获取数据. 发现并可视化数据,发现规律. 为机器学习算法准备数据. 选择模型,进行训练. ...

  8. Promise用法

    1.概述 Promise是一步编程的一种解决方案,从语法上讲,promise是一个对象,从它可以获取异步的问题 Promise的优点: 可以避免多次异步调用嵌套导致的回调地域 提供了简洁的api,使得 ...

  9. moco框架实现重定向

    一.重定向到百度 1.代码 2.运行结果 因为没哟填写别的,浏览器输入路径: localhost:8888/redirect 点击回车,跳转到百度 二.跳转到自己的网站 1.代码 2.运行结果 输入准 ...

  10. DP 状态 DP 转移方程 动态规划解题思路

    如何学好动态规划(2) 原创 Gene_Liu LeetCode力扣 今天 算法萌新如何学好动态规划(1) https://mp.weixin.qq.com/s/rhyUb7d8IL8UW1IosoE ...