正题

题目链接:https://ac.nowcoder.com/acm/contest/11161/E


题目大意

给出nnn个数字的一个序列,mmm个操作。

  1. 给出l,r,kl,r,kl,r,k,求一个最大的xxx使得∑i=lrmax{ai−x,0}≥k\sum_{i=l}^rmax\{a_i-x,0\}\geq k∑i=lr​max{ai​−x,0}≥k
  2. 单点修改

解题思路

带修的比较麻烦,用带修莫队的话需要平衡一下时间复杂度,可以用分块来做。

这样修改是O(1)O(1)O(1)的,但是询问的话朴素的想法是二分然后统计,这个O(mnlog⁡n)O(m\sqrt n\log n)O(mn​logn)显然是过不了的。

但是如果改为一个个块从后往前跳确定答案在哪个块,然后在块里枚举就好了。

时间复杂度O(mn23+mnlog⁡n)O(mn^{\frac{2}{3}}+m\sqrt n\log n)O(mn32​+mn​logn)


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-速度即转发【带修莫队,分块】相关推荐

  1. 牛客练习赛85 数学家的迷题 (带修莫队/线段树)

    题意: 1:将a[id]a[id]a[id]的值改为xxx. 2:令t=a[l]×a[l+1]×...×a[r−1]×a[r]t=a[l]×a[l+1]×...×a[r−1]×a[r]t=a[l]×a ...

  2. 莫队+带修莫队模板与总结

    以下总结参考了许多大佬们的博客,开篇先(大佬)% 莫队的入门题目主要为莫队和带修莫队在,这里就先在这里总结一下这两类题目的一些属性. 我认为莫队本质是一种比较优化的暴力查找法.在通过分块操作后把复杂度 ...

  3. HDU - 6610 Game(带修莫队)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列 a,sum 为数列 a 的前缀异或和,再给出 m 次操作,每次操作分为两种类型: 1 l r:询问 sum 在区间 [ l , r ] 内有多 ...

  4. 莫队算法(普通莫队、带修莫队、树上莫队、不删除莫队)学习笔记【理解+套路/核心代码+例题及题解】

    一.理解 我的理解就是巧妙的暴力,利用双指针以及分块思想,巧妙的移动双指针,时间复杂度可以达到O(NlogN). 强推博客:写的又好又全.链接 二.套路 1.普通莫队 [1]核心代码 bool cmp ...

  5. 莫队和带修莫队 学习笔记

    哎,很纠结,我刚学这个东西,感觉好像本身自己理解得就不深刻,所以好像不知道该怎么写这个学习笔记了,估计是我思路最凌乱,语言最没逻辑的一篇学习笔记吧.(如果看到这儿觉得作者会坑就关掉吧..) 好,我来尝 ...

  6. 莫队算法学习笔记(二)——带修莫队

    前言:什么是莫队 莫队算法,是一个十分优雅的暴力. 普通的莫队可以轻松解决一些离线问题,但是,当遇上了一些有修改操作的问题,普通莫队就无能为力了. 于是,改进后的莫队--带修莫队就这样产生了. L i ...

  7. [国家集训队]数颜色 / 维护队列 (带修莫队模板题)

    题意: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. ...

  8. LG P4074 [WC2013] 糖果公园(带修莫队,树上莫队)

    LG P4074 [WC2013] 糖果公园 Solution 树上带修莫队,主要还是复习带修莫队和树上莫队. 带修莫队: 带修莫队要先对lll分块的序号作为第一关键字,对rrr分块的序号作为第二关键 ...

  9. 分治 —— 莫队算法 —— 带修莫队

    [概述] 普通莫队由于强制离线是不能修改的,但对于强制在线的题,可以在普通莫队的基础上强行加上一维时间轴 time,表示这次操作的时间,即在每个询问前已经完成了多少次修改. 简单来说,就是将询问 [l ...

最新文章

  1. 清除linux缓存命令
  2. java_spring_依赖注入(构造器)
  3. avalon框架,简单的MVVM
  4. mysql 备份 php_PHP备份/还原MySQL数据库的代码
  5. 老弟做了个网盘,炸了!
  6. CALayer3-层的属性
  7. ElasticSearch多字段查询best_fieldsmost_fields
  8. GCD之barrier
  9. Ubuntu14.04下配置固定IP
  10. 【转】Senior Data Structure · 浅谈线段树(Segment Tree)
  11. 【转】使用频率最高的美语口语296句
  12. Super超图,GIS软件
  13. dcrs 端口配ip_DCRS-5950配置(划分VLAN,根据每个VLAN通过DHCP分配IP地址)
  14. 安卓手机优化,修改build.prop
  15. 制作一个谷歌浏览器插件,实现网页数据爬虫
  16. 页面驱动开发(Page Driven) —— 一种大多数人还不认同的技术
  17. 【Unity开发小技巧】模型单指旋转双指缩放功能代码(多种情况)
  18. Win11 22H2怎么退回之前版本?Win11回滚Win10系统教程(三种方法)
  19. 一步步拆解 LeakCanary
  20. abap al设置单元格可编辑 oo_REUSE_ALV_GRID_DISPLAY_LVC-可编辑单元格

热门文章

  1. python作业题目用户输入行数、输出倒的等腰三角形_智慧职教云课堂APPPython程序设计(常州工业职业技术学院)作业期末考试答案...
  2. linux 内核 三天吐血,编译安装——吐血经验,内附脚本
  3. php语言难点,PHP知识难点TOP3,挑战一下你
  4. 高德面试官问我:JVM内存溢出后服务还能运行吗,我一顿操作行云流水
  5. cocoscreator editbox 只允许数字_《Cocos Creator游戏实战》做一个数字调节框
  6. pygame里面物体闪烁运动_Pygame-游戏中的运动
  7. 计算机语言学考研科目,语言学考研笔记整理(共16页)
  8. 求关系模式r的所有候选码_2_1关系数据库的基本概念
  9. C++ 学习之旅(6)——循环loop
  10. 手把手教你剖析vue响应式原理,监听数据不再迷茫