P9877/QOJ5069 Vacation

news/2025/10/3 21:57:19/文章来源:https://www.cnblogs.com/dcytrl/p/19125063

题意

给定长度为 \(n\) 的序列 \(a\) 和定值 \(c\)\(q\) 次操作,每次操作可以是单点修改,也可以是查询 \([l,r]\) 的所有区间长度 \(\le c\) 的子区间中区间和最大是多少。

\(c\le n\le 2\times10^5,q\le 5\times10^5,\left|a_i\right|\le 10^9\)

分析

套路性的考虑按 \(c\) 分块,那么贡献可以看做块内贡献和块间贡献。块内贡献直接线段树维护最大子段和,然后再开一棵线段树维护所有块内的最大子段和的最大值。对于块间贡献,设 \(f_i\) 为块内 \(i\) 为起点的后缀和,\(g_j\) 为下一个块 \(j\) 为终点的前缀和,那么块间答案就是 \(\max_{j-i+1\le c}f_i+g_j\)。考虑将下一个块的下标 \(j\) 平移到本块中,就是 \(\max_{j<i} f_i+g_j\),开个线段树维护区间内本块的后缀最大值,下一个块的前缀最大值,本块和下一个块的和以及答案,那么新区间的答案就是 \(\max(\) 左区间的答案+右区间的本块和,右区间的答案+左区间的下一块和,左区间的下一块前缀最大值和右区间的本块后缀最大值 \()\),具体可以看代码。最后再开一棵线段树维护块间贡献的最大值。

考虑到查询的时候 \(l,r\) 不一定是块的左右端点,所以需要对 \(l,r\) 所在块特殊处理。首先如果 \(r-l+1\le c\) 直接最大子段和;否则对 \(l,r\) 所在的块单独询问最大子段和(这个是平凡的);对于 \(l\) 所在块和下一个块的贡献,只需要将 \(l-1\) 设成负无穷就可以直接查询 \(l\) 所在块和下一个块的贡献了,\(r\) 同理。这样时间复杂度是大常数 \(O(n\log n)\),过不去 Ynoi 加强版。

点击查看代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<numeric>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<stack>
#include<bitset>
#include<set>
#include<array>
#include<tuple>
#include<ctime>
#include<random>
#include<cassert>
#include<chrono>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#define j0 jj0
#define j1 jj1
#define y0 yy0
#define y1 yy1
#define IOS ios::sync_with_stdio(false)
#define ITIE cin.tie(0)
#define OTIE cout.tie(0)
#define PY puts("Yes")
#define PN puts("No")
#define PW puts("-1")
#define P0 puts("0")
#define P__ puts("")
#define PU puts("--------------------")
#define mp make_pair
#define fi first
#define se second
#define gc getchar
#define pc putchar
#define pb emplace_back
#define un using namespace
#define il inline
#define all(x) x.begin(),x.end()
#define mem(x,y) memset(x,y,sizeof x)
#define popc __builtin_popcountll
#define rep(a,b,c) for(int a=(b);a<=(c);++a)
#define per(a,b,c) for(int a=(b);a>=(c);--a)
#define reprange(a,b,c,d) for(int a=(b);a<=(c);a+=(d))
#define perrange(a,b,c,d) for(int a=(b);a>=(c);a-=(d))
#define graph(i,j,k,l) for(int i=k[j];i;i=l[i].nxt)
#define lowbit(x) ((x)&-(x))
#define lson(x) ((x)<<1)
#define rson(x) ((x)<<1|1)
//#define double long double
//#define int long long
//#define int __int128
using namespace std;
using namespace __gnu_pbds;
using i64=long long;
using u64=unsigned long long;
using pii=pair<int,int>;
template<typename T1,typename T2>inline bool ckmx(T1 &qwqx,T2 qwqy){return qwqx>=qwqy?0:(qwqx=qwqy,1);}
template<typename T1,typename T2>inline bool ckmn(T1 &qwqx,T2 qwqy){return qwqx<=qwqy?0:(qwqx=qwqy,1);}
inline auto rd(){int qwqx=0,qwqf=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')qwqf=-1;ch=getchar();}while(ch>='0'&&ch<='9'){qwqx=(qwqx<<1)+(qwqx<<3)+ch-48;ch=getchar();}return qwqx*qwqf;
}
template<typename T>inline void write(T qwqx,char ch='\n'){if(qwqx<0){qwqx=-qwqx;putchar('-');}int qwqy=0;static char qwqz[40];while(qwqx||!qwqy){qwqz[qwqy++]=qwqx%10+48;qwqx/=10;}while(qwqy--){putchar(qwqz[qwqy]);}if(ch)putchar(ch);
}
bool Mbg;
const int mod=998244353;
template<typename T1,typename T2>inline void adder(T1 &x,T2 y){x+=y,x=x>=mod?x-mod:x;}
template<typename T1,typename T2>inline void suber(T1 &x,T2 y){x-=y,x=x<0?x+mod:x;}
const int maxn=4e5+5,inf=0x3f3f3f3f;
const long long llinf=0x3f3f3f3f3f3f3f3f;
int n,m,Q,k;
i64 a[maxn];
struct node1{i64 premx,secmx,ans,sum;
};
node1 operator+(node1 x,node1 y){node1 res;res.sum=x.sum+y.sum,res.premx=max(x.premx,x.sum+y.premx),res.secmx=max(y.secmx,y.sum+x.secmx);res.ans=max({x.ans,y.ans,x.secmx+y.premx});return res;
}
#define mid ((l+r)>>1)
il int Lft(int x){return (x-1)*k+1;}
il int Rht(int x){return x*k;}
il int Bel(int x){return (x-1)/k+1;}
struct naive_sgt{node1 d[maxn<<2];il void pu(int p){d[p]=d[lson(p)]+d[rson(p)];}void bd(int l=1,int r=n,int p=1){if(l==r)return d[p].sum=a[l],d[p].premx=d[p].secmx=d[p].ans=max(0ll,a[l]),void();bd(l,mid,lson(p)),bd(mid+1,r,rson(p));pu(p);}void mdf(int x,i64 v,int l=1,int r=n,int p=1){if(l==r)return d[p].sum=v,d[p].premx=d[p].secmx=d[p].ans=max(0ll,v),void();x<=mid?mdf(x,v,l,mid,lson(p)):mdf(x,v,mid+1,r,rson(p));pu(p);}node1 qry(int ll,int rr,int l=1,int r=n,int p=1){if(ll<=l&&r<=rr)return d[p];if(rr<=mid)return qry(ll,rr,l,mid,lson(p));if(ll>mid)return qry(ll,rr,mid+1,r,rson(p));return qry(ll,rr,l,mid,lson(p))+qry(ll,rr,mid+1,r,rson(p));}
} t1;
//a是本块后缀和 b是下一块前缀和 
struct node2{i64 ans,amx,bmx,asum,bsum;
};
node2 operator+(node2 x,node2 y){node2 res;res.ans=max({x.ans+y.asum,y.ans+x.bsum,x.bmx+y.amx}),res.asum=x.asum+y.asum,res.bsum=x.bsum+y.bsum;res.amx=max(y.amx,y.asum+x.amx),res.bmx=max(x.bmx,x.bsum+y.bmx);return res;
}
struct hard_sgt{node2 d[maxn<<2];il void pu(int p){d[p]=d[lson(p)]+d[rson(p)];}void bd(int l=1,int r=n-k,int p=1){if(l==r)return d[p].amx=d[p].asum=a[l],d[p].bmx=d[p].bsum=a[l+k],d[p].ans=-llinf,void();bd(l,mid,lson(p)),bd(mid+1,r,rson(p));pu(p);}void mdfa(int x,i64 v,int l=1,int r=n-k,int p=1){if(l==r)return d[p].amx=d[p].asum=v,void();x<=mid?mdfa(x,v,l,mid,lson(p)):mdfa(x,v,mid+1,r,rson(p));pu(p);}void mdfb(int x,i64 v,int l=1,int r=n-k,int p=1){if(l==r)return d[p].bmx=d[p].bsum=v,void();x<=mid?mdfb(x,v,l,mid,lson(p)):mdfb(x,v,mid+1,r,rson(p));pu(p);}node2 qry(int ll,int rr,int l=1,int r=n-k,int p=1){if(ll<=l&&r<=rr)return d[p];if(rr<=mid)return qry(ll,rr,l,mid,lson(p));if(ll>mid)return qry(ll,rr,mid+1,r,rson(p));return qry(ll,rr,l,mid,lson(p))+qry(ll,rr,mid+1,r,rson(p));}
} t2;
struct rmq_sgt{//0 块内贡献 1 块间贡献 i64 d[2][maxn<<2];il void pu(int p){rep(i,0,1)d[i][p]=max(d[i][lson(p)],d[i][rson(p)]);}void bd(int l=1,int r=m-1,int p=1){if(l==r)return d[0][p]=t1.qry(Lft(l),Rht(l)).ans,d[1][p]=t2.qry(Lft(l),Rht(l)).ans,void();bd(l,mid,lson(p)),bd(mid+1,r,rson(p));pu(p);}void mdf(int x,int l=1,int r=m-1,int p=1){if(l==r)return d[0][p]=t1.qry(Lft(l),Rht(l)).ans,d[1][p]=t2.qry(Lft(l),Rht(l)).ans,void();x<=mid?mdf(x,l,mid,lson(p)):mdf(x,mid+1,r,rson(p));pu(p);}i64 qry(int o,int ll,int rr,int l=1,int r=m-1,int p=1){if(rr<l||r<ll||ll>rr)return -llinf;if(ll<=l&&r<=rr)return d[o][p];return max(qry(o,ll,rr,l,mid,lson(p)),qry(o,ll,rr,mid+1,r,rson(p)));}
} t3;
#undef mid
void mdf(int x,i64 y){if(x<1||x>n)return;if(x<=n-k)t2.mdfa(x,y),t3.mdf(Bel(x));if(x>k)t2.mdfb(x-k,y),t3.mdf(Bel(x)-1);
}
inline void solve_the_problem(){n=rd(),Q=rd(),k=rd();rep(i,1,n)a[i]=rd();while(n%k)++n;m=n/k;t1.bd();if(n>k)t2.bd(),t3.bd();
//	node2 res=t2.qry(1,3);
//	write(res.ans,32),write(res.amx,32),write(res.asum,32),write(res.bmx,32),write(res.bsum);while(Q--){int op=rd(),l=rd(),r=rd();if(op==1){a[l]=r;t1.mdf(l,r);if(n>k)mdf(l,r);}else{if(r-l+1<=k){write(t1.qry(l,r).ans);continue;}mdf(l-1,-llinf),mdf(r+1,-llinf);i64 ans=max(t3.qry(0,Bel(l)+1,Bel(r)-1),t3.qry(1,Bel(l),Bel(r)-1));ckmx(ans,max(t1.qry(l,Rht(Bel(l))).ans,t1.qry(Lft(Bel(r)),r).ans));write(ans);mdf(l-1,a[l-1]),mdf(r+1,a[r+1]);}}
}
bool Med;
signed main(){
//	freopen(".in","r",stdin);freopen(".out","w",stdout);fprintf(stderr,"%.3lfMB\n",(&Mbg-&Med)/1048576.0);int _=1;while(_--)solve_the_problem();
}
/*
5 1 3
0 5 -3 8 -3
2 1 5
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF1916G Optimizations From Chelsu

神仙题,神仙做法。点分治,假设路径的端点是 \(s\) 和 \(t\),那么 \(len\times g\) 就是 \((d_s+d_t)\times \gcd(v_s,v_t)\),其中 \(d\) 是到根链长度,\(v\) 是到根的 \(\gcd\)。 不妨设 \(d_s\ge d_t\),那么 \(…

详细介绍:微服务架构:基于Spring Cloud ,构建同城生活服务平台

详细介绍:微服务架构:基于Spring Cloud ,构建同城生活服务平台pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

【游记】北京师范大学讲课

【游记】北京师范大学讲课好久没有写长文了,今天很有兴致,写一篇罢! ccpc 网络赛前一天 去北京参加 tower research 举办的宣讲会。结束后和 yzf 找芈重山吃,海淀桥店人满为患,于是跑到了五道口,发现也是人满为患…

做网站 带宽 多少钱厦门国外网站建设公司哪家好

一、按键无效现象1.操作人员对机床操作时画面无反应现象M80/M800系列系统在使用键盘或触摸屏输入时&#xff0c;请勿连击键盘按键&#xff0c;输入一 次即可。键盘每向NC输入一次&#xff0c;NC系统需要计算一次&#xff0c;连续的多次重复输入&#xff0c;NC多次重复计算、显示…

网站建设步骤与时间表个人定做衣服店

提示:本文是我cuda教程部分代码和内容构成,严禁侵权! 文章目录 前言一、核函数index寻找1、3d grid与1d block索引2、1d grid, 2d block索引二、kernel函数实例三、性能优化(内存)四、原子操作五、流stream六、cuda处理nms编码七、cuda处理yolo算法输出编码八、cuda处理yolo…

房产交易网站开发三网合一网站源码下载

本系列第三篇文章&#xff0c;一起了解下PSR规范中的PSR4和PSR0规范首先恭喜大家&#xff0c;包括我自己&#xff0c;坚持到了现在。这篇文章之后&#xff0c;Composer的基础原理就清晰明了咯。也就是说&#xff0c;Composer所利用的正是spl_autoload_register()和PSR4规范&…

青浦网站制作su35湘潭做网站 i磐石网络

9.1 类(class)面向对象最重要的概念就是类(Class)和实例(Instance)&#xff0c;类是抽象的模板以Student类为例&#xff0c;在Python中&#xff0c;定义类是通过class关键字class后面紧接着是类名&#xff0c;即Student&#xff0c;类名通常是大写开头的单词&#xff0c;紧接着…

ARM芯片架构之DAP:AXI-AP 技术详解 - 实践

ARM芯片架构之DAP:AXI-AP 技术详解 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

备案中的网站名称重庆百度搜索排名优化

Python实战&#xff1a;打造自定义随机验证码生成器 在许多网站中&#xff0c;验证码作为一种安全机制被广泛采用&#xff0c;用于验证用户身份、防止自动化攻击和确保数据安全。本篇教程将带领您一步步使用Python创建一个功能齐全的随机验证码生成器。我们将通过导入必要的库…

详细介绍:代码世界的“数字刑侦”:深入解析代码审计实战

详细介绍:代码世界的“数字刑侦”:深入解析代码审计实战pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

三霍尔BLDC如何测量Hall同步角度(需要示波器)

现在电机转子位置估计的研究有两种主流技术路线——一种是无传感器,另一种就是采用低分辨率传感器估计高精度位置。当时我(知乎:土豆泥)本科毕业答辩做的就是霍尔传感器。其实可以看到,近几年业界越来越多的FOC驱…

完整教程:K8s学习笔记(十) Deployment 副本控制器

完整教程:K8s学习笔记(十) Deployment 副本控制器pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

湖南建设信息网站做手机版网站和做app差别

接口测试虽然作为版本的一环&#xff0c;但是也是有一套完整的体系&#xff0c;有接口的功能测试、性能测试、安全测试&#xff1b;同时&#xff0c;由于接口的特性&#xff0c;接口的自动化低成本高收益的&#xff0c;使用一些开源工具或一些轻量级的方法&#xff0c;在测试用…

QBXT2025S刷题 Day2

今天的题目 \(rk38\) T1 这道题想了 \(1h\) 差不多。 这道题其实可以直接转化成选一个点,把覆盖着这个点线段全部删掉,使得左右两边都有线段。 可以维护每个点被多少个区间覆盖,左面有多少个区间,右面有多少个区间…

个人主页网址

https://www.cnblogs.com/gutianle

建设项目环境影响评价公示网站wordpress添加干扰代码

数据可视化是将复杂数据转化为易于理解的图表和图形的过程&#xff0c;帮助我们发现趋势、关联和模式。同时数据可视化也是数字孪生的基础&#xff0c;本文小编带大家用最简单的话语为大家讲解怎么制作一个数据可视化大屏&#xff0c;接下来跟随小编的思路走起来~ 1.数据收集和…

离型剂技术支持东莞网站建设php 移动网站开发

1025. 反转链表 (25) 时间限制300 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue给定一个常数K以及一个单链表L&#xff0c;请编写程序将L中每K个结点反转。例如&#xff1a;给定L为1→2→3→4→5→6&#xff0c;K为3&#xff0c;则输出应该为3→2→1→6…

甘肃省工程建设信息官方网站宣传片拍摄构思

伺服放大器功能提升 伺服放大器MELSERVO-JET系列为进一步优化了独家控制引擎的高性能伺服放大器。 可通过与支持CC-LinK IE TSN的运动控制器的同步通信,进行高 速、高精度的运动控制。 除了旋转型伺服电机以外,还支持线性伺服电机。MR-JET-G-N1支持EtherCAT。 旋转型伺服电机 …

Vue之刷新页面会触发的生命周期函数

刷新页面时不会触发组件的 onUnmount 事件。 因为刷新页面会直接销毁整个页面的 DOM 树和内存中的组件实例,属于“强制清空”,而非组件正常从 DOM 树中卸载的流程。 而 onUnmount 的核心是“组件正常卸载(如路由切换…