• poj 2528 Mayor's posters(线段树)


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

    题意:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度。现在往墙上贴N张海报,每张海报的宽度是任意的,

    但是必定是单位宽度的整数倍,且<=1QW。后贴的海报若与先贴的海报有交集,后贴的海报必定会全部或局部覆盖

    先贴的海报。现在给出每张海报所贴的位置(左端位置和右端位置),问张贴完N张海报后,还能看见多少张海报?

    (离散化)+ 线段树

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <algorithm>
      5 using namespace std;
      6 const int maxn = 10000+10;
      7 int n, cnt;
      8 int map[2*maxn][2], ans, f[2*maxn];
      9 struct node
     10 {
     11     int l, r, n;  //n代表是哪种颜色
     12 } a[8*maxn];
     13 struct node2
     14 {
     15     int point, num;  //原来点的编号, 新编的号
     16 } s[8*maxn];
     17 void init(int l, int r, int i) //建树
     18 {
     19     a[i].l = l;
     20     a[i].r = r;
     21     a[i].n = 0;
     22     if(l != r)
     23     {
     24         int mid = (l+r)/2;
     25         init(l, mid, 2*i);
     26         init(mid+1, r, 2*i+1);
     27     }
     28 }
     29 void insert(int i, int l, int r, int m)//从第i个点,查找区间【l,r】,并把颜色标记为m
     30 {
     31     if(a[i].l == l && a[i].r == r)
     32     {
     33         a[i].n = m;
     34         return;
     35     }
     36     int mid = (a[i].l+a[i].r)/2;
     37     if(a[i].n>0)  //颜色已有,对其子树赋值
     38     {
     39         a[2*i].n = a[i].n;
     40         a[2*i+1].n = a[i].n;
     41         a[i].n = 0;
     42     }
     43     if(l >= a[2*i+1].l)
     44     insert(2*i+1, l, r, m);
     45     else if(r <= a[2*i].r)
     46     insert(2*i, l, r, m);
     47     else
     48     {
     49         insert(2*i, l, mid, m);
     50         insert(2*i+1, mid+1, r, m);
     51     }
     52 }
     53 void solve(int i)
     54 {
     55     if(a[i].n)
     56     {
     57         if(!f[a[i].n])
     58         {
     59             ans++;
     60             f[a[i].n] = 1;
     61         }
     62         return;
     63     }
     64     solve(2*i);
     65     solve(2*i+1);
     66 }
     67 int cmp(node2 x, node2 y)
     68 {
     69     return x.point<y.point;
     70 }
     71 
     72 int main()
     73 {
     74     int t, i, tmp, cnt;
     75     scanf("%d", &t);
     76     while(t--)
     77     {
     78         scanf("%d", &n);
     79         for(i = 0; i < n; i++)
     80         {
     81             scanf("%d%d", &map[i][0], &map[i][1]);
     82             s[i*2].point = map[i][0];
     83             s[i*2+1].point = map[i][1];
     84             s[2*i].num = -(i+1);
     85             s[2*i+1].num = i+1;
     86         }
     87         sort(s, s+2*n, cmp);
     88         tmp = s[0].point;
     89         cnt = 1;
     90         for(i = 0; i < 2*n; i++)
     91         {
     92             if(tmp != s[i].point)
     93             {
     94                 cnt++;
     95                 tmp = s[i].point;
     96             }
     97             if(s[i].num < 0)
     98                 map[-s[i].num-1][0] = cnt;
     99             else
    100                 map[s[i].num-1][1] = cnt;
    101         }
    102         init(1, cnt, 1);
    103         for(i = 0; i < n; i++)
    104             insert(1, map[i][0], map[i][1], i+1);
    105         memset(f, 0, sizeof(f));
    106         ans = 0;
    107         solve(1);
    108         printf("%d
    ",ans);
    109     }
    110     return 0;
    111 }
  • 相关阅读:
    2014年互联网发展趋势如何
    服务器出现阶段性错误
    用互联网思想武装自己
    杭州互联网公司汇总
    互联网牛人网址大全
    ffmpeg开发指南
    Windows下FFmpeg快速入门
    FFmpeg介绍及参数详细说明
    windows 下FFMPEG的编译方法 附2012-9-19发布的FFMPEG编译好的SDK下载
    FFMPEG视音频编解码零基础学习方法 【荐】
  • 原文地址:https://www.cnblogs.com/bfshm/p/3554830.html
Copyright © 2020-2023  润新知