• PKU 2528 Mayor's posters


    第三次写这个题了,这次不再用线段树,因为估计了暴力能过(复杂度的估计不太明显,最坏不超过10^8,实际很可能更低或者大部分情况下更低(O(n)))!

    235ms,超时了几次,猜测是因为memset,所以加了个位优化,AC。

     1 # include <stdio.h>
     2 # include <stdlib.h>
     3 # include <string.h>
     4 
     5 # define id(x) ((x)>>3)
     6 # define of(x) ((x)&0x7)
     7 # define get(x) ((h[id(x)]>>of(x)) & 0x1)
     8 # define set(x) (h[id(x)] |= (0x1 << of(x)))
     9 
    10 # define MAXN 10005
    11 
    12 int n, m, cols;
    13 int l[MAXN], r[MAXN];
    14 int p[MAXN << 2];
    15 short c[MAXN << 2];
    16 char h[(MAXN >> 3) + 5];
    17 
    18 /***************************************************************/
    19 int bins(int *v, int k)
    20 {
    21     int high = m-1, low = 0, mid;
    22     
    23     while (low < high)
    24     {
    25         mid = low + ((high-low)>>1);
    26         if (v[mid] == k) return mid;
    27         else if (v[mid] > k) high = mid - 1;
    28         else low = mid + 1;
    29     }
    30     return low;
    31 }
    32 
    33 int cmp(const void *x, const void *y)
    34 {
    35     return *(int*)x - *(int*)y;
    36 }
    37 
    38 /***************************************************************/
    39 void solve(void)
    40 {
    41     int x, y, i, j, ans;
    42     
    43     cols = 1;
    44     memset(c, 0, sizeof(c[0])*(m>>3));
    45     for (i = 0; i < n; ++i, ++cols)
    46     {
    47         x = bins(p, l[i]), y = bins(p, r[i]);
    48         for (j = x; j <= y; ++j) c[j] = cols;
    49     }
    50     ans = 0;
    51     memset(h, 0, sizeof(char)*((n+8)>>3));
    52     for (i = 0; i < m+5; ++i)
    53     {
    54         if (c[i] && !get(c[i])) set(c[i]), ++ans;
    55     }
    56     printf("%d\n", ans);
    57 }
    58 
    59 int main()
    60 {
    61     int T, i, k;
    62     
    63     scanf("%d", &T);
    64     while (T--)
    65     {
    66         m = 0;
    67         scanf("%d", &n);
    68         for (i = 0; i < n; ++i)
    69         {
    70             scanf("%d%d", &l[i], &r[i]);
    71             p[m++] = l[i], p[m++] = r[i];
    72         }
    73         qsort(p, m, sizeof(p[0]), cmp);
    74         k = m, m = 1;
    75         for (i = 1; i < k; ++i)
    76             if (p[i] == p[m-1]) continue;
    77             else p[m++] = p[i];
    78         k = m;
    79         for (i = 1; i < k; ++i)
    80             if (p[i] != p[i-1]+1) p[m++] = p[i-1]+1;
    81         qsort(p, m, sizeof(p[0]), cmp);
    82         solve();
    83     }
    84     
    85     return 0;
    86 }
  • 相关阅读:
    Django 前戏
    SQL基本语句
    如何正确安装Mysql
    JQuery
    解疑答惑—解决脱离标准文档流(恶心的浮动)
    事件
    卷基于快照进行恢复
    centos7下Firewall使用详解
    基于镜像卷启动的虚机快照代码分析
    nova卸载volume源码分析
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2647165.html
Copyright © 2020-2023  润新知