zoukankan      html  css  js  c++  java
  • poj 2528 动态线段树

    动态建立结点就不用离散化了,细节见代码,相信还是比较好理解的。

      1 #include <iostream>
      2 #include <cstring>
      3 #include <cstdio>
      4 #include <set>
      5 using namespace std;
      6 
      7 const int N = 500000;
      8 set<int> s;
      9 int cnt;
     10 
     11 struct Node
     12 {
     13     int lc, rc, l, r, c;
     14     void init( int _l, int _r, int _c )
     15     {
     16         l = _l, r = _r, c = _c;
     17         lc = rc = -1;
     18     }
     19 } node[N << 2];
     20 
     21 void pushdown( int i )
     22 {
     23     if ( node[i].c != -1 )
     24     {
     25         node[node[i].lc].c = node[i].c;
     26         node[node[i].rc].c = node[i].c;
     27         node[i].c = -1;
     28     }
     29 }
     30 
     31 void update( int i, int l, int r, int c )
     32 {
     33     if ( node[i].l == l && node[i].r == r )
     34     {
     35         node[i].c = c;
     36         return ;
     37     }
     38     int mid = ( node[i].l + node[i].r ) >> 1;
     39     if ( node[i].lc == -1 )
     40     {
     41         node[i].lc = cnt;
     42         node[cnt].init( node[i].l, mid, -1 );
     43         cnt++;
     44     }
     45     if ( node[i].rc == -1 )
     46     {
     47         node[i].rc = cnt;
     48         node[cnt].init( mid + 1, node[i].r, -1 );
     49         cnt++;
     50     }
     51     pushdown(i);
     52     if ( r <= mid )
     53     {
     54         update( node[i].lc, l, r, c );
     55     }
     56     else if ( l > mid )
     57     {
     58         update( node[i].rc, l, r, c );
     59     }
     60     else
     61     {
     62         update( node[i].lc, l, mid, c );
     63         update( node[i].rc, mid + 1, r, c );
     64     }
     65 }
     66 
     67 void dfs( int i )
     68 {
     69     if ( node[i].c != -1 )
     70     {
     71         s.insert( node[i].c );
     72         return ;
     73     }
     74     if ( node[i].lc != -1 ) dfs( node[i].lc );
     75     if ( node[i].rc != -1 ) dfs( node[i].rc );
     76 }
     77 
     78 int main ()
     79 {
     80     int t;
     81     scanf("%d", &t);
     82     while ( t-- )
     83     {
     84         int n;
     85         scanf("%d", &n);
     86         node[0].init( 1, 10000000, -1 );
     87         cnt = 1;
     88         s.clear();
     89         for ( int i = 0; i < n; i++ )
     90         {
     91             int l, r;
     92             scanf("%d%d", &l, &r);
     93             if ( l > r ) swap( l, r );
     94             update( 0, l, r, i );
     95         }
     96         dfs(0);
     97         printf("%d
    ", s.size());
     98     }
     99     return 0;
    100 }
  • 相关阅读:
    jvm的方法栈在干什么
    时间段交集查询
    linux 设置静态ip配置
    elk 学习
    内网穿透 https:natapp.cn
    mysql当前时间,日期转换,日期格式化
    swaggerui api.docs
    linux java -jar 后台进程
    druid 数据源 sql控制台输出
    spring pointcut 表达式
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/4815936.html
Copyright © 2011-2022 走看看