Codeforces Round #381 (Div. 2) C. Alyona and mex
题目大意:要构造一个长度为n的序列,从而使得在由给出的m个区间得到的m个mex值中的最小值 尽可能的大;一个区间的mex值代表不存在于这个区间中的最小的非负整数(有点绕...)
题解思路:解这题有两个突破口;第一个:只从题目给的那两个简单样例也可以发现最终结果的规律,就是结果只跟最短的区间长度有关(或者自己画多几个例子也都会发现的,,虽然我给不出严谨的证明=_=...)。 知道了这一步后,剩下的就是思考如何去构造这个数列,也是第二个突破口;一开始的时候自己在知道最终结果只跟最小的区间长度有关时就一直纠结在如何构造这个数列,考虑要怎么才能使得给出的m个区间在互相影响的前提下又能满足区间内都有数字0~mi-1(反应过来后感觉自己好智障:明明最终结果只会是最短的区间长度min了,那每个区间只需有0~min-1不就行了吗=_=...)。 这些都知道后,就只要使序列从第一个开始像0、1、2...min-1、0、1、2...min-1...这样构造就行了,因为这样来不论取任何一个长度大于等于min的区间的话,里面都一定会包含0~min-1这些数的。
AC代码:
1 /** 2 * @author Wixson 3 */ 4 #include <iostream> 5 #include <cstdio> 6 #include <cstring> 7 #include <cmath> 8 #include <algorithm> 9 #include <queue> 10 #include <stack> 11 #include <vector> 12 #include <utility> 13 #include <map> 14 #include <set> 15 const int inf=0x3f3f3f3f; 16 const double PI=acos(-1.0); 17 const double EPS=1e-10; 18 using namespace std; 19 typedef long long ll; 20 typedef pair<int,int> P; 21 22 int n,m,l,r,Min; 23 int a[100010]; 24 int main() 25 { 26 //freopen("input.txt","r",stdin); 27 cin>>n>>m; 28 Min=inf; 29 for(int i=0;i<m;i++) 30 { 31 cin>>l>>r; 32 if(r-l+1<Min) Min=r-l+1; 33 } 34 // 35 int temp=0; 36 for(int i=0;i<n;i++) 37 { 38 a[i]=temp; 39 temp=(temp+1)%Min; 40 } 41 42 // 43 cout<<Min<<endl; 44 for(int i=0;i<n;i++) 45 { 46 printf("%d ",a[i]); 47 } 48 putchar('\n'); 49 return 0; 50 }