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,码迷,mamicode.com

时间: 2024-10-05 04:17:23

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

uestc 分割包围(二分)

二分最大距离,判断条件是每次要删除的点和要求的是否大小相等 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 6 const int MAXN = 50010; 7 int d[MAXN]; 8 int x; 9 int n, m; 10 11 int search(int l, int r){ 12 int del; //记录消灭的数量 13 i

数据结构和算法概览(一)

软考视频第一章讲的就是数据结构.这部分的内容在自考书中学习过,曾经也接触过,总之,就是有一种熟悉的感觉.猛然间的看上去好像有非常多的数据结构,可是当把它们梳理好总结好以后,你会发现数据结构是如此的整齐. 计算机在解决不论什么实际问题都离不开数据表示和处理,而数据表示和处理核心的问题之中的一个就是数据结构. 数据结构就是计算机在组织数据和存储数据的方式.数据结构是计算机底层的知识,足够引起我们的重视,所以我们首先要从这样一个定位去学习它. 第一章能够分成两块内容.一是数据结构(包含逻辑结构和存储结

学习Redis(二)

自关系型DB诞生40年来,从理论产生到现实产品(MySQL.Oracle),已在DB领域上升到了霸主地位,每年数百亿$的庞大产业市场: 随着web2.0的兴起,对于规模日益庞大的海量数据,传统的关系型DB显得力不从心,如超大规模和高并发的微博.微信.SNS(socail network site,socail network services)纯动态网站等,关系型DB面临很多难以克服的问题,有IO瓶颈.性能瓶颈都难以有效突破,于是出现了很多针对特定场景,以高性能和使用便利为目的的差异化的DB产品

360搜索(边框)

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>360搜索(边框)</title> </head> <body> <div style="wi

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

thinkjs是360奇舞团开源的一款Node.js MVC框架,该框架底层基于Promise来实现,很好的解决了Node.js里异步回调的问题.360奇舞团(奇虎75Team),是奇虎360公司Web平台部前端工程师与部分特约嘉宾组成的一个前端团队. thinkjs主要特性有: 支持Http.命令行.WebSocket.Restful等多种访问方式: 项目实行“C(Core)+B(Behavior)+D(Driver)”架构: Model高度封装,无需手写SQL语句: 封装了数据库(DB).会

360是怎样盈利的(整理)

1.如今主要是风险投资支持着,还有一个基本的收入来源是推销杀毒软件,比方当年卡巴斯基就是靠360给推广开来的,听说360每为卡巴斯基带来 一个用户就能从卡巴斯基那里得到0.5元,眼下360上的广告非常少,从他们的软件上就能看出来.将来就不好说了,一旦有一个庞大的用户基数,什么 事情都会做出来的,如今不是连千千静听都弹出前程无忧广告了,本来一生气想不用千千静听,后来还是没舍得,用这么多年了,自己把广告删了也 就是了. 2.360杀毒盈利至少有下面资本和途径: (1) 庞大的用户群.360杀毒的免费

Ubuntu再体验之【浏览器】--Chromium安装拓展程序、安装插件(360极速浏览器插件)

上次谈到了安装Chromium的Flash插件http://blog.csdn.net/rovast/article/details/38476129,有兴趣的同学可以再去看看 这次我们来看看如何安装Chrome插件(或者是360Chrome插件) [转载请注明出处:blog.csdn.net/rovast] 1.为什么要安装插件 在重新折腾上了Ubuntu Kylin 14.04后发现,谷歌被大陆屏蔽了,也就是通过在线安装插件的套路不可用了.但是在使用Windows操作系统的朋友注意到,国产的

通过构造系统服务分发实现拦截&amp;过滤 (仿360游戏保险箱)

想写这个程序主要是因为看了KSSD的一篇帖子,http://bbs.pediy.com/showthread.php?t=108378 讲 的是360保险箱保护游戏账号的原理,实际上就是对各种请求的拦截.这个帖子是大约6年前的了,我简单的看了一下现在的360保险箱应该不再采用这种方法 了,不再去HOOK KiFastCallEntry了,而且多增加了几个事件通知回调.这里主要是跟着那篇帖子作者的分析,来自己实现一个360游戏保险箱. 这里主要的思路就是HOOK住系统服务的分发,这已经不是什么新鲜

浏览器兼容性调试 (360 , IE , Chrome)

浏览器兼容性问题,一直是一个比较头疼的事情,各家有各家的标准,这就苦了广大 debuger 们. 一.360 目前,360安全浏览器的使用者已经越来越多,而且从微软宣布和360合作,对xp进行维护后,更是有不可阻挡的态势.那带来的问题,就是我们需要去适配360. 360采用双核机制,包括webkit 和 IE内核,在安装过程中,会检测本地IE版本,如果高于IE8,则不安装内置IE8. 同时,360帮助也给出了一个解决办法,详情参见:点此查看.从这份帮助文档来看,360还是有一定的野心的,呵呵.