正题

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


题目大意

给出\(n\)个数字的一个序列,\(m\)个操作。

  1. 给出\(l,r,k\),求一个最大的\(x\)使得\(\sum_{i=l}^rmax\{a_i-x,0\}\geq k\)
  2. 单点修改

解题思路

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

这样修改是\(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-速度即转发【带修莫队,分块】的更多相关文章

  1. bzoj4129 Haruna’s Breakfast 树上带修莫队+分块

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4129 题解 考虑没有修改的序列上的版本应该怎么做: 弱化的题目应该是这样的: 给定一个序列,每 ...

  2. 【BZOJ-3052】糖果公园 树上带修莫队算法

    3052: [wc2013]糖果公园 Time Limit: 200 Sec  Memory Limit: 512 MBSubmit: 883  Solved: 419[Submit][Status] ...

  3. 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】

    题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...

  4. BZOJ2120 数颜色 莫队 带修莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html 题目传送门 - BZOJ2120 题意 给定一个长度为 $n$ 的序列 $a$ ,有 ...

  5. BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...

  6. UVA 12345 Dynamic len(带修莫队)

    Dynamic len [题目链接]Dynamic len [题目类型]带修莫队 &题解: 莫队可以单点更改,只要再多加一维,代表查询次数,排序的时候3个关键字. 之后循环离线的时候,先暴力时 ...

  7. bzoj 2120 数颜色 (带修莫队)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间  l - r  内颜色的种类 ,R 单点修改 思路 ...

  8. BZOJ 4129 Haruna’s Breakfast (分块 + 带修莫队)

    4129: Haruna’s Breakfast Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 835  Solved: 409[Submit][St ...

  9. BZOJ 2120 数颜色 (带修莫队)

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 6367  Solved: 2537[Submit][Status][Discuss] ...

随机推荐

  1. SpringBoot-400-Bad-Request(Request-header-is-too-large)

    错误 Request header is too large 分析 请求头内容过大 解决方案 1.SpringBoot版本1.3.8.RELEASE在配置文件中添加: 如果springboot内置to ...

  2. 【mysql】explain性能分析

    1. explain的概念 使用EXPLAIN 关键字可以模拟优化器执行SQL 查询语句,从而知道MySQL 是如何处理你的SQL 语句的.分析你的查询语句或是表结构的性能瓶颈. 用法: Explai ...

  3. qt 定义插件

    定义的接口----------------------------------------------#ifndef REGEXPINTERFACE_H #define REGEXPINTERFACE ...

  4. 再也不用担心了,微软官方系统(win10为例)U盘安装教程

    参考文章地址 使用微软官方工具安装纯净版操作系统. 一.准备工作 检查电脑规格是否支持安装(主要看看系统配置是否满足系统运行的最低要求) 一台联网电脑(不一定非是要装系统的那台): 一个≥8G 空间的 ...

  5. python十行代码实现文件去重,去除重复文件的脚本

    导入依赖 '''导入依赖''' from pathlib import Path import filecmp 函数说明 ''' filecmp.cmp(path1, path2, shallow=T ...

  6. RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列

    系列文章: RabbitMQ从零到集群高可用(.NetCore5.0) - RabbitMQ简介和六种工作模式详解 RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列 ...

  7. 用vue的抽象组件来做一个防止img标签url为空或url地址出错的验证

    看了网上文章学习了下vue的抽象组件,感觉就跟react的高阶组件一样的使用场景,只是更加面向vue的底层编程 ,网上介绍的抽象组件一般有2种用法,1 用来加防抖和节流 2 用来控制按钮是否允许点击做 ...

  8. 第一章 Net 5.0 快速开发框架 YC.Boilerplate--框架介绍

    YC.Boilerplate 框架介绍 YC.Boilerplate 是一套快速开发框架,采用当下流行的前后端分离开发模式,前端 采用VUE.后端采用Net 5.0:框架实现了 多租户.动态webAp ...

  9. mycat《对应关系》

  10. SpringSecurity入门

    基础 spring security的底层就是一个过滤器链 ExceptionTranslationFilter是一个异常过滤器,用来处理认证授权过程中的异常 UseranmePasswordAuth ...