UESTC 360(1425) another LCIS
这道题是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的更多相关文章
- O(mn)实现LCIS
序: LCIS即求两序列的最长公共不下降子序列.思路于LCS基本一致. 用dp[i][j]记录当前最大值. 代码实现: /* About: LCIS O(mn) Auther: kongse_qi D ...
- 全景VR视频外包公司:长年承接VR全景视频外包(技术分享YouTube的360全景视频)
虽然比预期来得晚了些,但YouTube终于支持360度全景视频了,这应该会吸引不少VR(虚拟现实)爱好者.今年1月,Google就表示这一功能将在“接下来”的几周出现.现在YouTube上已经有了一些 ...
- C#制作高仿360安全卫士窗体(四)- 水晶按钮
项目越来越紧,我也乐此不疲.自从上次C#制作高仿360安全卫士窗体(三)出来之后,就开始有一些人在说为什么还在坚持写这么落后的东西.我想说的是,我是从事企业信息化工作的,所有程序都只对内部使用.所以只 ...
- C#制作高仿360安全卫士窗体(三)
距上篇C#制作高仿360安全卫士窗体(二)也将近一个多月了,这个月事情还是像往常一样的多.不多我也乐在其中,毕竟我做的是我喜欢做的东西.今天特地抽空把怎么制作文本框写一下.同时也希望有爱好这些玩意的同 ...
- 【360开源】thinkjs:基于Promise的Node.js MVC框架 (转)
thinkjs是360奇舞团开源的一款Node.js MVC框架,该框架底层基于Promise来实现,很好的解决了Node.js里异步回调的问题.360奇舞团(奇虎75Team),是奇虎360公司We ...
- 《刺杀金正恩》1080p全高清无水印,附中文字幕 bt种子下载,附字母(百度网盘/360云盘)
<刺杀金正恩>1080p全高清无水印,附中文字幕下载(百度网盘/360云盘) 种子和字幕下载地址: thunder://QUFlZDJrOi8vfGZpbGV8JUU5JTg3JTg3JU ...
- 插件开发之360 DroidPlugin源码分析(五)Service预注册占坑
请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52264977 在了解系统的activity,service,broa ...
- 插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑
请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52258434 在了解系统的activity,service,broa ...
- wing带你玩转自定义view系列(1) 仿360内存清理效果
本篇是接自 手把手带你做自定义view系列 宗旨都是一样,带大家一起来研究自定义view的实现,与其不同的是本系列省去了简单的坐标之类的讲解,重点在实现思路,用简洁明了的文章,来与大家一同一步步学习. ...
随机推荐
- Zap简单使用
前言 zap 是 uber 开源的一个日志记录的包, uber 在 go 的领域建树颇多, zap 更是优秀, 相比于自带的 log ,他有更多的功能, 当然, 最显眼的还是他很快, 本文介绍 zap ...
- 在 Azure 上执行一些简单的 python 工作
1. 公司禁用了 python 我的主业是桌面开发,偶尔也需要搞搞数据和算法.最近在用 python 处理一些工作,正搞得热火朝天,突然 python 就不能用了,一查记录原来是 IT 管理员禁止我使 ...
- (十七)logging模块
logging模块是Python内置的标准模块,主要用于输出运行日志. 简单应用 import logging logging.debug('+++debug+++') logging.info('+ ...
- VB基础总结
前段时间用VB写了一个简单窗口小应用,久了不碰VB,都忘了,下面用思维导图简单总结了一些基础的东西,方便以后快速查阅.
- MySQL全面瓦解18:自定义函数
定义 我们之前学习了MySQL的内置函数,非常丰富,满足了我们对数据操作的大部分需求. 但是如果有一些复杂的业务逻辑在数据库层面就可以完成,无需在程序层面完成的时候,这时候就可以写成MySQL自定义函 ...
- Description Resource Path Location Type Failure to transfer org.apache.maven.plugins:maven-surefire-
url:https://www.pianshen.com/article/8003307916/ Description Resource Path Location Type Failure to ...
- ECharts图表——封装通用配置
前言 前段时间在做大屏项目,大量用到echarts图表,大屏对设计规范要求比较高,而大屏项目,经常会因为业务方面的原因.或者是数据方面的原因改动UI设计,所有图表的代码也是三天一小改.五天一大改 因此 ...
- 安装git-macOS系统
通过homebrew安装Git 1.安装homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/H ...
- 转 5 jmeter性能测试小小的实战
5 jmeter性能测试小小的实战 项目描述 被测网址:www.sogou.com指标:相应时间以及错误率场景:线程数 20.Ramp-Up Period(in seconds) 10.循环次数 ...
- Connection Pool
MySQL :: MySQL Connector/NET Developer Guide :: 4.3 Managing a Connection Pool in Connector/NET http ...