通过打表证明发现答案就是把序列划分成若干段,每段的b都是这一段a的平均数。50分做法比较显然,就是单调栈维护,每次将新元素当成一个区间插入末尾,若b值不满足单调不降,则将这个区间与单调栈前一个区间合并。

由于题目要求每次只修改一个数,所以可以前后缀拼起来,单调栈要改变,然后发现这个显然满足二分的性质,二分完位置左端点后再二分右端点,写一个可持久化单调栈维护一下就可以了。

还有一种主席树做法,后序可能会补上。

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>pii;
typedef long long ll;
const int N=1e5+,mod=;
int n,m,sum,tp1,tp2,a[N],f[N],g[N],inv[N],ans[N],st1[N],st2[N];
ll s[N];
vector<int>G[N];
vector<pii>q[N];
bool cmp(int l,int r,int L,int R,int x,int y)
{return (s[r]-s[l-]+x)*(R-L+)>(s[R]-s[L-]+y)*(r-l+);}
int calc(int l,int r,int x)
{return mod-(s[r]-s[l-]+x)%mod*((s[r]-s[l-]+x)%mod)%mod*inv[r-l+]%mod;}
int main()
{
scanf("%d%d",&n,&m);
inv[]=;for(int i=;i<=n;i++)inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(int i=;i<=n;i++)scanf("%d",&a[i]),s[i]=s[i-]+a[i],sum=(sum+1ll*a[i]*a[i])%mod;
q[].push_back(pii(a[],)),ans[]=sum;
for(int i=,x,y;i<=m;i++)
scanf("%d%d",&x,&y),q[x].push_back(pii(y,i)),ans[i]=(sum+1ll*(mod-a[x])*a[x]+1ll*y*y)%mod;
for(int i=;i<=n;i++)
{
while(tp1&&cmp(st1[tp1-]+,st1[tp1],st1[tp1]+,i,,))G[i].push_back(st1[tp1--]);
st1[++tp1]=i,f[tp1]=(f[tp1-]+calc(st1[tp1-]+,i,))%mod;
}
st2[]=n+;
for(int i=n;i;i--)
{
tp1--;
reverse(G[i].begin(),G[i].end());
for(int j=;j<G[i].size();j++)
st1[++tp1]=G[i][j],f[tp1]=(f[tp1-]+calc(st1[tp1-]+,G[i][j],))%mod;
if(i<n)
{
while(tp2&&cmp(i+,st2[tp2]-,st2[tp2],st2[tp2-]-,,))tp2--;
st2[++tp2]=i+,g[tp2]=(g[tp2-]+calc(i+,st2[tp2-]-,))%mod;
}
for(int j=;j<q[i].size();j++)
{
int x=q[i][j].first,y=q[i][j].second,l=,r=tp1,mid,now=,d=x-a[i];
while(l<=r)
{
mid=l+r>>;
if(cmp(st1[mid-]+,st1[mid],st1[mid]+,i,,d))r=mid-;
else l=mid+,now=mid;
}
if(!tp2||!cmp(st1[now]+,i,i+,st2[tp2-]-,d,))
ans[y]=(1ll*ans[y]+calc(st1[now]+,i,d)+f[now]+g[tp2])%mod;
else{
l=,r=tp2-;
int ret=,cur=;
while(l<=r)
{
mid=l+r>>;
int L=,R=now,Mid,pos=;
while(L<=R)
{
Mid=L+R>>;
if(cmp(st1[Mid-]+,st1[Mid],st1[Mid]+,st2[mid]-,,d))R=Mid-;
else L=Mid+,pos=Mid;
}
if(mid&&cmp(st1[pos]+,st2[mid]-,st2[mid],st2[mid-]-,d,))r=mid-;
else l=mid+,ret=mid,cur=pos;
}
ans[y]=(1ll*ans[y]+calc(st1[cur]+,st2[ret]-,d)+f[cur]+g[ret])%mod;
}
}
}
for(int i=;i<=m;i++)printf("%d\n",ans[i]);
}

单调栈做法

[HNOI2019]序列(单调栈+二分)的更多相关文章

  1. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  2. bzoj 4709 [Jsoi2011]柠檬——单调栈二分处理决策单调性

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4709 题解:https://blog.csdn.net/neither_nor/articl ...

  3. BZOJ1012最大数 [JSOI2008] 单调栈+二分

    正解:单调栈+二分查找(or,线段树? 解题报告: 拿的洛谷的链接quq 今天尝试学习了下单调栈,然后就看到有个博客安利了这个经典例题?于是就去做了,感觉还是帮助了理解趴quqqqqq 这题,首先,一 ...

  4. 51NOD 1962 区间计数 单调栈+二分 / 线段树+扫描线

     区间计数   基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80   两个数列 {An} , {Bn} ,请求出Ans, Ans定义如下: Ans:=Σni=1Σnj=i[max{ ...

  5. 【bzoj4237】稻草人 分治+单调栈+二分

    题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...

  6. 洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找)

    洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1333275 这个题不是很 ...

  7. 【洛谷5294】[HNOI2019] 序列(主席树维护单调栈+二分)

    点此看题面 大致题意: 给你一个长度为\(n\)的序列\(A\),每次询问修改一个元素(只对当前询问有效),然后让你找到一个不下降序列\(B\),使得这两个序列相应位置之差的平方和最小,并输出这个最小 ...

  8. 【洛谷P1823】音乐会的等待 单调栈+二分

    题目大意:给定一个长度为 N 的序列,定义两个数 \(a[i],a[j]\) 相互看得见,意味着 \(\forall k\in [i+1,j-1],a[k]\le a[i],a[k]\le a[j]\ ...

  9. BZOJ 2122 [分块+单调栈+二分](有详解)

    题面 传送门 给定序列d和lim.假设有一个初始价值\(x_0\),则经历第i天后价值变为\(min(x_0+d[i],lim[i])\),记\(f(i,j,x_0)\)表示以初始代价x0依次经过第i ...

随机推荐

  1. 一天一个设计模式——Adapter适配器模式(Wrapper模式)

    一.模式说明 在现实生活中,当需要将两种设备连接起来,但是两个设备的接口规范又不一致(比如电脑上只有Type-C接口,但是你的显示器是HDMI接口),这时候就需要一个适配器,适配器一端连接电脑,一端连 ...

  2. HDU - 1150 Machine Schedule(二分匹配---最小点覆盖)

    题意:有两台机器A和B,A有n种工作模式(0~n-1),B有m种工作模式(0~m-1),两台机器的初始状态都是在工作模式0处.现在有k(0~k-1)个工作,(i,x,y)表示编号为i的工作可以通过机器 ...

  3. 工程日记之HelloSlide(1):Swift自定义可视化组件的方法(继承UIView和在StoryBoard中设置)

    需求描述 HelloSlide是把文本自动转化成幻灯片的软件,在幻灯片中我们有SmartArt:各种各样的几何形状,并且可以自定义大小和颜色,放在幻灯片不同的位置. 为了在我们的软件中实现类似的效果, ...

  4. EditText制作简单的登录界面

    EditText与之前的TextView和Button的用法大体相同,用法案例如下: activity_edit_text.xml: <?xml version="1.0" ...

  5. 客户主题分析(tableau)—客户分群

    主要分析方面:客户合理分群 客户分群实现:使用聚类构建指标,需理解聚类的分析逻辑,需使用软件:tableau 聚类方法:选择3指标分别为购买总金额,客户购买次数.类平均购买价格(四类的平均购买价格,四 ...

  6. CI项目设计Redis队列

    项目开发过程中需要设计提供可平衡的处理多个用户请求的队列. 需求: 当用户登录后,查看系统中已经登录的管理员队列,然后查看后台管理员的处理能力,如果已经不能处理新的请求,则把该管理员从处理队列中删除, ...

  7. CEO、COO、CFO、CTO、CIO是什么意思/?

    CEO Chief Executive Officer 首席执行官 COO Chief Operating Officer 首席运营官 CFO Chief Financial Officer 首席财务 ...

  8. 单机版solr的搭建

    1.1. Solr的环境 Solr是java开发. 需要安装jdk. 安装环境Linux. 需要安装Tomcat. 1.2. 搭建步骤 第一步:把solr 的压缩包上传到Linux系统 第二步:解压s ...

  9. Filezilla Xshell SecureFX Win10等无法拖放文件(本地或线上)解决办法

    一.win10系统Filezilla Xshell SecureFX等无法拖放文件到线上服务器解决办法: 1.按窗口键+R,打开“运行”对话框:输入regedit回车 2.在注册表编辑器地址栏输入以下 ...

  10. 配置完aop不能返回json

    遇到一个bug,配置了记录controller层的aop,后来发现是因为我aop是写在controller层(在springmvc的容器中)而开启aop配置却写在spring中,所以不起作用,需要在s ...