首页 > 其他分享 >题解:CF2009G1 Yunli's Subarray Queries (easy version)

题解:CF2009G1 Yunli's Subarray Queries (easy version)

时间:2024-10-03 18:44:09浏览次数:6  
标签:CF2009G1 cnt bel int 题解 -- while version mx

题目要求 \(a_i=a_{i-1}+1\),设 \(b_i=a_i-i\),如果 \(b_i=b_j\),那么 \(i\) 和 \(j\) 就在正确的相对位置上。这应该很好理解吧,\(a\) 是一个公差为 \(1\) 的等差数列,下标也是一个公差为 \(1\) 的等差数列,对应位置相减就相等了。

我们在输入 \(a_i\) 的时候减去 \(i\),然后用滑动窗口维护每个区间内出现最多的元素次数即可。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,k,qq;
int a[N],f[N]; 
int l,r;
void solve(){
	memset(a,0,sizeof a);
	memset(f,0,sizeof f);
	cin>>n>>k>>qq;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	 	a[i]=a[i]-i;
	}
	multiset<int> q; 
	map<int,int> h;
	for(int i=1;i<=n;i++){
		int v=h[a[i]]++;
		if(q.find(v)!=q.end()){
			q.erase(q.find(v));
		}
		q.insert(v+1);
		if(i>=k){
			f[i]=*q.rbegin();
			int w=h[a[i-k+1]]--;
			q.insert(w-1);
			if(q.find(w)!=q.end()){
				q.erase(q.find(w));
			}
		}
	}
	while(qq--){
		cin>>l>>r;
		int ans=k-f[r];
		cout<<ans<<'\n';
	}
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

也可以用莫队维护这个值:

#include<bits/stdc++.h>
using namespace std;
void solve(){
	int n,k,m;
	cin>>n>>k>>m;
	vector<int>a(n+1),bel(n+1);
	int tot=sqrt(n);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i]-=i;
		bel[i]=i/tot;
	}
	vector<vector<int>>q(m+1,vector<int>(3));
	for(int i=1;i<=m;i++){
		cin>>q[i][0]>>q[i][1];
		q[i][2]=i;
	}
	sort(q.begin()+1,q.end(),[&](auto &x,auto &y){
		if(bel[x[0]]!=bel[y[0]])return bel[x[0]]<bel[y[0]];
		if(bel[x[0]]&1) return x[1]<y[1];
		return x[1]>y[1];
	});
	vector<int> cnt(2*n+1,0);
	vector<int> sum(n+1,0);
	int mx=0;
	auto add=[&](int x){
		cnt[a[x]+n]++;
		sum[cnt[a[x]+n]]++;
		if(cnt[a[x]+n]>mx)mx=cnt[a[x]+n];
	};
	auto del=[&](int x){
		if(cnt[a[x]+n]==mx){
			if(sum[cnt[a[x]+n]]==1) mx--;
		}
		sum[cnt[a[x]+n]]--;
		cnt[a[x]+n]--;
	};
	vector<int>ans(m+1);
	int l=1,r=0;
	for(int i=1;i<=m;i++){
		while(q[i][0]<l) add(--l);
		while(q[i][1]>r) add(++r);
		while(q[i][0]>l) del(l++);
		while(q[i][1]<r) del(r--);
		ans[q[i][2]]=q[i][1]-q[i][0]+1-mx;
	}
	for(int i=1;i<=m;i++)cout<<ans[i]<<"\n";
}
int main(){
	int t;
	cin>>t;
	while(t--) solve();
	return 0;
}

标签:CF2009G1,cnt,bel,int,题解,--,while,version,mx
From: https://www.cnblogs.com/cly312/p/18445894

相关文章

  • [题解] [SDOI2011] 消防
    [题解][SDOI2011]消防tag:图论、树、树的直径题目链接(洛谷):https://www.luogu.com.cn/problem/P2491题目描述给定一棵\(n\)个节点的树,第\(i\)条边有边权\(z_i\)。要求找到树上一条长度不大于\(s\)的简单路径,使得不在路径上的点到该路径的最大距离最小。数据范围:\(1......
  • 算法基础课——基础算法题解
    排序算法(分治)快速排序:题面:给定你一个长度为\(n\)的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数\(n\)。第二行包含\(n\)个整数(所有整数均在\(1\sim10^9\)范围内),表示整个数列。输......
  • 题解9.29-10.3
    1.MakeitAlternating如果它已经是交替的序列我们就不用管了,最终的目的是把序列变成交替的序列,那么我们可以把连续相同的数全部取出来只留下一个,可以分成几段相同的数,最后的结果就是把这些相同的数全部只保留一个,用排列组合C(m,1);第一个结果很简单,把重复的数加一下即可,后面的答......
  • CF1051F题解
    传送门:https://codeforces.com/problemset/problem/1051/F注意到\(m-n\le20\),求一个连通图中任意两点间最短路,我们不难想到将问题转换到树上。先求出树的任意一颗生成树,此时倍增或者树刨能轻松算出仅含树边的最小路径。而对于非树边,从边的角度显然很难做到,我们不妨从点的角度思......
  • 题解:CF724E Goods transportation
    可以在cnblog中阅读。题意有\(n\)座城市,第\(i\)座城市生产了\(p_i\)件货物,最多可以出售\(s_i\)件货物,编号小的城市可以向编号大的城市运输至多\(c\)件货物,问最多能出售多少货物。\(n\le10^4\)。分析乍一看是一个网络流问题,可以这样建图,令\(S\)为源点\(T\)......
  • ABC221G Jumping Sequences 题解
    JumpingSequences把移动的上下左右改成左上、左下、右上、右下(坐标轴旋转\(45\)°)。则最终目的地是\((A+B,A-B)\)。(以前移动的方式是\((\pmd_i,0),(0,\pmd_i)\)。现在每次移动的方式是\((\pmd_i,\pmd_i)\))则\(x,y\)两维可以分开考虑。目标:从\(d_1\simd_n\)中选......
  • Codeforces Round 976 (Div. 2) 题解
    CodeforcesRound976(Div.2)题解2020B一个常见的想法:开关灯=异或,虽然在这道题里没啥用注意到,第i盏灯的按钮被按的次数就是i的除它本身以外的因子个数而完全平方数的因子数为奇数,其他数的因子数为偶数点击查看更多信息#include<bits/stdc++.h>usingnamespacestd;voi......
  • 题解:CF1976D Invertible Bracket Sequences
    可以在cnblog中阅读。题意给一个合法括号序列,问有多少区间\([l,r]\),使得将区间内的每个括号翻转后,括号序列仍合法。分析十分套路地,我们将(看成\(+1\),将)看成\(-1\),则一个括号序列合法的充要条件是转换后的序列满足:前缀和任意位置非负;最后一项为\(0\)。考虑翻转......
  • 《Yttomp3.click - An Outstanding YouTube to MP3 Conversion Platform》
    Intoday'sdigitalera,thedemandforobtainingandconvertingaudiocontentisgrowingincreasingly.Formanymusiclovers,videocreators,andordinaryusers,beingabletoextracttheaudiofromfavoriteYouTubevideosandconvertitintoMP3for......
  • ZZJC新生训练赛第二场题解
    先给出比赛链接:https://ac.nowcoder.com/acm/contest/92036A小红打怪ShowCodeAclassPoint{//点类public:intx,y;Point(){}Point(intx,inty):x(x),y(y){}Pointoperator+(constPoint&P)const{returnPoint(x+P.x,y+P.y);......