• 【POJ】2528 Mayor's posters


      1 #include<cstdio>
      2 #include<cstring>
      3 #include<cstdlib>
      4 #define MAXN 50010
      5 struct node
      6 {
      7     int x,y;
      8 };
      9 node a[MAXN],p[MAXN];
     10 int cmp(const void *a,const void *b)
     11 {
     12     return (*(node *)a).x-(*(node *)b).x;
     13 }
     14 int ans,tree[MAXN<<2];
     15 bool vis[MAXN];
     16 inline void PushDown(int rt)
     17 {
     18     if(tree[rt])
     19     {
     20         tree[rt<<1]=tree[rt<<1|1]=tree[rt];
     21         tree[rt]=0;
     22     }
     23 }
     24 void Update(int x,int y,int val,int L,int R,int rt)
     25 {
     26     if(x<=L&&R<=y)
     27         tree[rt]=val;
     28     else
     29     {
     30         int mid=(L+R)>>1;
     31         PushDown(rt);
     32         if(mid>=x)
     33             Update(x,y,val,L,mid,rt<<1);
     34         if(y>mid)
     35             Update(x,y,val,mid+1,R,rt<<1|1);
     36     }
     37 }
     38 void Query(int L,int R,int rt)
     39 {
     40     if(tree[rt])
     41     {
     42         if(!vis[tree[rt]])
     43         {
     44             vis[tree[rt]]=true;
     45             ans++;
     46         }
     47     }
     48     else if(L!=R)
     49     {
     50         int mid=(L+R)>>1;
     51         Query(L,mid,rt<<1);
     52         Query(mid+1,R,rt<<1|1);
     53     }
     54 }
     55 int Bin(int low,int high,int val)
     56 {
     57     int mid;
     58     while(low<high)
     59     {
     60         mid=(high+low)>>1;
     61         if(a[mid].x==val)
     62             return a[mid].y;
     63         if(a[mid].x>val)
     64             high=mid;
     65         else
     66             low=mid+1;
     67     }
     68 }
     69 int main()
     70 {
     71     int c,n,i,j,k;
     72     scanf("%d",&c);
     73     while(c--)
     74     {
     75         scanf("%d",&n);
     76         for(i=k=0;i<n;i++)
     77         {
     78             scanf("%d%d",&p[i].x,&p[i].y);
     79             a[k++].x=p[i].x;
     80             a[k++].x=p[i].y;
     81         }
     82         qsort(a,k,sizeof(a[0]),cmp);
     83         for(i=j=0;i<k;i++)
     84         {
     85             if(a[i].x!=a[j].x)
     86                 a[++j]=a[i];
     87         }
     88         k=j+1;
     89         a[0].y=j=1;
     90         for(i=1;i<k;i++)
     91         {
     92             if(a[i].x==a[i-1].x+1)
     93                 j++;
     94             else
     95                 j+=2;
     96             a[i].y=j;
     97         }
     98         memset(tree,0,sizeof(tree));
     99         memset(vis,false,sizeof(vis));
    100         for(i=ans=0;i<n;i++)
    101             Update(Bin(0,k,p[i].x),Bin(0,k,p[i].y),i+1,1,j,1);
    102         Query(1,j,1);
    103         printf("%d\n",ans);
    104     }
    105     return 0;
    106 }
    新博客:www.zhixiangli.com
  • 相关阅读:
    OpenJudge 6042 雇佣兵
    POJ 1741 树上 点的 分治
    Codevs 1695 Windows2013
    复制书稿
    乘积最大
    编辑距离问题
    石子合并
    最大正方形子矩阵
    选菜
    混合背包
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2512492.html
Copyright © 2020-2023  润新知