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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)