⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2985.txt

📁 北大ACM题目例程 详细的解答过程 程序实现 算法分析
💻 TXT
字号:
Problem Id:2985  User Id:fzk 
Memory:3160K  Time:701MS
Language:C++  Result:Accepted

Source 

#include "stdio.h"
#include "memory.h"

int tree[600000];

int k, key;
void set( int l, int r, int s ) {
	int c = (l+r)/2;
	
	tree[s] += key;
	
	if( r == l+1 )
		return;
	if( k < c )
		set( l, c, s*2+1 );
	else
		set( c, r, s*2+2 );
}

int get( int l, int r, int s ) {
	int c = (l+r)/2;
//	printf( "%d %d %d\n", l, r, tree[s] );
	if( r == l+1 )
		return l;
	
	if( tree[s*2+1] >= k )
		return get( l, c, s*2+1 );
	else {
		k -= tree[s*2+1];
		return get( c, r, s*2+2 );
	}
}

int p[200100], n, m;
int st[200100], sn;

int find( int k ) {
	 for( sn=0; p[k] >= 0; k = p[k] )
	 	st[sn++] = k;
	 while( sn-- )
	 	p[ st[sn] ] = k;
	 return k;
}

void merge( int a, int b ) {
	key = -1;
		
	k = -p[a];
	set( 0, n+1, 0 );
	k = -p[b];
	set( 0, n+1, 0 );
	
	k = -p[a]-p[b];
	key = 1;
	set( 0, n+1, 0 );
	
	if( -p[a] < -p[b] )
		p[a] = b, p[b] = -k;
	else
		p[b] = a, p[a] = -k;
}

int main( ) {
	int i, j, c, h;
	scanf( "%d%d", &n, &m );
	memset( tree, 0, sizeof tree );
	memset( p, -1, sizeof p );
	
	key = n;
	k=1;
	set( 0, n+1, 0 );
	h = n;
	
	while( m-- ) {
		scanf( "%d", &c );
		if( c == 0 ) {
			scanf( "%d%d", &i, &j );
			i = find(i);
			j = find(j);
			if( i != j ) {
				merge( i, j );
				h--;
			}
		}
		else {
			scanf( "%d", &k );
			k = h-k+1;
			printf( "%d\n", get( 0, n+1, 0 ) );
		}
	}
	return 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -