P1638 逛画展
作者:互联网
显然数据只能nlogn以下。
其实O(n)就能做。
对于一个数,我们维护它最后出现的位置p [ ] 。那么对于L~R(假设已经达到m种画都有),R+1时,至少一个数的p会被更新。那么如果这个左端点在这个区间中还有一个,即 L < p [ a [ L ] ] ,那么这个L删掉是没有影响的,我们就让L++;否则L不变,这样保证这个队伍里必定1~m都有,更新答案即可。
对于时间复杂度,显然L,R分别最多只会移动n次,所以为O(n)。
代码:
#include<cstdio> #include<iostream> #include<queue> #include<algorithm> #include<cstring> using namespace std; #define maxn 1000005 #define inf 99999999 int a[maxn],p[maxn]; int n,m,tot,L=0,R=inf; int main() { scanf("%d%d",&n,&m); int l=1; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(!p[a[i]]) tot++; p[a[i]]=i; while(l<p[a[l]]) l++; if(tot==m&&R-L+1>i-l+1) { L=l; R=i; } } printf("%d %d",L,R); return 0; }
标签:这个,画展,int,maxn,P1638,inf,include,define 来源: https://www.cnblogs.com/popo-black-cat/p/10759550.html