Machine Learning CodeForces - 940F(带修改的莫队)
题解原文地址:https://www.cnblogs.com/lujiaju6555/p/8468709.html
给数组a,有两种操作,1 l r查询[l,r]中每个数出现次数的mex,注意是出现次数,mex是最小未出现的自然数,2 x y将a[x]修改为y。
题解:带修改莫队可以解决此题。带修改莫队不会的同学可以先去做下BZOJ2120,然后mex+莫队可以参考BZOJ3585。带修改莫队就是加入了第三关键字time,然后按(左端点所在块,右端点所在块,时间)排序,其中时间指的是在第几次修改操作后。注意修改时要记下原来的数,以便还原回去。维护mex可以对权值分块,如果某块中数的个数==R-L+1,那么这块所有数都出现了,否则暴力扫,我有个同学直接暴力维护也过了。。。
#include <bits/stdc++.h>
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _ ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = , INF = 0x7fffffff;
int n, m, pos[maxn], s[maxn], c[maxn], all[maxn], t[maxn], cnt[maxn];
int qsz, csz;
struct node
{
int l, r, t, res, id;
}Node[maxn]; void add_n(int l, int r, int t, int id)
{
Node[id].l = l;
Node[id].r = r;
Node[id].t = t;
Node[id].id = id;
} struct change
{
int pos, New, Old;
}Cha[maxn]; void add_c(int pos, int New, int Old, int ans)
{
Cha[ans].pos = pos;
Cha[ans].New = New;
Cha[ans].Old = Old;
} bool cmp(node a, node b)
{
if(pos[a.l] == pos[b.l])
{
if(pos[a.r] == pos[b.r])
return a.t < b.t;
return pos[a.r] < pos[b.r];
}
return pos[a.l] < pos[b.l];
} bool cmp_id(node a, node b)
{
return a.id < b.id;
} int update(int val, int d)
{
if(s[val] > ) cnt[s[val]]--; //s是记录val 出现的次数 cnt标记这个次数是否出现 因为有多个数 可能有些数出现的次数相同 所有用++即可
s[val] += d; //因为当前数val的次数改变 所以 如果未改变时的val的次数 给cnt贡献了1个的话 要先减去 再更新s[val] 再更新cnt[s[val]]
if(s[val] > ) cnt[s[val]]++;
}
int L=, R=, T=;
int go(int idx, int val)
{
if(L <= idx && idx <= R) //如果 当前时间内 修改的位置在当前区间 则先删去上一次在这个位置更新的值 再加上本次在这个位置更新的值
{
update(c[idx], -);
update(val, );
}
c[idx] = val; //更新
} int main()
{
qsz = csz = ;
int tot = ;
scanf("%d%d", &n, &m);
for(int i=; i<=n; i++)
{
scanf("%d",&c[i]);
t[i] = c[i];
all[++tot] = c[i];
}
int block=pow(n,2.0/);
for(int i=; i<=n; i++)
pos[i] = (i-)/block + ;
for(int i=; i<=m; i++)
{
int op, l, r;
scanf("%d%d%d", &op, &l, &r);
if(op == )
{
add_n(l, r, csz, ++qsz);
}
else
{
add_c(l, r, t[l], ++csz);
t[l] = r;
all[++tot] = r;
}
}
sort(all+, all+tot+);
tot = unique(all+, all+tot+) - (all + );
for(int i=; i<=n; i++)
c[i] = lower_bound(all+, all+tot+, c[i]) - all;
for(int i=; i<=csz; i++)
{
Cha[i].New = lower_bound(all+, all+tot+, Cha[i].New) - all;
Cha[i].Old = lower_bound(all+, all+tot+, Cha[i].Old) - all;
}
sort(Node+, Node+qsz+, cmp);
for(int i=; i<=qsz; i++)
{
// for(; T < Node[i].t; T++)
// go(Cha[T+1].pos, Cha[T+1].New);
// for(; T > Node[i].t; T--)
// go(Cha[T].pos, Cha[T].Old);
for(; R < Node[i].r; R++)
update(c[R+], );
for(; R > Node[i].r; R--)
update(c[R], -);
for(; L < Node[i].l; L++)
update(c[L], -);
for(; L > Node[i].l; L--)
update(c[L-], );
for(; T < Node[i].t; T++) //遍历在询问当前区间时 的 时间之前的修改
go(Cha[T+].pos, Cha[T+].New);
for(; T > Node[i].t; T--)
go(Cha[T].pos, Cha[T].Old); for(int j=; ; j++)
if(!cnt[j])
{
Node[i].res = j;
break;
}
// cout<< Node[i].res <<endl;
}
sort(Node+, Node+qsz+, cmp_id);
for(int i=; i<=qsz; i++)
cout<< Node[i].res <<endl; return ;
}
Machine Learning CodeForces - 940F(带修改的莫队)的更多相关文章
- Machine Learning CodeForces - 940F (带修改的莫队)
You come home and fell some unpleasant smell. Where is it coming from? You are given an array a. You ...
- codeforces 940F 带修改的莫队
F. Machine Learning time limit per test 4 seconds memory limit per test 512 megabytes input standard ...
- Machine Learning Codeforces - 940F(带修莫队) && 洛谷P4074 [WC2013]糖果公园
以下内容未验证,有错请指正... 设块大小为T,则块数为$\frac{n}{T}$ 将询问分为$(\frac{n}{T})^2$块(按照左端点所在块和右端点所在块分块),同块内按时间从小到大依次处理 ...
- BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...
- 【BZOJ】2120: 数颜色 带修改的莫队算法
[题意]给定n个数字,m次操作,每次询问区间不同数字的个数,或修改某个位置的数字.n,m<=10^4,ai<=10^6. [算法]带修改的莫队算法 [题解]对于询问(x,y,t),其中t是 ...
- 【bzoj4129】Haruna’s Breakfast 带修改树上莫队+分块
题目描述 给出一棵树,点有点权.支持两种操作:修改一个点的点权,查询链上mex. 输入 第一行包括两个整数n,m,代表树上的结点数(标号为1~n)和操作数.第二行包括n个整数a1...an,代表每个结 ...
- 【bzoj3052】[wc2013]糖果公园 带修改树上莫队
题目描述 给出一棵n个点的树,每个点有一个点权,点权范围为1~m.支持两种操作:(1)修改一个点的点权 (2)对于一条路径,求$\sum\limits_{i=1}^m\sum\limits_{j=1} ...
- P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队
\(\color{#0066ff}{ 题目描述 }\) 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支 ...
- UOJ 58 (树上带修改的莫队)
UOJ 58 糖果公园 Problem : 给一棵n个点的树,每个点上有一种颜色,对于一条路径上的点,若 i 颜色第 j 次出现对该路径权值的贡献为 w[i] * c[j], 每次询问一条路径的权值, ...
- UVA - 12345 带修改的莫队
题意显然:给出初始序列,单点修改,区间查询元素的种类. 由于时限过宽,暴力可过. 比较优秀的解法应该是莫队. 带修改的莫队题解可以看https://www.luogu.org/blog/user126 ...
随机推荐
- FileCopy方法
复制文件. 语法 FileCopy源,目标 FileCopy 语句语法包含以下命名参数: 部分 说明 source 必需. 指定要复制的文件的名称的字符串表达式. _源_可能包含目录或文件夹,和驱动器 ...
- HALCON视觉算子相关函数中文说明System(2)
16.6 Parameters get_system_ 功能:根据HALCON系统参数获取关于当前的信息. set_system 功能:HALCON系统参数的设置. 16.7 Serial cle ...
- AndroidStudio下使用 RecyclerView xml文件不显示预览条目并报错类似:NoClassDefFoundError 问题解决
在项目中使用RecyclerView是很普遍的,最近工作中遇到了这种情况: RecyclerView可以正常使用 不会报错 但是在layout中的xml文件中不显示并且报错,如下图:(报的错忘了截了, ...
- 精确的double加减乘除运算工具类
import java.math.BigDecimal; /** * 精确的double加减乘除运算 * @author cyf * */ public class DoubleUtil { /** ...
- ssh连接超时自动断掉的解决办法
最近开始使用阿里云服务器ECS,系统是CENTOS7.4 ,通过SSH连接上自动创建的实例后,几分钟不操作,就自动断开,提示“信号灯时间已到”,非常影响工作. 解决办法: 默认镜像创建的实例,SSH服 ...
- == 和 equals 的区别是什么?
已经有很多人说过二者的区别了,我直接上代码. String strA = "123"; String strB = "123"; String strC = & ...
- 基于Vue的简单通用分页组件
分页组件是每一个系统里必不可少的一个组件,分页组件分为两部分.第一部分是模版部分,用于显示当前分页组件的状态,例如正在获取数据.没有数据.没有下一页等等:第二部分是分页数据对象,用于封装一个分页组件的 ...
- RabbitMQ和Kafka,更加便捷高效的消息队列使用方式,请放心食用
一.RabbitMQ实例介绍RabbitMQ实例由华为云分布式消息服务(DMS)团队打造,实例采用物理隔离的方式部署,租户独占RabbitMQ实例.一键式部署,完全兼容开源RabbitMQ的使用方式, ...
- C++判断回文
判断一个字符串是否为回文,如“goddog”. 代码: #include <iostream> #include <string> #include <stdio.h&g ...
- Apache 性能配置优化
前言 最近在进行apache性能优化设置.在修改apache配置)文件之前需要备份原有的配置文件夹conf,这是网站架设的好习惯.以下的apache配置调优均是在red had的环境下进行的. htt ...