牛客挑战赛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] ...
随机推荐
- 《深入浅出vue.js》阅读笔记之数组变化侦测
1.如何追踪变化 数组的侦测方式和对象不同,比如: this.list.push(1) 此时并不会像改变对象一样触发setter. 同理,要侦测数组的变化意味着我们在改变数组的时候得到通知,如图,我们 ...
- spring4整合hibernate5以及出现的问题解决办法
每一次的学习,都是一小步一小步的进行的,学习语言,重要的是能把hello world写出来 以及在学习过程中出现的问题能够及时的记录并总结 spring目前最新的版本是4.3,而hibernate是5 ...
- 【转】Linux tar命令详解
参考:https://blog.csdn.net/kkw1992/article/details/80000653 linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包 ...
- 1.3RDD的设计与运行原理
此文为个人学习笔记如需系统学习请访问http://dblab.xmu.edu.cn/blog/1709-2/ 提供一种通用的数据抽象 RDD典型的执行过程如下: RDD读入外部数据源(或者内存中的集合 ...
- Java中除数为0的情况
转自http://blog.csdn.net/alanzyy/article/details/8591534 在数学中,规定被除数不能为0 那么在Java程序中一旦出现除数为0时,会出现什么情况呢: ...
- 及上一篇linux安装mysql的说明
mysql8.0安全策略 1 密码规定:数字英文大小写加特殊符号组成(可以不按照规则,详情去百度设置) 2. mysql数据库用户密码字段不再是password 而是authentication_st ...
- Markdown Sublime flowchart.js 流程图
先亮出来一个 flowchart.js 的 Sample 给 Sublime 安装 MarkdownPreview,这个不必多说了 Sublime Text -> Preferences -&g ...
- SpringBoot2.x+mybatis plus3.x集成Activit7版本
最近在写一个开源项目ruoyi-vue-pro,暂时负责Activiti7工作流的搭建,接这个任务一个原因,是比较好奇Activiti7版本与先前的5.6版本究竟有什么区别,因为先前在工作当中,最开始 ...
- JS003. 事件监听和监听滚动条的三种参数( addEventListener( ) )
全局 1 window.addEventListener('scroll', () => { 2 console.log('------') 3 console.log(document.doc ...
- vue 动态ip配置,避免重复打包
目前比较流行的打包大都是在vue.config.js配置代理,然后在根目录新建.env.xxx文件配置正式环境,测试环境,开发环境等用于打包时配置不同的访问地址,作为一名随波逐流的前端开发,我也是这么 ...