poj2528—線段樹

來源:互聯網
上載者:User
//成段更新,不必更新到底//id記錄的是節點被編號為id人的海報遮住//牆的長度很長,在建樹時,應以海報貼的最右邊為準,不然會MLE#include <iostream>#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define N 10005int n,m,t,sum,p;struct TNode{    int l,r,id;} node[8*N];int lx[N],rx[N];int lr[2*N];bool vis[N];void build(int root,int l,int r){    node[root].id=0;    node[root].l=l,node[root].r=r;    if(l==r) return ;    int mid=(l+r)>>1,p=root<<1;    build(p,l,mid);    build(p+1,mid+1,r);}void insert(int root,int l,int r,int id){    int mid,p=root<<1;    if(node[root].l==l&&node[root].r==r)    {        node[root].id=id;        return ;    }    if(node[root].id>0)    {        node[p].id=node[root].id;        node[p+1].id=node[root].id;        node[root].id=0;    }    mid=(node[root].l+node[root].r)>>1;    if(r<=mid) insert(p,l,r,id);    else if(l>mid) insert(p+1,l,r,id);    else    {        insert(p,l,mid,id);        insert(p+1,mid+1,r,id);    }}void query(int root,int l,int r){    int mid,p;    mid=(node[root].l+node[root].r)>>1;    p=root<<1;    if(node[root].id>0)    {        if(vis[node[root].id]==0)        {            sum++;            vis[node[root].id]=1;        }        return ;    }    if(r<=mid) query(p,l,r);    else if(l>mid) query(p+1,l,r);    else    {        query(p,l,mid);        query(p+1,mid+1,r);    }}int find(int x){    int l=0,r=p-1,mid;    while(l<=r)    {        mid=(l+r)>>1;        if(lr[mid]==x) return mid;        else if(lr[mid]<x) l=mid+1;        else r=mid-1;    }    return -1;}int main(){    int l,i,r,k;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        memset(vis,0,sizeof(vis));        for(k=1,p=0; k<=n; k++)        {            scanf("%d%d",&lx[k],&rx[k]);            lr[p++]=lx[k];            lr[p++]=rx[k];        }        sort(lr,lr+p);        k=p;        for(i=1,p=0;i<k;i++)        {            if(lr[i]!=lr[p]) lr[++p]=lr[i];        }        p++;        build(1,1,p);        for(i=1;i<=n;i++)        {            if(lx[i]>rx[i]) swap(lx[i],rx[i]);            int l=find(lx[i]),r=find(rx[i]);            insert(1,l+1,r+1,i);        }        sum=0;        query(1,1,p);        printf("%d\n",sum);    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.