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 ...
随机推荐
- mnist手写数字识别(SVM)
import numpy as np from sklearn.neural_network import MLPClassifier from sklearn.linear_model import ...
- 相机标定与矫正opencv+MATLAB
博客转载自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行 ...
- Shader Variants 打包遇到的问题
1. 遇到的问题 最常见的是打包到手机后效果与PC上不一致,具体情况比如: 光照贴图失效 雾失效 透明或者cutoff失效 以上首先需要检查的地方是Shader变体的编译设置 2. 超级着色器编译成N ...
- 《杜增强讲Unity之Tanks坦克大战》3-添加坦克
3 添加坦克 3.1 本节效果预览 3.2 另存新场景 首先打开上次的场景s1,另存为s2,放到同一个文件夹下面. 3.3 添加坦克模型 在Model文件夹下面找到Tank模型 将Tank ...
- 《Redis设计与实现》阅读笔记(二)--简单动态字符串
简单动态字符串 Redis只在一些无需对字符串进行修改的地方使用C字符串,大部分时候使用简单动态字符串(simple dynamic string, SDS),字符串的抽象类型.二进制安全,可以存放任 ...
- Pod的创建过程
Pod是kubernetes中最小的调度单位,里面包含多个容器,也是真正运行你服务的仓库,同一个pod中容器之间资源共享(IP .网络.cpu.mem.挂载目录等). 1. 准备一个yaml(RC/ ...
- vi/vim命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/mondol/p/vi-examples.html 进入vi vi filename # 打开或新建文件,并将光标置于第 ...
- cal命令详解
基础命令学习目录首页 原文链接:https://www.yiibai.com/linux/cal.html cal命令可以用来显示公历(阳历)日历.公历是现在国际通用的历法,又称格列历,通称阳历.“阳 ...
- Ubuntu 1804 本地显示远程服务器文件
本地是 Ubuntu 1804 最近想查看服务器上的图片,之前都是scp到本地,感觉太麻烦,于是查到有一种方法,ssh图形界面那种: 1.在File 界面下,左侧文件栏的最后一列有 “+ Other ...
- Beta发布—视频展示
视频链接:http://v.youku.com/v_show/id_XMzE3ODQ0NjIzMg==.html视频简要内容介绍:1.一个小小的logo展示.2.在alpha的基础上,beta发布中增 ...