正题

题目链接: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. Linux中的静态库与动态库

    什么是库文件? 库文件是事先编译好的方法的合集.比如:我们提前写好一些数据公式的实现,将其打包成库文件,以后使用只需要库文件就可以,不需要重新编写. Linux系统中: 1.静态库的扩展名为.a:2. ...

  2. FLV简介

    FLV (Flash Video) 是由 Adobe 公司推出的一种封装格式,主要用于流媒体系统. FLV 封装的媒体文件具有体积轻巧.封装播放简单等特点,很适合网络应用. 目前各浏览器普遍使用 Fl ...

  3. HDFS Shell基本操作

    1.目录操作 hdfs dfs [命令]  [命令]         等价于            hadoop fs []  [] 1  ./bin/hdfs dfs -mkdir -p /user ...

  4. 梯度下降做做优化(batch gd、sgd、adagrad )

    首先说明公式的写法 上标代表了一个样本,下标代表了一个维度: 然后梯度的维度是和定义域的维度是一样的大小: 1.batch gradient descent: 假设样本个数是m个,目标函数就是J(th ...

  5. java 捕获组与非捕获组

    非捕获组:格式:(?:xxxx), 如:(?:aaa)\\w+(bbb)\\1,\\1 代表重复捕获的第一组即是(bbb) public static void main(String[] args) ...

  6. jQuery中的文档操作处理(五):append()、prepend()、after()、before()、wrap()、wrapAll()、wrapInner()、clone()等

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  7. Linux命令集锦之·正则表达式

    时间:2018-11-15 记录:byzqy 正则表达式与通配符: 正则表达式,用来在文件中匹配符合条件的字符串,正则是包含匹配. grep.awk.sed 等命令可以支持正则表达式. 通配符,用来匹 ...

  8. 关于Cloudfront能否接入NLB的讨论

    之前讨论过四层应用 是无法通过七层负载负载均衡器转发流量的,因为ALB监听的是Http/s协议,TCP/UDP的请求到了ALB无法识别,ALB在第七层做判断,数据包只有四层,会无法判断转发的目标.相反 ...

  9. Linux下查看哪个网口插了网线

    场景: 一台服务器有多个网卡,一个网卡有多个网口,当插了一根网线的时候,不知道网线是插在哪一个网口. 1.查看网口信息 2.查看网口是否插了网线(命令ethtool) 命令:ethtool + 网口名 ...

  10. JS_DOM操作之操作标签

    <标签名 属性1="属性值1" 属性2="属性值2"-->文本</标签名> 1 - 文本操作 <div class="c ...