【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;
}

浙公网安备 33010602011771号