http://codeforces.com/contest/740/problem/C
构造思维题。
第一直觉就是区间长度+1的最小值就是答案。
然而不知道怎么去构造这个序列、
其实就是每个区间,都要包含0、1、2、3、...ans - 1即可。
所以,只要不断0、1、2、3、4、...ans - 1、0、1、2、3、....这样放即可。
因为最小的区间长度是ans - 1,那么选出来的区间只能比这个大,那么拿到绝对包含了0、1、2、3、4...ans - 1
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #define IOS ios::sync_with_stdio(false) using namespace std; #define inf (0x3f3f3f3f) typedef long long int LL; #include <iostream> #include <sstream> #include <vector> #include <set> #include <map> #include <queue> #include <string> const int maxn = 1e5 + 20; struct node { int L, R; int val; bool operator < (const struct node & rhs) const { if (val != rhs.val) return val < rhs.val; else if (R != rhs.R) return R > rhs.R; else return L > rhs.L; } } q[maxn]; int a[maxn]; int vis[maxn]; int n, m; void work() { IOS; cin >> n >> m; int ans = inf; for (int i = 1; i <= m; ++i) { cin >> q[i].L >> q[i].R; q[i].val = q[i].R - q[i].L + 1; ans = min(ans, q[i].val); } cout << ans << endl; int to = 0; for (int i = 1; i <= n; ++i) { cout << to << " "; to++; to %= ans; } } int main() { #ifdef local freopen("data.txt","r",stdin); #endif work(); return 0; }