zoukankan      html  css  js  c++  java
  • poj 2528 Mayor's posters

    线段树+区间离散化:弄了好久,注意数组范围。

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<stdlib.h>
      4 #define MAXN 10000+100
      5 
      6 int T, n, a[MAXN<<2], b[MAXN<<2], r[MAXN<<2], h[MAXN<<2], to[MAXN<<4];
      7 
      8 int cmp(const void *_p, const void *_q)
      9 {
     10     int *p = (int *)_p;
     11     int *q = (int *)_q;
     12     return a[*p]-a[*q];    
     13 }
     14 
     15 void build(int cur,int x, int y)
     16 {
     17     int mid = (x+y)>>1, ls = cur<<1, rs = cur<<1|1;
     18     to[cur] = -1;
     19     if(x == y) return;
     20     build(ls, x, mid);
     21     build(rs, mid+1, y);
     22 }
     23 
     24 void pushdown(int cur)
     25 {
     26     int ls = cur<<1, rs = cur<<1|1;
     27     if(to[cur] != -1)
     28     {
     29         to[ls] = to[rs] = to[cur];
     30         to[cur] = -1;
     31     }
     32 }
     33 
     34 void color(int cur, int x, int y, int s, int t, int v)
     35 {
     36     int mid = (x+y)>>1, ls = cur<<1, rs = cur<<1|1;
     37     if(x>=s && y<=t)
     38     {
     39         to[cur] = v;
     40         return ;
     41     }
     42     pushdown(cur);
     43     if(mid>=s)
     44         color(ls, x, mid, s, t, v);
     45     if(mid+1<=t)
     46         color(rs, mid+1, y, s, t, v);
     47 }
     48 
     49 void search(int cur, int x, int y, int &ans)
     50 {
     51     int mid = (x+y)>>1, ls = cur<<1, rs = cur<<1|1;
     52     if(to[cur] != -1)
     53     {
     54         if(!h[to[cur]])
     55         {
     56             ans++;//printf("cur=%d\n",cur);
     57             h[to[cur]] = 1;
     58         }
     59         return ;
     60     }
     61     if(x == y) return ;
     62     search(ls, x, mid, ans);
     63     search(rs, mid+1, y, ans);
     64 }
     65 
     66 void init()
     67 {
     68     while(~scanf("%d",&T))
     69     while(T--)
     70     {
     71         scanf("%d",&n);
     72         for(int i = 1; i <= n*2; i ++)
     73         {
     74             scanf("%d",&a[i]);
     75         }
     76         for(int i = 0; i <= n*2; i ++)
     77             r[i] = i;
     78             a[0] = -1;
     79         qsort(r+1, 2*n, sizeof(r[0]), cmp);//for(int i = 0; i <=2*n; i ++)printf("a[r[i]]=%d\n",a[r[i]]);puts("");
     80         int p = 0;
     81         for(int i = 1; i <= 2*n; i ++)
     82         {//printf("a[r[i-1]]=%d a[r[i]]=%d\n",a[r[i-1]], a[r[i]]);
     83             if(a[r[i]]-a[r[i-1]] >= 1) {p += 1;b[r[i]] = p;}
     84             //else if(a[r[i]]-a[r[i-1]] > 1){p += 2; b[r[i]] = p;}
     85             else b[r[i]] = b[r[i-1]];
     86         }//for(int i = 0; i <=2*n; i ++)printf("a[r[i]]=%d\n",b[r[i]]);
     87         build(1,1,p);
     88         int v = 0;
     89         for(int i = 1; i <= 2*n; i += 2)
     90         {
     91             v ++;//printf("b[i]=%d b[i+1]=%d\n",b[i],b[i+1]);
     92             color(1, 1, p, b[i], b[i+1], v);
     93         }//for(int i = 0; i < 30; i ++) printf("i=%d to[i]=%d\n",i,to[i]);
     94         int ans = 0;
     95         memset(h, 0, sizeof(h[0])*(v+10));
     96         search(1, 1, p, ans);
     97         printf("%d\n",ans);
     98     }
     99 }
    100 int main()
    101 {
    102     init();    
    103     return 0;
    104 }
  • 相关阅读:
    Js onmouseover和onmouseout小特效
    js操作元素透明度以及浏览器兼容性
    大多数人不知道的表格其他写法的onmouseover效果
    表格的删除与添加以及id的唯一性
    添加或创建元素,最新消息在最上方
    数组元素排序
    删除父级元素
    网页侧栏小分享
    如何利用极致业务基础平台构建一个通用企业ERP之十七过滤器的功能介绍
    如何利用极致业务基础平台构建一个通用企业ERP之十六物料进出明细报表的设计
  • 原文地址:https://www.cnblogs.com/yuzhaoxin/p/2654117.html
Copyright © 2011-2022 走看看