POJ 3320 Jessica's Reading Problem

sort扫一下

注意\(++i\)的位置
cin cout 过不去

#include <cstdio>
#include <algorithm>
#include <cassert>

using namespace std;

const int MAXN=1000111;
const int MAXM=MAXN;

int N;
int M;
int Vc[MAXM];
int Cnt=0;
int ANS;

struct Page {
	long long v;
	int id, k;
} P[MAXN];

bool cmpv(Page A, Page B) {
	if(A.v==B.v)	return A.id<B.id;
	return A.v<B.v;
}

bool cmpid(Page A, Page B) {
	return A.id<B.id;
}

int main() {

	while(scanf("%d", &N)!=EOF) {
		for(int i=1; i<=N; ++i) {
			scanf("%lld", &P[i].v);
			P[i].id=i;
		}
		sort(P+1, P+N+1, cmpv);
		P[1].k=1;
		for(int i=2; i<=N; ++i) {
			P[i].k=P[i-1].k;
			if(P[i].v!=P[i-1].v)	++P[i].k;
		}
		M=P[N].k;
		sort(P+1, P+N+1, cmpid);
		ANS=N;
		for(int i=1, j=0; i<=N; ++i) {
			while(Cnt<M && j<N) {
				++j;
				++Vc[P[j].k];
				if(Vc[P[j].k]==1)	++Cnt;
			}
			if(Cnt==M) {
				ANS=min(ANS, j-i+1);
			}
			//++i;
			--Vc[P[i].k];
			if(Vc[P[i].k]==0)	--Cnt;
		}
		assert(Cnt==0);
		printf("%d\n", ANS);
	}

	return 0;
}

posted @ 2018-05-12 18:12  Pickupwin  阅读(140)  评论(0编辑  收藏  举报