POJ2528 Mayor's posters

来源:互联网 发布:我的妻子是网络主播 编辑:程序博客网 时间:2024/05/21 10:03

线段树处理,注意为了避免离散化时没有处理到没有上色的部分,把没有上色的也要加入线段树


/******************************************************************************* # Author : Neo Fung # Email : neosfung@gmail.com # Last modified: 2012-01-26 18:57 # Filename: POJ2528 Mayor's posters.cpp # Description :  ******************************************************************************/#ifdef _MSC_VER#define DEBUG#endif#include <fstream>#include <stdio.h>#include <iostream>#include <string.h>#include <string>#include <limits.h>#include <algorithm>#include <math.h>#include <numeric>#include <functional>#include <ctype.h>#include <set>#define L(x) (x<<1)#define R(x) (x<<1|1)#define MAX 40010using namespace std;struct NODE{int l,r, val;}node[MAX*4],order[MAX];set<int> set_result;void init(){memset(node,'\0',sizeof(node));memset(order,'\0',sizeof(order));set_result.clear();}void build(const int &t , const int &l,const int &r){  if(l>=r) return;node[t].l=l;node[t].r=r;node[t].val=-1;  if(l==r-1)    return;int mid=(l+r)>>1;build(L(t),l,mid);build(R(t),mid,r);}void update(const int &t,const int &l,const int &r,const int &val){if(node[t].l>=l && node[t].r<=r)  {node[t].val=val;return;  }if(node[t].val>=0 ){node[R(t)].val = node[L(t)].val = node[t].val;node[t].val=-1;}int mid=(node[t].l+node[t].r)>>1;if(l>=mid)update(R(t),l,r,val);else if(r<=mid)update(L(t),l,r,val);else{update(L(t),l,mid,val);update(R(t),mid,r,val);}}void query(const int &t,const int &l,const int &r){if(node[t].val>=0){set_result.insert(node[t].val);return;}  if(l==r-1)    return;int mid = (node[t].l+node[t].r)>>1;if(l>=mid)query(R(t),l,r);else if(r<=mid)query(L(t),l,r);else {query(L(t),l,mid);query(R(t),mid,r);}}void func(int *len,const int &cnt,const int &n){build(1,0,cnt);for(int i=0;i<n;++i){int x = lower_bound(len,len+cnt,order[i].l) - len;int y = lower_bound(len,len+cnt,order[i].r) - len;update(1,x,y+1,order[i].val);}query(1,0,cnt);  printf("%d\n",set_result.size());  }int main(void){#ifdef DEBUG    freopen("../stdin.txt","r",stdin);  freopen("../stdout.txt","w",stdout); #endif    int n,ncases;  int len[MAX];  scanf("%d",&ncases);  while(ncases--)  {  scanf("%d",&n);  int cnt=0;  init();  for(int i=0;i<n;++i)  {  scanf("%d %d",&order[i].l,&order[i].r);  len[cnt++]=order[i].l;      len[cnt++]=order[i].r;      len[cnt++]=order[i].l-1;      len[cnt++]=order[i].r+1;  order[i].val=i;  }  sort(len,len+cnt);  cnt = unique(len,len+cnt)-len;  func(len,cnt,n);  }  return 0;}