Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #define pb emplace_back
- using namespace std;
- inline char readchar() {
- constexpr int B = 1<<10;
- static char buf[B], *p, *q;
- if(p == q && (q=(p=buf)+read(0, buf, B)) == buf) return -1;
- return *p++;
- }
- inline int nextint() {
- int x = 0, c = readchar();
- while(c < '0') c = readchar();
- while(c >= '0') x=x*10+(c^'0'), c=readchar();
- return x;
- }
- inline void writeint(int x) {
- static char stk[20], buf[20];
- char p = 0, q = 0;
- if(!x) stk[p++] = '0';
- while(x) stk[p++] = x%10^'0', x/=10;
- while(p) buf[q++] = stk[--p];
- write(1, buf, q);
- }
- const int N = 24;
- int p[N], l[N], r[N], g[N];
- int seed = 7122;
- inline int rnd() { return seed = 1LL * seed * 14699 % 1000000007; }
- inline void swap(int &a, int &b) {
- int t = a; a = b; b = t;
- }
- void shuffle(int n) {
- for(int i = 0; i < n; i++) {
- int j = rnd() % (i+1);
- if(j != i) swap(p[i], p[j]);
- }
- }
- inline int min(int a, int b) { return a < b ? a : b; }
- int now[N];
- signed main() {
- int n = nextint();
- for(int i = 0; i < n; i++) l[i] = nextint(), r[i] = nextint();
- for(int i = 0; i < n; i++) {
- g[i] = 1 << i;
- for(int j = 0; j < n; j++) {
- if(j == i) continue;
- if((l[i] < l[j] && l[j] < r[i]) ^ (l[i] < r[j] && r[j] < r[i])) {
- g[i] |= 1 << j;
- }
- }
- }
- int ans = n;
- for(int i = 0; i < n; i++) p[i] = i;
- for(int c = 0; c < 50; c++) {
- shuffle(n);
- int it = 0;
- for(int i = 0; i < n; i++) {
- bool found = false;
- for(int j = 0; j < it; j++) {
- int &x = now[j];
- if(~x >> p[i] & 1) {
- x |= g[p[i]];
- found = true;
- break;
- }
- }
- if(!found) now[it++] = g[p[i]];
- }
- ans = min(ans, it);
- }
- writeint(ans);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement