1 条题解

  • 0
    @ 2025-8-24 22:03:40

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar suzhikz
    我永远喜欢艾莉丝!

    搬运于2025-08-24 22:03:40,当前版本为作者最后更新于2024-08-09 14:19:34,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    前言

    赛场上把双指针拆成了 rr 个???然后就没过。赛后一想就通五分钟过了,所以写个题解纪念下我的 shaber 时刻。

    思路

    对于一个左端点为 ll 的区间,若右端点 rr 符合所有条件,那么所有比 rr 大的右端点都可以,且 ll 单调递增时, rr 也是单调递增的,所以想到了双指针。

    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<iomanip>
    #include<cstdio>
    #include<string>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<vector>
    #include<stdio.h>
    #include<map>
    #include<set>
    #include<string.h>
    #include<time.h>
    #include<stdlib.h>
    #include<bitset>
    using namespace std;
    const int N=2e5+5;
    int n,k,g;
    int a[N];
    int cnt[N],minn[N],b[N],q[N];
    int main(){
    	cin>>n>>k>>g;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	for(int i=1;i<=g;i++){
    		cin>>b[i]>>q[i];
    		minn[b[i]]=q[i];
    	}
    	int les=g,r=0;
    	int ans=99824435;
    	for(int i=1;i<=n;i++){
    		if(i!=1){
    			cnt[a[i-1]]--;
    			if(cnt[a[i-1]]<minn[a[i-1]])les++;
    		}
    		while(r<=n&&les){
    			r++;
    			cnt[a[r]]++;
    			if(cnt[a[r]]==minn[a[r]]){
    				les--;
    			}
    		}
    		if(r<=n){
    			ans=min(ans,r-i+1); 
    		}
    	}
    	if(ans==99824435)puts("impossible");
    	else cout<<ans;
    	return 0;
    }
    
    • 1

    信息

    ID
    3816
    时间
    2000ms
    内存
    750MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者