1. 程式人生 > >線段樹+離散化操作(poj 2528)

線段樹+離散化操作(poj 2528)

#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;
}



但是本題仍然存在問題,如下面的測試資料: