• poj 2528Mayor's posters


    http://poj.org/problem?id=2528

    这个题有个细节,整个区间的长度为10000000,而n最大只有1000,所以我们要进行离散化。

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 #define maxn 10010
      5 using namespace std;
      6 
      7 bool tab[maxn];
      8 int l[maxn],r[maxn],x[maxn*3],num[maxn*3],tree[maxn*12];
      9 int c,n;
     10 
     11 int binary_search1(int sum)
     12 {
     13     int l=1,r=3*n;
     14     while(l<=r)
     15     {
     16         int mid=(l+r)/2;
     17         if(x[mid]<=sum)
     18             l=mid+1;
     19         else
     20             r=mid-1;
     21     }
     22     return num[r];
     23 }
     24 
     25 void update(int i)
     26 {
     27     if(!tree[i])
     28         return ;
     29     tree[i+i]=tree[i+i+1]=tree[i];
     30     tree[i]=0;
     31 }
     32 void change(int tl,int tr,int l,int r,int i,int co)
     33 {
     34     if(tl>r||tr<l) return ;
     35     if(tl<=l&&r<=tr)
     36     {
     37         tree[i]=co;
     38         return ;
     39     }
     40     update(i);
     41     int mid=(l+r)/2;
     42     change(tl,tr,l,mid,i+i,co);
     43     change(tl,tr,mid+1,r,i+i+1,co);
     44 }
     45 int require(int l,int r,int i)
     46 {
     47     int mid=(l+r)/2;
     48     if(tree[i])
     49     {
     50         if(!tab[tree[i]])
     51         {
     52             tab[tree[i]]=1;
     53             return 1;
     54         }
     55         return 0;
     56     }
     57     if(l==r)
     58         return 0;
     59     return require(l,mid,i+i)+require(mid+1,r,i+i+1);
     60 }
     61 void init()
     62 {
     63     scanf("%d",&n);
     64     for(int i=1; i<=n; i++)
     65     {
     66         scanf("%d%d",l+i,r+i);
     67         x[i*3-2]=l[i];x[i*3-1]=r[i];x[i*3]=(l[i]+r[i])/2;
     68     }
     69     sort(x+1,x+3*n+1);
     70     memset(num,0,sizeof(num));
     71     for(int i=1; i<=3*n; i++)
     72     {
     73         num[i]=num[i-1];
     74         if(x[i]!=x[i-1]) num[i]++;
     75     }
     76     for(int i=1; i<=n; i++)
     77     {
     78         l[i]=binary_search1(l[i]);
     79         r[i]=binary_search1(r[i]);
     80     }
     81 }
     82 
     83 void solve()
     84 {
     85     memset(tree,0,sizeof(tree));
     86     for(int i=1; i<=n; i++)
     87     {
     88         change(l[i],r[i],1,3*n,1,i);
     89     }
     90     memset(tab,0,sizeof(tab));
     91     int ans=require(1,3*n,1);
     92     printf("%d
    ",ans);
     93 }
     94 
     95 int main()
     96 {
     97     scanf("%d",&c);
     98     while(c--)
     99     {
    100         init();
    101         solve();
    102     }
    103     return 0;
    104 }
    View Code
  • 相关阅读:
    hdu2243之AC自动机+矩阵乘法
    jstl
    HDU 3360 National Treasures 奇偶匹配的最低点覆盖
    【UVA】11992
    what is the difference between definition and declaration in c
    UVALive 6485 Electric Car Rally (BFS,PQ)
    Android发展_备份短信
    vxWorks 命令
    【C++智能指针 auto_ptr】
    Get and Post(Unity3D六个发展)
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3542823.html
Copyright © 2020-2023  润新知