这道题是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. Solon rpc 之 SocketD 协议 - RPC鉴权模式

    Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...

  2. Java高并发与多线程(一)-----概念

    其实之前一直想专门写一篇,单独说一说Java的多线程与高并发,但是一直以来,都没有想到能够用什么比较有趣的表现形式去表达出来,而且网上充斥着很多类似的博客,有好的又不好的,有简介的有繁琐的,所以也一直 ...

  3. 【Spring】Spring 事务控制

    Spring 事务控制 Spring 事务控制介绍 JavaEE 体系进行分层开发,事务控制位于业务层,Spring 提供了分层设计业务层的事务处理解决方案. Spring 的事务控制都是基于 AOP ...

  4. 按装parallels tool的失败之路

    这是一篇对于其他人来说没什么意义的博客.单纯的可以被看作是日记. 首先,我想安装parallels tool. 但是照着网上很多教程(如www.cnblogs.com/artwalker/p/1323 ...

  5. 从一次生产消费者的bug看看线程池如何增加线程

    0 背景 某个闲来无事的下午,看到旧有的项目中,有个任务调度的地方都是同步的操作,就是流程A的完成依赖流程B,流程B的完成依赖流程C,按此类推. 作为一名垃圾代码生产者,QA的噩梦.故障报告枪手的我来 ...

  6. MyBatis 查询数据时属性中多对一的问题(多条数据对应一条数据)

    数据准备 数据表 CREATE TABLE `teacher`( id INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY ( ...

  7. 解决ROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'creat table study_record( id int(11) not null

    之前一直用的好好的,突然就出现了这个错误: ERROR 1064 (42000): You have an error in your SQL syntax; check the manual tha ...

  8. window.open()打开新窗口教程

    使用 window 对象的 open() 方法可以打开一个新窗口.用法如下: window.open (URL, name, features, replace) 参数列表如下: URL:可选字符串, ...

  9. 如何在 Blazor WebAssembly中 使用 功能开关

    微软Azure 团队开发的 功能管理 (Feature Management) 包 Microsoft.FeatureManagement可用于实现 功能开关,可以通过 功能开关 特性动态的改变应用程 ...

  10. django 组件 自定义过滤器 自定义标签 静态文件配置

    组件 将一些功能标签写在一个html文件里,这个文件作为一个组件,如果那个文件需要就直接拿过来使用即可: 这是title.html文件,写了一个导航栏,作为一个公用的组件 <div style= ...