zoukankan      html  css  js  c++  java
  • POJ 2528 Mayor's posters 线段树+离散化

    离散化的时候,排序后相邻点差值大于1的话需要加点。

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <cstdlib>
      4 #include <algorithm>
      5 
      6 #define lson l, m, rt << 1
      7 #define rson m + 1, r, rt << 1 | 1
      8 
      9 using namespace std;
     10 
     11 const int MAXN = 42222;
     12 
     13 struct node
     14 {
     15     int id;
     16     int a, b;
     17 };
     18 
     19 int n;
     20 int flag[ ( MAXN << 2 ) << 2 ];
     21 int color[ ( MAXN << 2 ) << 2 ];
     22 int val[ MAXN << 2 ];
     23 node Q[MAXN];
     24 bool vis[ MAXN << 2 ];
     25 
     26 void PushDown( int rt )
     27 {
     28     int lc = rt << 1;
     29     int rc = rt << 1 | 1;
     30     if ( flag[rt] != -1 )
     31     {
     32         flag[lc] = flag[rc] = flag[rt];
     33         color[lc] = color[rc] = flag[rt];
     34         flag[rt] = -1;
     35     }
     36     return;
     37 }
     38 
     39 void build( int l, int r, int rt )
     40 {
     41     color[rt] = -1;
     42     flag[rt] = -1;
     43     if ( l == r ) return;
     44     int m = ( l + r ) >> 1;
     45     build(lson);
     46     build(rson);
     47     return;
     48 }
     49 
     50 void Update( int L, int R, int c, int l, int r, int rt )
     51 {
     52     if ( L <= l && r <= R )
     53     {
     54         color[rt] = flag[rt] = c;
     55         return;
     56     }
     57     PushDown(rt);
     58     int m = ( l + r ) >> 1;
     59     if ( L <= m ) Update( L ,R, c, lson );
     60     if ( R > m ) Update( L ,R, c, rson );
     61     return;
     62 }
     63 
     64 int Query( int c, int l, int r, int rt )
     65 {
     66     if ( l == c && r == c )
     67         return color[rt];
     68 
     69     PushDown( rt );
     70     int m = ( l + r ) >> 1;
     71     if ( c <= m ) return Query( c, lson );
     72     else return Query( c, rson );
     73 }
     74 
     75 int main()
     76 {
     77     int T;
     78     scanf( "%d", &T );
     79     while ( T-- )
     80     {
     81         scanf( "%d", &n );
     82         int cnt = 0;
     83         for ( int i = 0; i < n; ++i )
     84         {
     85             scanf( "%d%d", &Q[i].a, &Q[i].b );
     86             val[ cnt++ ] = Q[i].a;
     87             val[ cnt++ ] = Q[i].b;
     88             Q[i].id = i + 1;
     89         }
     90         sort( val, val + cnt );
     91 
     92         int len = cnt;
     93         for ( int i = 1; i < len; ++i )
     94         {
     95             if ( val[i] - val[i - 1] > 1 )
     96             {
     97                 val[cnt++] = val[i] - 1;
     98             }
     99         }
    100 
    101         sort( val, val + cnt );
    102         cnt = unique( val, val + cnt ) - val;
    103 
    104 //        for ( int i = 0; i < cnt; ++i )
    105 //            printf( "%d ", val[i] );
    106 //        puts("");
    107 
    108         build( 0, cnt - 1, 1 );
    109 
    110         for ( int i = 0; i < n; ++i )
    111         {
    112             int left = lower_bound( val, val + cnt, Q[i].a ) - val;
    113             int right = lower_bound( val, val + cnt, Q[i].b ) - val;
    114             //printf( "%d %d
    ", left, right );
    115             Update( left, right, Q[i].id, 0, cnt - 1, 1 );
    116         }
    117 
    118         memset( vis, false, sizeof(vis) );
    119         for ( int i = 0; i < cnt; ++i )
    120         {
    121             int ans = Query( i, 0, cnt - 1, 1 );
    122             if ( ans != -1 ) vis[ans] = true;
    123         }
    124 
    125         int ans = 0;
    126         for ( int i = 1; i <= n; ++i )
    127             if ( vis[i] ) ++ans;
    128 
    129         printf( "%d
    ", ans );
    130     }
    131     return 0;
    132 }
  • 相关阅读:
    VSCode前端 插件
    restframework 分页组件、响应器
    restframework 解析器、渲染器、url控制组件
    __getattr__
    apply和call的用法
    继承
    原型的指向改变
    局部变量变全局变量
    构造函数和实例对象和原型对象之间的关系
    _proto_和prototype
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/3216688.html
Copyright © 2011-2022 走看看