您的位置:首页 > 其它

poj 2528 动态线段树

2015-09-17 12:00 274 查看
动态建立结点就不用离散化了,细节见代码,相信还是比较好理解的。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <set>
using namespace std;

const int N = 500000;
set<int> s;
int cnt;

struct Node
{
int lc, rc, l, r, c;
void init( int _l, int _r, int _c )
{
l = _l, r = _r, c = _c;
lc = rc = -1;
}
} node[N << 2];

void pushdown( int i )
{
if ( node[i].c != -1 )
{
node[node[i].lc].c = node[i].c;
node[node[i].rc].c = node[i].c;
node[i].c = -1;
}
}

void update( int i, int l, int r, int c )
{
if ( node[i].l == l && node[i].r == r )
{
node[i].c = c;
return ;
}
int mid = ( node[i].l + node[i].r ) >> 1;
if ( node[i].lc == -1 )
{
node[i].lc = cnt;
node[cnt].init( node[i].l, mid, -1 );
cnt++;
}
if ( node[i].rc == -1 )
{
node[i].rc = cnt;
node[cnt].init( mid + 1, node[i].r, -1 );
cnt++;
}
pushdown(i);
if ( r <= mid )
{
update( node[i].lc, l, r, c );
}
else if ( l > mid )
{
update( node[i].rc, l, r, c );
}
else
{
update( node[i].lc, l, mid, c );
update( node[i].rc, mid + 1, r, c );
}
}

void dfs( int i )
{
if ( node[i].c != -1 )
{
s.insert( node[i].c );
return ;
}
if ( node[i].lc != -1 ) dfs( node[i].lc );
if ( node[i].rc != -1 ) dfs( node[i].rc );
}

int main ()
{
int t;
scanf("%d", &t);
while ( t-- )
{
int n;
scanf("%d", &n);
node[0].init( 1, 10000000, -1 );
cnt = 1;
s.clear();
for ( int i = 0; i < n; i++ )
{
int l, r;
scanf("%d%d", &l, &r);
if ( l > r ) swap( l, r );
update( 0, l, r, i );
}
dfs(0);
printf("%d\n", s.size());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: