牛客挑战赛48E-速度即转发【带修莫队,分块】
正题
题目链接:https://ac.nowcoder.com/acm/contest/11161/E
题目大意
给出\(n\)个数字的一个序列,\(m\)个操作。
- 给出\(l,r,k\),求一个最大的\(x\)使得\(\sum_{i=l}^rmax\{a_i-x,0\}\geq k\)
- 单点修改
解题思路
带修的比较麻烦,用带修莫队的话需要平衡一下时间复杂度,可以用分块来做。
这样修改是\(O(1)\)的,但是询问的话朴素的想法是二分然后统计,这个\(O(m\sqrt n\log n)\)显然是过不了的。
但是如果改为一个个块从后往前跳确定答案在哪个块,然后在块里枚举就好了。
时间复杂度\(O(mn^{\frac{2}{3}}+m\sqrt n\log n)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const ll N=1e5+10;
struct node{
ll l,r,k,id,t;
}q[N];
ll n,m,T,Q,a[N],L[N],R[N],pos[N],p[N],c[N];
ll qnt,mnt,s[N],cnt[N],v[N],ans[N];
bool cmp(node x,node y){
if(x.l/T!=y.l/T)return x.l<y.l;
if(x.r/T!=y.r/T)return x.r<y.r;
return x.t<y.t;
}
void Add(ll x,ll f){
s[pos[x]]+=x*f;
cnt[pos[x]]+=f;
v[x]+=f;return;
}
ll Query(ll k){
if(!k)return 100000;
ll pt,sum=0,ct=0;
for(pt=Q;pt>=1;pt--){
sum+=s[pt];ct+=cnt[pt];
if(sum-ct*R[pt-1]>=k)
{sum-=s[pt];ct-=cnt[pt];break;}
}
if(!pt)return -1;
for(ll i=R[pt];i>=L[pt];i--){
sum+=v[i]*i;ct+=v[i];
if(sum-ct*(i-1)>=k)
return i-1;
}
return -1;
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
T=pow(n*m,1.0/3.0);Q=316;
for(ll i=1;i<=Q;i++)
L[i]=R[i-1]+1,R[i]=i*Q;
++Q;L[Q]=R[Q-1]+1;R[Q]=1e5;
for(ll i=1;i<=Q;i++)
for(ll j=L[i];j<=R[i];j++)pos[j]=i;
for(ll i=1;i<=m;i++){
ll op;scanf("%lld",&op);
if(op==0){
++qnt;q[qnt].id=qnt;q[qnt].t=mnt;
scanf("%lld%lld%lld",&q[qnt].l,&q[qnt].r,&q[qnt].k);
}
else ++mnt,scanf("%lld%lld",&p[mnt],&c[mnt]);
}
sort(q+1,q+1+qnt,cmp);
ll l=1,r=0,t=0;
for(ll i=1;i<=qnt;i++){
while(l<q[i].l)Add(a[l],-1),l++;
while(l>q[i].l)l--,Add(a[l],1);
while(r<q[i].r)r++,Add(a[r],1);
while(r>q[i].r)Add(a[r],-1),r--;
while(t<q[i].t){
t++;
if(l<=p[t]&&p[t]<=r)
Add(a[p[t]],-1),Add(c[t],1);
swap(a[p[t]],c[t]);
}
while(t>q[i].t){
swap(a[p[t]],c[t]);
if(l<=p[t]&&p[t]<=r)
Add(a[p[t]],1),Add(c[t],-1);
t--;
}
ans[q[i].id]=Query(q[i].k);
}
for(ll i=1;i<=qnt;i++)
printf("%lld\n",ans[i]);
return 0;
}
牛客挑战赛48E-速度即转发【带修莫队,分块】的更多相关文章
- bzoj4129 Haruna’s Breakfast 树上带修莫队+分块
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4129 题解 考虑没有修改的序列上的版本应该怎么做: 弱化的题目应该是这样的: 给定一个序列,每 ...
- 【BZOJ-3052】糖果公园 树上带修莫队算法
3052: [wc2013]糖果公园 Time Limit: 200 Sec Memory Limit: 512 MBSubmit: 883 Solved: 419[Submit][Status] ...
- 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】
题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...
- BZOJ2120 数颜色 莫队 带修莫队
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html 题目传送门 - BZOJ2120 题意 给定一个长度为 $n$ 的序列 $a$ ,有 ...
- BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...
- UVA 12345 Dynamic len(带修莫队)
Dynamic len [题目链接]Dynamic len [题目类型]带修莫队 &题解: 莫队可以单点更改,只要再多加一维,代表查询次数,排序的时候3个关键字. 之后循环离线的时候,先暴力时 ...
- bzoj 2120 数颜色 (带修莫队)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间 l - r 内颜色的种类 ,R 单点修改 思路 ...
- BZOJ 4129 Haruna’s Breakfast (分块 + 带修莫队)
4129: Haruna’s Breakfast Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 835 Solved: 409[Submit][St ...
- BZOJ 2120 数颜色 (带修莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6367 Solved: 2537[Submit][Status][Discuss] ...
随机推荐
- RHEL 7 “There are no enabled repos” 的解决方法
RHEL 7 "There are no enabled repos" 的解决方法 [root@system1 Desktop]# yum install squidLoaded ...
- 【HMC Core 6.0全球上线】图形计算服务新插件,助力高画质3D手游创新
HMS Core 6.0已于7月15日全球上线,本次新版本向广大开发者开放了众多全新能力与技术.其中华为图形计算服务(CG Kit)开放了体积雾插件和流体插件,为3D手游画面的提升提供了坚实的技术基础 ...
- vim conf文件配色
VIM conf文件配色 一.配置文件 1.下载Nginx配置文件的语法文件:nginx.vim wget http://www.vim.org/scripts/download_script.php ...
- Java中除数为0的情况
转自http://blog.csdn.net/alanzyy/article/details/8591534 在数学中,规定被除数不能为0 那么在Java程序中一旦出现除数为0时,会出现什么情况呢: ...
- 网络流量预测入门(三)之LSTM预测网络流量
目录 网络流量预测入门(三)之LSTM预测网络流量 数据集介绍 预测流程 数据集准备 SVR预测 LSTM 预测 优化点 网络流量预测入门(三)之LSTM预测网络流量 在上篇博客LSTM机器学习生成音 ...
- Python代码阅读(第1篇):列表映射后的平均值
本篇阅读的代码实现了将列表进行映射,并求取映射后的平均值. 本篇阅读的代码片段来自于30-seconds-of-python. average_by def average_by(lst, fn=la ...
- 整理之Service
Service 基础 一个Service的基本结构 class MyService : Service() { private val mBinder = MyBinder() override fu ...
- Cookie在哪里看
更多java学习请进: https://zhangjzm.gitee.io/self_study
- RabbitMQ从零到集群高可用(.NetCore5.0) -高可用集群构建落地
系列文章: RabbitMQ从零到集群高可用(.NetCore5.0) - RabbitMQ简介和六种工作模式详解 RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列 ...
- Mybatis-plus<一> Springboot框架使用MybatisPlus代码自动生成器
Mybatis-plus<一> Springboot框架使用MybatisPlus代码自动生成器 Mybatis-plus官网: https://mp.baomidou.com/ Demo ...