poj 2528 Mayor's posters

March 5, 2013
POJ

Description Input Output Sample Input Sample Output


#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const int maxn = 111111;
int li[maxn], ri[maxn], x[maxn*3], col[maxn<<4], cnt;
bool hash[maxn];
void PushDown(int rt){
  if (col[rt] != -1){
    col[rt<<1] = col[rt<<1|1] = col[rt];
    col[rt] = -1;
  }
}
void update(int L,int R, int c, int l, int r, int rt){
  if (L <= l && R >= r){col[rt] = c; return;}
  PushDown(rt);
  int m = (l + r) >> 1; 
  if (L <= m) update(L, R, c, lson); if (R > m) update(L, R, c, rson);
}
void query(int l, int r, int rt){
  if (col[rt] != -1){
    if (!hash[col[rt]]) cnt++;
    hash[col[rt]] = true; return;
  }
  if (l == r) return; 
  int m = (l + r) >> 1;
  query(lson); query(rson);
}
int bin(int key, int n, int a[]){
  int l = 0, r = n - 1;
  while (l <= r){
    int m = (l + r) >> 1;
    if (a[m] == key) return m;
    if (a[m] < key) l = m + 1; else r = m - 1;
  }
  return -1;
}
int main(void){
#ifndef ONLINE_JUDGE
  freopen("poj2528.in", "r", stdin);
#endif
  int t; scanf("%d", &t);
  while (t--){
    int n; scanf("%d",&n); int k = 0;
    for (int i = 0; i < n; ++i){
      scanf("%d%d", li+i, ri+i); x[k++] = li[i]; x[k++] = ri[i];
    }
    sort(x, x + k); 
    int m = 1;
    for (int i = 1; i < k; ++i){
      if (x[i] != x[i-1]) x[m++] = x[i];
    }
    for (int i = m - 1; i > 0; --i){
      if (x[i] != x[i-1] + 1) x[m++] = x[i-1] + 1;
    }
    sort(x, x + m);
    memset(col, -1, sizeof(col));
    for (int i = 0; i < n; ++i){
      int l = bin(li[i], m, x);
      int r = bin(ri[i], m, x);
      update(l, r, i, 0, m, 1);
    }
    cnt = 0; memset(hash, false, sizeof(hash));
    query(0, m, 1); printf("%d\n", cnt);
  }
  return 0;
}

膜拜一下NotOnlySuccess神犇……

comments powered by Disqus