牛客挑战赛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] ...
随机推荐
- uwp Button的动态效果
你应该覆盖Button样式 <Page.Resources> <Style TargetType="Button" x:Key="CustomButto ...
- C# Unity容器的使用
最简单的使用方式(记得安装Unity NuGet包呀) Console.WriteLine("***************Unity容器的初步应用***************" ...
- WPF---控件模板(一)
一.控件模板概述 控件的外观通过一个ControlTemplate类型的对象确定,该对象指定了组成一个控件的显示的各种视觉元素. 当WPF创建一个控件时,会创建一个控件类(模板父)的实例,然后实例化通 ...
- 彻底搞懂volatile关键字
对于volatile这个关键字,相信很多朋友都听说过,甚至使用过,这个关键字虽然字面上理解起来比较简单,但是要用好起来却不是一件容易的事.这篇文章将从多个方面来讲解volatile,让你对它更加理解. ...
- Inject-APC (Ring3)
1 // APCInject.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include "APCInjec ...
- spring初始化源码浅析之关键类和扩展接口
目录 1.关键接口和类 1.1.关键类之 DefaultListableBeanFactory 1.2.关键类之XmlBeanDefinitionReader 1.3.关键类之ClassPathXml ...
- servlet中servletContext的五大作用(四)
1. 获取web的上下文路径 2. 获取全局的参数 3. 作为域对象使用 4. 请求转发 5. 读取web项目的资源文件 package day10.about_serv ...
- Java集合的使用
创建和使用集合 定义:集合是一个可变数组 List集合存储有序可重复序列 点击查看详细代码 import java.util.*; public class List01 { public stati ...
- 你的域名是如何变成 IP 地址的?
我的 个人网站 上线了,上面可以更好的检索历史文章,并且可以对文章进行留言,欢迎大家访问 可能大家都知道或者被问过一个问题,那就是很经典的「从浏览器输入 URL 再到页面展示,都发生了什么」.这个问题 ...
- AgileConfig轻量级配置中心1.4.0发布,重构了发布功能
加入 NCC 先说一个事,AgileConfig 在 7 月底终于通过了 NCC 社区的审核,正式成为了 NCC 大家庭的一员.这对 AgileConfig 来说是一个里程碑,希望加入 NCC 后能更 ...