CF 356A Knight Tournament(并查集)

CF 356A Knight Tournament(并查集)

题意:区间染色问题。

解题思路:比赛时用线段树无脑A了。后来用并查集搞了下。要注意的地方是自己不能染,所以分了两段处理。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std ;

const int maxn = 300003 ;
int fa[maxn] , col[maxn] ;

int find ( int a ) {
    return ( fa[a] == a ? a : fa[a] = find ( fa[a] ) ) ;
}

void jion ( int l , int r , int c ) {
    while ( l <= r ) {
        int x = find ( l ) ;
        if ( x == l ) {
            col[l] = c ;
            fa[l] = l + 1 ;
        }
        l = fa[l] ;
    }
}

int main () {
    int n , i , m ;
    scanf ( "%d%d" , &n , &m ) ;
    for ( i = 1 ; i <= n + 1 ; i ++ ) fa[i] = i ;
    while ( m -- ) {
        int l , r , x ;
        scanf ( "%d%d%d" , &l , &r , &x ) ;
        jion ( l , x - 1 , x ) ;
        jion ( x + 1 , r , x ) ;
    }
        for ( i = 1 ; i <= n ; i ++ )
            printf ( "%d " , col[i] ) ;
        puts ( "" ) ;
    return 0 ;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值