当前位置: 首页 > news >正文

2023牛客暑期多校训练营8-C Clamped Sequence II

2023牛客暑期多校训练营8-C Clamped Sequence II

https://ac.nowcoder.com/acm/contest/57362/C

文章目录

  • 2023牛客暑期多校训练营8-C Clamped Sequence II
    • 题意
    • 解题思路
    • 代码

题意

在这里插入图片描述

解题思路

先考虑不加紧密度的情况,要支持单点修改,整体查询,可以用值域线段树来求。设 t r e e [ x ] . n u m tree[x].num tree[x].num表示数值在 [ l , r ] [l,r] [l,r]区间的数的个数, t r e e [ x ] . s u m tree[x].sum tree[x].sum表示数值在 [ l , r ] [l,r] [l,r]区间的数的总和, t r e e [ x ] . a n s tree[x].ans tree[x].ans表示数值在 [ l , r ] [l,r] [l,r]区间的数的紧密度,结合下图,可以求得转移式:
在这里插入图片描述
n u m x = n u m l s o n + n u m r s o n s u m x = n u m l s o n + s u m r s o n a n s x = a n s l s o n + a n s r s o n + s u m r s o n × n u m l s o n − s u m l s o n × n u m r s o n num_x=num_{lson}+num_{rson}\\ sum_x=num_{lson}+sum_{rson}\\ ans_x=ans_{lson}+ans_{rson}+sum_{rson}\times num_{lson}-sum_{lson}\times num_{rson} numx=numlson+numrsonsumx=numlson+sumrsonansx=anslson+ansrson+sumrson×numlsonsumlson×numrson
此时我们加入紧凑的设定,对于每一对确定的 [ l , r ] [l,r] [l,r]我们都可以算出此时的答案:
a n s w e r = a n s l , r + s u m [ l , r ] × ( n u m [ 1 , l − 1 ] − n u m [ r + 1 , n ] ) + ( n u m [ 1 , l − 1 ] + n u m [ l , r ] ) × n u m [ r + 1 , n ] − ( n u m [ r + 1 , n ] + n u m [ l , r ] ) × n u m [ 1 , l − 1 ] answer=ans_{l,r}+sum_{[l,r]}\times(num_{[1,l-1]}-num_{[r+1,n]})+(num_{[1,l-1]}+num_{[l,r]})\\ \times num_{[r+1,n]}-(num_{[r+1,n]}+num_{[l,r]})\times num_{[1,l-1]} answer=ansl,r+sum[l,r]×(num[1,l1]num[r+1,n])+(num[1,l1]+num[l,r])×num[r+1,n](num[r+1,n]+num[l,r])×num[1,l1]
根据出题人所说,该答案是严格单峰的,所以可以用三分求解,但经过我实践却不太像,需要将三分的范围约束在最中间的数 ± d \pm d ±d再加上左右游移 2 ∼ 3 2\sim 3 23个数,大致能求出正确答案。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5,M=1e6+5;
ll n,a[N],b[M],q;
struct node{ll num,l,r;ll sum,ans;node operator +(const node a){node t;t.num=num+a.num,t.sum=sum+a.sum;t.ans=num*a.sum-sum*a.num+ans+a.ans;t.l=l,t.r=a.r;return t;}
};
struct tree{node tr[M<<2];void build(int res,int l,int r){tr[res].l=l,tr[res].r=r;if(l==r){tr[res].num=b[l],tr[res].sum=b[l]*l;return;}int mid=l+r>>1;build(res<<1,l,mid);build(res<<1|1,mid+1,r);tr[res]=tr[res<<1]+tr[res<<1|1];}void add(int res,int x,ll d){int l=tr[res].l,r=tr[res].r;if(l==r&&l==x){tr[res].sum+=d*l;tr[res].num+=d;return;}int mid=l+r>>1;if(x<=mid)add(res<<1,x,d);else add(res<<1|1,x,d);tr[res]=tr[res<<1]+tr[res<<1|1];return;}node query(int res,int x,int y){if(x>y)return node{0,0,0,0,0};int l=tr[res].l,r=tr[res].r;if(x<=l&&y>=r){return tr[res];}int mid=l+r>>1;if(y<=mid)return query(res<<1,x,y);if(x>mid)return query(res<<1|1,x,y);return query(res<<1,x,y)+query(res<<1|1,x,y);}int kth(int id,int l,int r,int k){if(l==r) return l;int mid=l+r>>1;if(tr[id<<1].num>=k) return kth(id<<1,l,mid,k);else return kth(id<<1|1,mid+1,r,k-tr[id<<1].num);}
}t;
ll f(int l,int d){int r=l+d;node p=t.query(1,l,r);ll num1=p.num,ans1=p.ans,sum1=p.sum;ll numl=t.query(1,1,l-1).num,numr=t.query(1,r+1,M-1).num;return ans1-numl*(numr+num1)*l+numr*(numl+num1)*r+sum1*(numl-numr);
}
ll work(int d){int k=t.kth(1,1,M-1,n+1>>1);int l=max(1,k-d),r=min(M-1,k+d);ll ma=0;while(l+2<=r){int mi1=(r-l)/3+l,mi2=r-(r-l)/3;ll ma1=f(mi1,d),ma2=f(mi2,d);ma=max(ma,max(ma1,ma2));if(ma1>=ma2)r=mi2-1;else l=mi1+1;}for(int i=l;i<=r;i++)ma=max(ma,f(i,d));return ma;
}
int main(){ios::sync_with_stdio(false);cin>>n>>q;for(int i=1;i<=n;i++)cin>>a[i],b[a[i]]++;t.build(1,1,M-1);while(q--){int op;cin>>op;if(op==1){int x,d;cin>>x>>d;t.add(1,a[x],-1);t.add(1,d,1);a[x]=d;}else{int d;cin>>d;cout<<work(d)<<'\n';}}
}
http://www.lryc.cn/news/127284.html

相关文章:

  • 【GitLab私有仓库】如何在Linux上用Gitlab搭建自己的私有库并配置cpolar内网穿透?
  • 企业计算机服务器遭到了locked勒索病毒攻击如何解决,勒索病毒解密
  • Redis哨兵模式搭建
  • 大语言模型控制生成的过程Trick:自定义LogitsProcessor实践
  • Docker容器:docker的资源控制及docker数据管理
  • 从零开始打造家装预约咨询小程序
  • es线上处理命令记录
  • mysql 在nodejs中的简单使用(增删改查)
  • 1.MySQL数据库的基本操作
  • Zabbix-6.4.4 邮箱告警SMS告警配置
  • 网络安全 Day30-运维安全项目-容器架构上
  • 深入理解设计模式-创建型之单例模式
  • Vue中路由缓存问题及解决方法
  • Linux与bash(基础内容一)
  • NVIDIA Omniverse与GPT-4结合生成3D内容
  • Windows Server --- RDP远程桌面服务器激活和RD授权
  • 关于游戏盾
  • 回归预测 | MATLAB实现基于SSA-KELM-Adaboost麻雀算法优化核极限学习机结合AdaBoost多输入单输出回归预测
  • 《cpolar内网穿透》外网SSH远程连接linux(CentOS)服务器
  • IDEA启动报错【java.sql.SQLSyntaxErrorException: ORA-00904: “P“.“PRJ_NO“: 标识符无效】
  • Nginx详解
  • 摸清一下mysql授权语句的实际执行关系
  • sCrypt于8月12日在上海亮相BSV数字未来论坛
  • Hbase的列式存储到底是什么意思?一篇文章让你彻底明白
  • 机器学习|Softmax 回归的数学理解及代码解析
  • EmbedPress Pro 在WordPress网站中嵌入任何内容
  • 【C++学习手札】一文带你初识C++继承
  • 【ubuntu18.04】01-network-manager-all.yaml和interfaces和resolv.conf各有什么区别和联系
  • 24近3年内蒙古大学自动化考研院校分析
  • 大语言模型(LLM)与 Jupyter 连接起来了