線段樹+離散化操作(poj 2528)
阿新 • • 發佈:2019-02-15
#include<iostream> #include<cstdio> #include<algorithm> #define Pn 10005 #define MAXN 1000005 using namespace std; int tN,pN; struct Tnode { int l,r; bool covered; int mid() { return (l+r)/2; } }T[1000005]; struct post { int l,r; }Post[Pn]; int Bnode[2*Pn]; int mark[10000005]; bool comp(int a,int b) { if(a<b)return true; else return false; } void buildT(int l,int r,int index) { T[index].covered =false; T[index].l =l; T[index].r =r; if(l==r) { return; } else { buildT(l,T[index].mid(),2*index+1); buildT(T[index].mid()+1,r,2*index+2); return; } } bool query(int index,int l,int r) { if(T[index].covered)return false; else if(l==T[index].l&&r==T[index].r) { T[index].covered =true; return true; } bool flag,flaga,flagb; if(r<=T[index].mid())flag =query(2*index+1,l,r); else if(l>=T[index].mid()+1)flag =query(2*index+2,l,r); else { flaga =query(2*index+1,l,T[index].mid()); flagb =query(2*index+2,T[index].mid()+1,r); flag =flaga||flagb; } if(T[2*index+1].covered && T[2*index+2].covered) T[index].covered =true; //update the information of the tree return flag; } int main() { //freopen("input","r",stdin); int i; int IntervalN,Noden,ans; scanf("%d",&tN); while(tN--) { ans =0; IntervalN =1; scanf("%d",&pN); for(i=0;i<pN;i++) { scanf("%d %d",&Post[i].l,&Post[i].r); Bnode[2*i] =Post[i].l; Bnode[2*i+1] =Post[i].r; } sort(Bnode,Bnode+2*pN,comp); Noden =unique(Bnode,Bnode+2*pN) -Bnode; for(i=0;i<Noden;i++) { mark[Bnode[i]] =IntervalN; if(i<Noden-1) { if(Bnode[i+1]-Bnode[i] ==1)IntervalN++; else if(Bnode[i+1]-Bnode[i]>=2)IntervalN+=2; } } buildT(0,IntervalN,0); for(i=pN-1;i>=0;i--) { if(query(0,mark[Post[i].l],mark[Post[i].r]))ans++; } printf("%d\n",ans); } return 0; }
但是本題仍然存在問題,如下面的測試資料: