【CT-1 D】jqQt0220 看画展 题解

题目传送门


还是道原(原题链接)。可以利用双指针维护区间,如果有够 $m$ 个,就更新答案,最后输出就行。直接看代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,p[1000010];
int asl=1,asr=1e9,t[2010];//t[i] 表示区间内第 i 位画家的画数量
ll k,as;//记得开 long long
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++)
        scanf("%d",&p[i]);
    int l=1,r=1,ct=1;//ct 表示区间内画家数量
    t[p[r]]=1;
    while(l<=r&&r<=n)
    {
        if(ct==m)//到 m 个了
        {
            if(r-l<asr-asl)//更优就更新答案
                as=(r-l+1)*k,asl=l,asr=r;
            t[p[l]]--;//左指针计数减了
            if(!t[p[l]])//减完没了就少了个画家
                ct--;
            l++;//左指针右移
        }
        else 
        {
            r++;//右指针右移
            t[p[r]]++;//右边计数加上
            if(t[p[r]]==1)//刚加上第一个就新进来一个画家
                ct++;
        }
    }
    printf("%d %d\n%lld",asl,asr,as);
    return 0;
}
posted @ 2023-11-29 21:18  电乔  阅读(25)  评论(0)    收藏  举报  来源