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
", ANS);
	}

	return 0;
}

原文地址:https://www.cnblogs.com/Pickupwin/p/9029461.html