画展
博览馆正在展出由世上最佳的 M 位画家所画的图画。
wangjy 想到博览馆去看这几位大师的作品。
可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字, a 和 b ,代表他要看展览中的第 a 幅至第 b 幅画 ( 包含 a 和 b) 之间的所有图画,而门票的价钱就是一张图画一元。
为了看到更多名师的画, wangjy 希望入场后可以看到所有名师的图画 ( 至少各一张 ) 。
可是他又想节省金钱。。。
作为 wangjy 的朋友,他请你写一个程序决定他购买门票时的 a 值和 b 值。
【输入格式】
第一行是 N 和 M ,分别代表博览馆内的图画总数及这些图画是由多少位名师的画所绘画的。
其后的一行包含 N 个数字,它们都介于 1 和 M 之间,代表该位名师的编号。
【输出格式】
a 和 b(a<=b) 由一个空格符所隔开。
保证有解,如果多解,输出 a 最小的。
【输入输出样例1】
输入:
exhibit.in
12 5
2 5 3 1 3 2 4 1 1 5 4 3
输出:
exhibit.out
2 7
【约束条件】
30%的数据N<=200 , M<=20
60%的数据N<=10000 , M<=1000
100%的数据N<=1000000 , M<=2000
随便搞一搞就好了。。。
一个头指针,一个尾指针,保证头指针对应的值在头指针和尾指针内只出现一次即可。。。
1 #include<iostream> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<cstdio> 6 #include<algorithm> 7 #include<string> 8 #include<map> 9 #include<queue> 10 #include<vector> 11 #include<set> 12 #define inf 10000000 13 #define maxn 1000000+5 14 #define maxm 2000+5 15 #define eps 1e-10 16 #define ll long long 17 #define for0(i,n) for(int i=0;i<=(n);i++) 18 #define for1(i,n) for(int i=1;i<=(n);i++) 19 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 20 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 21 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 22 using namespace std; 23 int read(){ 24 int x=0,f=1;char ch=getchar(); 25 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 26 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 27 return x*f; 28 } 29 int a[maxn],b[maxm]; 30 int main(){ 31 freopen("input.txt","r",stdin); 32 freopen("output.txt","w",stdout); 33 int n=read(),m=read(),l=1,r=0,cnt=0,st=0,end=inf; 34 for1(i,n)a[i]=read(); 35 for1(i,n){ 36 if(b[a[i]]==0)cnt++; 37 b[a[i]]++;r++; 38 while(b[a[l]]>1){b[a[l]]--;l++;} 39 if(cnt==m&&end-st>r-l){st=l;end=r;} 40 } 41 cout<<st<<" "<<end; 42 return 0; 43 }