Advertisement
Kevin_Zhang

Untitled

Nov 8th, 2020
951
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.95 KB | None | 0 0
  1. #include <unistd.h>
  2. #define pb emplace_back
  3. using namespace std;
  4.  
  5. inline char readchar() {
  6.     constexpr int B = 1<<10;
  7.     static char buf[B], *p, *q;
  8.     if(p == q && (q=(p=buf)+read(0, buf, B)) == buf) return -1;
  9.     return *p++;
  10. }
  11. inline int nextint() {
  12.     int x = 0, c = readchar();
  13.     while(c < '0') c = readchar();
  14.     while(c >= '0') x=x*10+(c^'0'), c=readchar();
  15.     return x;
  16. }
  17. inline void writeint(int x) {
  18.     static char stk[20], buf[20];
  19.     char p = 0, q = 0;
  20.     if(!x) stk[p++] = '0';
  21.     while(x) stk[p++] = x%10^'0', x/=10;
  22.     while(p) buf[q++] = stk[--p];
  23.     write(1, buf, q);
  24. }
  25.  
  26. const int N = 24;
  27.  
  28. int p[N], l[N], r[N], g[N];
  29. int seed = 7122;
  30. inline int rnd() { return seed = 1LL * seed * 14699 % 1000000007; }
  31. inline void swap(int &a, int &b) {
  32.     int t = a; a = b; b = t;
  33. }
  34. void shuffle(int n) {
  35.     for(int i = 0; i < n; i++) {
  36.         int j = rnd() % (i+1);
  37.         if(j != i) swap(p[i], p[j]);
  38.     }
  39. }
  40. inline int min(int a, int b) { return a < b ? a : b; }
  41. int now[N];
  42. signed main() {
  43.     int n = nextint();
  44.     for(int i = 0; i < n; i++) l[i] = nextint(), r[i] = nextint();
  45.     for(int i = 0; i < n; i++) {
  46.         g[i] = 1 << i;
  47.         for(int j = 0; j < n; j++) {
  48.             if(j == i) continue;
  49.             if((l[i] < l[j] && l[j] < r[i]) ^ (l[i] < r[j] && r[j] < r[i])) {
  50.                 g[i] |= 1 << j;
  51.             }
  52.         }
  53.     }
  54.     int ans = n;
  55.     for(int i = 0; i < n; i++) p[i] = i;
  56.     for(int c = 0; c < 50; c++) {
  57.         shuffle(n);
  58.         int it = 0;
  59.         for(int i = 0; i < n; i++) {
  60.             bool found = false;
  61.             for(int j = 0; j < it; j++) {
  62.                 int &x = now[j];
  63.                 if(~x >> p[i] & 1) {
  64.                     x |= g[p[i]];
  65.                     found = true;
  66.                     break;
  67.                 }
  68.             }
  69.             if(!found) now[it++] = g[p[i]];
  70.         }
  71.         ans = min(ans, it);
  72.     }
  73.     writeint(ans);
  74. }
  75.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement