Codeforces Round 971 (Div. 4) G1. Yunli‘s Subarray Queries (easy version)

div4 971 G1. Yunli's Subarray Queries (easy version)

复制代码
q次询问,问区间[l,r]最少修改几个数使得区间[l,r]自然数连续(G1为简单版本,区间长度定为k)
首先有一个trick,要使得自然数连续,只要分别让他们减去i(i从1到n),如果数相等,则表示它们处于自然数连续的相应位置
==>
题目转化为求区间相等的数的个数最大值,再用k减去其即可
滑动窗口,需要始终维护区间相等的数的个数最大值这一信息

如何维护呢?

一开始想自定义优先队列,优先个数最大的放在队头,但是试验了好多次,包括之前有道题目也试验过,发现不可行,如果想要自定义优先队列的话,那么自定义比较的信息必须是不变的,一旦变动,输出的信息奇奇怪怪,摸不着规律,比如说自定义出现次数大的优先

cpp 复制代码
struct cmp{
	bool operator()(int a,int b){
        return cnt[a]<cnt[b];
	}
};

那么cnt[a]和cnt[b]的值必须始终不变,这是通过多次试错发现的

复制代码
维护信息的话有一个trick
首先每个数出现的次数肯定是需要的,即mp[a[i]]++
然后我们反过来存一下,定义map<int,set<int>>cnt     cnt[mp[a[i]].insert(a[i])
也就是说对于出现的次数cnt,我们存了有哪些数出现的次数为cnt

这样信息就很好维护了
比如说如果a[i]的次数变动了,比如说从2变为3,那么cnt[2].erase(a[i]),如果cnt[2].size()变为0了,说明次数为2的没有了
cnt[3].insert(a[i]),而次数为3的多了一个a[i]
另外,再用一个set专门存次数,并降序,那么很容易获取相等的个数最大值
cpp 复制代码
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=2e5+10;
int a[N];
int ans[N];
int n,k,q;
void solve() {
	cin>>n>>k>>q;
	map<int,int>mp;
	map<int,set<int>>cnt;
	set<int,greater<int>>s;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i]-=i;
	}
	for(int i=1;i<=k;i++) mp[a[i]]++;
	for(auto v:mp){
		cnt[v.second].insert(v.first);
		s.insert(v.second);
	}
	ans[1]=*s.begin();
	for(int i=k+1;i<=n;i++){
		if(a[i]!=a[i-k]){
			//加上a[i]
			int tot=mp[a[i]];
			cnt[tot].erase(a[i]);
			if(!cnt[tot].size()) s.erase(tot);
			mp[a[i]]++;
			cnt[mp[a[i]]].insert(a[i]);
			s.insert(mp[a[i]]);
			
			//减去a[i-k]
			tot=mp[a[i-k]];
			cnt[tot].erase(a[i-k]);
			if(!cnt[tot].size()) s.erase(tot);
			mp[a[i-k]]--;
			cnt[mp[a[i-k]]].insert(a[i-k]);
			s.insert(mp[a[i-k]]);
		}
		ans[i-k+1]=*s.begin();
	}
//	for(int i=1;i+k-1<=n;i++) cout<<ans[i]<<' ';
//	cout<<endl;
	while(q--){
		int l,r;
		cin>>l>>r;
		cout<<k-ans[l]<<endl;
	}
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}
相关推荐
Fine姐9 分钟前
数据挖掘3.6~3.10 支持向量机—— 核化SVM
算法·支持向量机·数据挖掘
野渡拾光2 小时前
【考研408数据结构-05】 串与KMP算法:模式匹配的艺术
数据结构·考研·算法
tainshuai4 小时前
用 KNN 算法解锁分类的奥秘:从电影类型到鸢尾花开
算法·分类·数据挖掘
Coovally AI模型快速验证9 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
mit6.8249 小时前
[openvela] Hello World :从零开始的完整实践与问题复盘
c++·嵌入式硬件
pusue_the_sun9 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao3410 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
zhangfeng113310 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
啊阿狸不会拉杆11 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路11 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法