【CodeForces】- 739C Alyona and towers

告别“单打独斗”:Oh My Open Code 如何用多模型协作重塑 AI 编程范式 介绍"Oh My OpenCode"——一个能协调多个专业AI模型完成复杂开发任务的智能编程框架。您将看到它如何分配任务、发挥不同模型的独特优势,并通过并行处理和实时纠错等功能解决AI编程流程中的常见痛点。 阅读详情

Alyona has built n towers by putting small cubes some on the top of others. Each cube has size 1 × 1 × 1. A tower is a non-zero amount of cubes standing on the top of each other. The towers are next to each other, forming a row.

Sometimes Alyona chooses some segment towers, and put on the top of each tower several cubes. Formally, Alyouna chooses some segment of towers from li to ri and adds di cubes on the top of them.

Let the sequence a1, a2, …, an be the heights of the towers from left to right. Let’s call as a segment of towers al, al + 1, …, ar a hill if the following condition holds: there is integer k (l ≤ k ≤ r) such that al < al + 1 < al + 2 < … < ak > ak + 1 > ak + 2 > … > ar.

After each addition of di cubes on the top of the towers from li to ri, Alyona wants to know the maximum width among all hills. The width of a hill is the number of towers in it.

Input

The first line contain single integer n (1 ≤ n ≤ 3·105) — the number of towers.

The second line contain n integers a1, a2, …, an (1 ≤ ai ≤ 109) — the number of cubes in each tower.

The third line contain single integer m (1 ≤ m ≤ 3·105) — the number of additions.

The next m lines contain 3 integers each. The i-th of these lines contains integers li, ri and di (1 ≤ l ≤ r ≤ n, 1 ≤ di ≤ 109), that mean that Alyona puts di cubes on the tio of each of the towers from li to ri.

Output

Print m lines. In i-th line print the maximum width of the hills after the i-th addition.

Solution

我们来定义一种特殊点,满足以下的条件

1、开头和结束的点
2、a[i]<a[i−1],a[i+1]
3、a[i]=a[i−1] 或 a[i]=a[i+1]

那么任意一个答案的区间不能跨过特殊点。
维护一个区间的最长答案,最左最右的特殊点。线段树即可。

(我还有一种鬼畜一点的做法,线段树上只维护一个值)
对于一个叶子节点,如果它是特殊点,它的值就是它到它左边的第一个特殊点的距离
(即以它为右端点的答案)
如果它不是特殊点,答案为0
树上维护最大值

这样的一棵线段树支持查询答案(根的值),查询前驱后继
修改的时候要查询前驱更新答案,还要去更新一下后继的答案
(:з」∠)

(ps:差分数组,修改会很舒服的~)
(注意数据范围……)

第一份是正常版的,第二份是鬼畜的(鬼畜跑得快)

#include<stdio.h>
#include<algorithm>
#define M 524287

struct tree{int ans,l,r;} t[1050000];

using namespace std;

int l,n,r,p,m;
long long a[300005];

inline tree merge(const tree &x,const tree &y)
{
    if ((!x.ans) && (!y.ans)) return (tree){0,0,0};
    if (!x.ans) return y;if (!y.ans) return x;
    return (tree){max(max(x.ans,y.ans),(x.r+1==y.l && !a[y.l])?1:y.l-x.r+1),x.l,y.r};
}

inline void judge(const int &i)
{
    if (!(i && i<=n)) return;
    if ((a[i]<=0 && 0<=a[i+1]) || (!a[i+1]) || (!a[i]) || i==1 || i==n) t[i+M]=(tree){1,i,i};
    else t[i+M]=(tree){0,0,0};
    for (int j=i+M>>1;j;j>>=1) t[j]=merge(t[j<<1],t[j<<1|1]);
}

int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%d",a+i);
    for (int i=n;i;i--) a[i]-=a[i-1];
    for (int i=1;i<=n;i++) if ((a[i]<=0 && 0<=a[i+1]) || (!a[i+1]) || (!a[i]) || i==1 || i==n) t[i+M]=(tree){1,i,i};
    else t[i+M]=(tree){0,0,0};
    for (int i=M;i;i--) t[i]=merge(t[i<<1],t[i<<1|1]);
    scanf("%d",&m);
    while (m--)
    {
        scanf("%d%d%d",&l,&r,&p);
        a[l]+=p;a[r+1]-=p;
        judge(l-1);judge(l);judge(l+1);
        judge(r);judge(r+1);judge(r+2);
        printf("%d\n",t[1]);
    }
}
#include<stdio.h>
#define M 524287

inline int max(const int &a,const int &b){return a<b?b:a;}

int l=1,n,r,p,t[1050000],m;
long long a[300005];

inline void judge(const int &l)
{
    if (1<l && l<=n)
    {
        bool f=((a[l]<=0 && 0<=a[l+1]) || (!a[l+1]) || (!a[l])) || l==n;
        int i=l+M-1,la=t[l+M];
        if (f)
        {
            while (!t[i]) i=(i&1)?i>>1:i-1;
            while (i<=M) i=t[i<<1|1]?i<<1|1:i<<1;
        }
        if (!a[i-M+1]) i++;
        if (la!=(t[l+M]=f?l+M-i+1:0)) for (int i=l+M>>1;i;i>>=1) t[i]=max(t[i<<1],t[i<<1|1]);
        return;
    }
}

inline int getr(const int &r)
{
    int i=r+M+1;
    while (!t[i]) i=(i&1)?i+1:i>>1;
    while (i<=M) i=t[i<<1]?i<<1:i<<1|1;
    return i-M;
}

int main()
{
    scanf("%d",&n);a[n+1]=2333333333333333LL;
    for (int i=1;i<=n;i++) scanf("%d",a+i);
    for (int i=n;i;i--) a[i]-=a[i-1];
    for (int i=2;i<n;i++) if ((a[i]<=0 && 0<=a[i+1]) || (!a[i+1]) || (!a[i]))
    {
        if (a[i]==0) l=i;
        t[i+M]=i-l+1,l=i;
    }
    t[M+1]=1;t[n+M]=a[n]==0?1:n-l+1;
    for (int i=M;i;i--) t[i]=max(t[i<<1],t[i<<1|1]);
    scanf("%d",&m);
    while (m--)
    {
        scanf("%d%d%d",&l,&r,&p);
        a[l]+=p;a[r+1]-=p;
        judge(l-1);
        if (l<r) judge(l);
        if (l+1<r) judge(l+1);
        if (l+2<r) judge(getr(l+1));
        judge(r);judge(r+1);judge(r+2);
        if (r+2<n) judge(getr(r+2));
        printf("%d\n",t[1]);
    }
}
Qemu开发ARM篇-3、qemu运行uboot演示 在上一篇文章中,我们搭建了交叉编译工具链,并成功进行了uboot的交叉编译,在该篇中,我们将演示如何利用qemu运行上一篇中交叉编译的uboot程序。 阅读详情

相关推荐

ENVI 5.3与IDL 8.5安装指南:从下载到激活的完整流程

本文提供了一份详细的ENVI 5.3与IDL 8.5安装教程,涵盖从获取安装包、运行主程序、安装许可证到关键文件替换的完整流程。指南重点解决了激活过程中的常见问题,并分享了个人实践经验,旨在帮助用户,特别是遥感图像处理初学者,一次性顺利完成软件部署,为后续的科研与开发工作奠定基础。

weixin_29213827的博客 547

Codeforces Round #381 Div.2

A:Alyona and copybooks 题目大意:已经给了你n本书,你可以选择花a元买一本书,花b元买两本书(严格两本),花c元买三本书(严格三本),让你花最少的钱买x本书使得n+x为4的倍数。 思路:枚举一下买一本书,两本书,三本书的次数,然后统计答案即可。 #include<cmath> #include<cstdio> #include&...

V469584691的博客 295

QTableView为例:Qt模型视图委托(MVD)(Model-View-Delegate)

QT中的MVD(模型-视图-委托)模式是一种类似于MVC的设计模式,将数据、界面和交互逻辑分离。模型负责数据管理,视图负责显示界面,而委托则嵌入在视图中处理数据的显示和编辑。QT提供了多种视图组件(如QListView、QTreeView、QTableView)和模型类(如QStandardItemModel、QAbstractItemModel),支持数据的多样化呈现。委托(Delegate)通过定制显示和编辑行为增强了视图的灵活性。该模式适用于各类数据结构展示(列表、表格、树形),能够高效处理数据与界面

菜一头包的博客 1989

Alyona and towers CodeForces - 739C (线段树)

大意: 给定序列, 要求实现区间加, 询问整个序列最长的先增后减的区间. 线段树维护左右两端递增,递减,先增后减的长度即可, 要注意严格递增, 合并时要注意相等的情况, 要注意相加会爆int. #include <iostream> #include <random> #include <algorithm> #include...

weixin_30609331的博客 180

黑客渗透测试后门隐藏技术揭秘

本文介绍了在授权渗透测试中隐藏后门文件(muma.exe)的多种技术手段。主要包括:通过WinRAR自解压脚本将后门与正常程序捆绑实现双开;利用系统自动运行目录和注册表实现开机自启;修改文件图标伪装成常用软件;将文件存放在冷门系统目录;设置系统+隐藏双重属性增强隐蔽性。此外还涉及对抗安全软件的加壳(UPX)、免杀(msfvenom编码)技术,以及进程注入、日志清除等运行隐藏方法。所有技术仅限合法授权测试使用,未经授权使用将面临法律责任。

m0_60781580的博客 1040

图解凸函数与凹函数:别再被数学定义搞晕了!

本文通过图解和生活化类比,深入浅出地解释了凸函数与凹函数的数学定义及其与日常直觉的差异。文章详细介绍了凸函数的图像特征、数学定义(包括二阶导数判断)、在机器学习中的重要性,以及常见误区和实际应用中的判断技巧,帮助读者彻底理解这一关键数学概念。

weixin_29159441的博客 657

Codeforces Round #381 (Div. 2) E. Alyona and towers

Codeforces Round #381 (Div. 2) E. Alyona and towersDescriptionAlyona has built n towers by putting small cubes some on the top of others. Each cube has size 1 × 1 × 1. A tower is a non-zero amount of c

DorMOUSENone的博客 585

计算机三级考试嵌入式系统重点精简汇总

第一章 嵌入式系统概论 1.1.1嵌入式系统 (1)特点:(1)专用性;(2)隐蔽性;(3)资源受限;(4)高可靠性;(5)实时性;(6)软件固化。 (2)应用:(1)冰箱、洗衣机、电饭煲、空调、摄影机、DVD播放器等;(2)数控机床、飞机、汽车、电梯、X光机、血压计等;(3)电话机、传真机、打印机、pos机、GPS导航仪、路由器等。 1.1.2嵌入式系统组成与分类 (1)逻辑组成:硬件和软件,分为处理器、存储器、I|0设备与I|O接口,数据总线; (2)处理器:分为主处理器(CPU)和协处

chemkrik的博客 1万+

Codeforces Round #381 (Div. 2) E. Alyona and towers 差分+ 线段树并

题意:给你一个数列,m个操作每次修改一段区间,问每次修改后数列的最长山峰(al < al + 1 < al + 2 < ... < ak > ak + 1 > ak + 2 > ... > ar.)、参考http://blog.csdn.net/dormousenone/article/details/53363374分析针对区间修改及维护的问题,很容易想到线段树。可以想到al<al+1<al+2<

now_ing的博客 350

ABAP ALV编辑后触发事件

1.FUNCTION ALV在it_events的参数中,写入对应的事件。2.OO ALV和FUNCTION ALV都可以,注册当前ALV的事件,对应的事件需要创建对象去实现。下面代码中,实现的是第一种,在it_events中写入事件。下面的代码是通过创建对象去实现ALV事件。

a86632678的博客 3852

分子对接时,如何批量处理小分子受体和蛋白配体,让他们快速转化为pdbqt格式,然后用vina跑?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1222

[CF739C]Alyona and towers

Alyona and towers 题解 很冗杂的一道题。 思路其实是很容易想到的,毕竟就是一道线段树板子题。 我们可以通过线段树来维护每一个区间的符合要求的最长子串长度,最长向左端点递增子串长度,递减子串长度,先递增再递减子串长度,以及向右端点的以上三个操作的长度。 每次操作在线段树上修改一个区间,每次合并区间时更新出当前区间的值。 但我们发现如果还要区间相加带懒标记的话就太麻烦了,于是我们考虑差分,这样判断递增与递减时就只需要判断一个点的正负性了,而且每次修改时只用修改左右端点两个点,方便了许多。 但总

StaroForgin的博客 307

第二章:创建交互式地图

那么您应该已经有了一个安装了这些包的 conda 环境。否则,您需要创建一个新的 conda 环境并使用以下命令安装。

韩天放 4219

CodeForces 739C Alyona and towers

题目大意 给定一个长度为n的序列a和m个操作,每个操作将[L,R]的元素加上d。 每次操作完后询问序列a中最长的连续子序列满足al<al+1<...<ax>...>ar−1>ar的长度是多少。 Data Constraint n,m≤3×10^5

Akakii的博客 1462

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Codeforces 739C Alyona and towers 线段树

Alyona and towers 这个题写起来真的要人命。。。 我们发现一个区间被加上一个d的时候, 内部的结构是不变的, 改变的只是左端点右端点的值, 这样就能区间合并了。 如果用差分的话会简单一些, 就变成了求前一段是负数,后一段是正数的最长段多长。 #include<bits/stdc++.h> #define LL long long #define fi f...

weixin_30315435的博客 143

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

线段树 codeforces Alyona and towers 739C

今天在CF上面看到一个题目,是有关线段树的。好久没有写过线段树,基本都已经忘完。没办法,后来只得看了网上的题解。写下这篇博客,总结一下线段树的操作,便于以后学习,复习。线段树主要树用来维护区间信息,快速的更新与查询的数据结构,在运用过程中,需要根据具体情况,判断出需要维护的信息,达到快速查询,更新的效果。与它的功能对应,线段树的操作主要是更新和查询,当然还有建树(建树类类似于更新)对应的代码中,也

ZT在努力 683

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

codeforces 739c Alyona and towers

题意给定一个序列,求最长的严格先递增后递减区间长度。有m次区间加修改,每次修改后输出答案。 思路线段树。diff[i] = a[i] - a[i - 1],diff[1] = 0.这样每次的区间加就就变成了单点修改,即l点加k,r+1点减k。需要注意当l为1或者r为n时无需修改。

rua~ 1106

Codeforces 739C.Alyona and towers (线段树/非递归线段树)

题目链接:http://codeforces.com/contest/739/problem/C 题意:给定30万个正整数,和30万个操作,每次操作后输出查询结果。 操作:每次把从L到R的数都加上D 查询:最宽的Hill的宽度。定义:先递增后递减的连续n个数称作宽度为n的Hill。

岩之痕 2073

B - Alyona and towers CodeForces - 739C

链接: https://vjudge.net/contest/202699#problem/B 题意: 给出一个序列,要支持区间加和操作 求其中最长的区间,该区间内的元素满足(ai<ai+1<。。。ak>ak+1>。。>aj-1>aj) 要支持区间加值 题解: 是一个很经典的差分 对于相邻两项要判断大小只需看差分数组即可 而对于区间修改,只需对...

weixin_30617797的博客 99

[Codeforces div1] Round 739C. Alyona and towers 线段树+差分数组

这题应当有很多做法 拿到题目以后有很多想法,光是不同的线段树就有两三种,而且我觉得分块卡一卡也是能卡过去的。 最后写了最简单的方法,代码比起其它的解法都短很多。 考虑查分后的数组,原问题变可以转化成求最长的一段正数后紧接一段负数的长度。 若用折线将这串数字连接起来,那么每一段“合唱队形”数便可以表示成两个波谷之间的距离。 线段树维护所有的波谷,维护最大的两个波谷之间的距离。 修

HbFS- 651

做题记录

//记一下值得记的 //20170121 POJ3667 Hotel(线段树区间合并) //线段树基本思想 //区间合并基本思想 cf739C Alyona and towers(线段树区间合并) //想好线段树结点维护的值,处理好区间合并的UP函数,各个函数想清楚了再写

358

codeforces 739C 线段树的高级应用

题意,给你一个序列,有q次操作,每次对一个区间进行加值,同时要输出 最长的上升序列/下降序列/先上升再下降序列很明显能想到的是利用线段树维护,有很明显的能想到要维护线段树的每个区间的左边界和右边界的值,并且每个点都有维护四种变化的值,然后就懵逼了。 这时候应该想到的是维护每个区间的左右边界的四种情况进行拼凑来更新 一开始想到的是单峰,对于多峰没想到如何维护,其实也是很简单,有点类似拼图或者插头d

黑码 956

17.CF739C Alyona and towers 区间合并线段树

给定序列,要求支持区间加,以及查询最长先增后减子区间(单峰序列)长度 非常典型的区间合并线段树,记录左右起LIS,LCS,单峰

HeartFireY的博客 384

Codeforces Round #381 (Div. 1) C. Alyona and towers(线段树)

Alyona has built n towers by putting small cubes some on the top of others. Each cube has size 1 × 1 × 1. A tower is a non-zero amount of cubes standing on the top of each other. The towers are next t...

c_czl的博客 267

CF 739C Alyona and towers

题目大意:有n(n≤105)n(n\leq10^5)个塔排成一排,每个塔有一定的初始高度hih_i。 现有操作,对于l,r(1≤l≤r≤n),dl,r(1\leq l\leq r\leq n),d,能够将ll到rr的塔升高dd个单位。问每次操作之后最大区间l,rl,r满足存在k(l≤k≤r)k(l\leq k\leq r)使得hl<hl+1...hk−1<hk>hk+1>...hr−1>hrh_l

Green_Days 1072

Codeforces 739C 线段树 区间合并问题

网上搜到的解法,总结下自己学到的东西 1. 以前也写过类似的线段树,不过当时没有 区间合并问题这个概念,可能那道题比较裸,大概写一下也就过了,没学到什么。这道题让我知道线段树还能解决一类区间合并问题,学习了这类线段树的公式化?写法。 2. 将高度数组转化为一个高度的差值数组,优点是题目给出一次更改,只要在线段树中做两次单点更新就好了。 这也是我第一次根据数组建树完后,每次更新还需要修改数组内

lchi1997的博客 726
上一篇: 【BZOJ】1026 [SCOI2009] windy数
下一篇: 【UVALive】7338 Toll Management IV
Pure_W
博客等级 码龄10年 19粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值