0
点赞
收藏
分享

微信扫一扫

洛谷P1638 逛画展 (尺取法)

愚鱼看书说故事 2022-03-26 阅读 35
算法

题目

首次了解到有尺取法这个东西,实际上就是双指针维护。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
int n,m,x,sum,y=1e9,a[N],cnt[N];//用从cnt[i]维护区间每种画的个数 

signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	int l=1,r=1;//双指针扫描 
	while(l<=r&&r<=n){ 
		while(sum<m&&r<=n){//移动右指针 
			if(!cnt[a[r]]) sum++;
			cnt[a[r]]++;
			r++; 
		}
		if(sum<m) break;
		if(r-l<y-x+1) x=l,y=r-1;//更新答案区间
		//if((r-1)-l+1<y-x+1) x=l,y=r-1; 
		if(cnt[a[l]]==1) sum--; 
		cnt[a[l]]--;
		l++;//移动左指针 
	}
	cout<<x<<" "<<y;
	return 0;
}
举报

相关推荐

0 条评论