【BZOJ】4643 卡常大水题【bitset优化bfs】

本文介绍了一道名为“卡常大水题”的算法题目,通过使用C++实现复杂的数据结构如Bitset来优化图遍历算法。该文详细展示了如何通过节点排序和优先队列来寻找最优解的过程。
ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

题目链接:卡常大水题

#include <bits/stdc++.h>
using namespace std ;

typedef long long LL ;
typedef pair < int , int > pii ;
typedef unsigned int UI ;

#define clr( a , x ) memset ( a , x , sizeof a )

const int MAXN = 155 ;
const int BLOCK = 5 ;

struct Node {
    int x , y , i , j ;
    bool operator < ( const Node& a ) const {
        return x != a.x ? x < a.x : y < a.y ;
    }
} ;

struct Bitset {
    UI c[BLOCK] ;
    bool none () {
        for ( int i = 0 ; i < BLOCK ; ++ i ) {
            if ( c[i] ) return 0 ;
        }
        return 1 ;
    }
    void set () {
        for ( int i = 0 ; i < BLOCK ; ++ i ) {
            c[i] = ~0U ;
        }
    }
    void reset () {
        for ( int i = 0 ; i < BLOCK ; ++ i ) {
            c[i] = 0 ;
        }
    }
    void flip ( int x ) {
        c[x >> 5] ^= 1U << ( x & 31 ) ;
    }
    UI& operator [] ( const int index ) {
        return c[index] ;
    }
} ;

Node a[MAXN * MAXN] ;
Bitset V1[MAXN] , V2[MAXN] , vis ;
UI pos[MAXN] , val[MAXN] ;
int n , m , LIM ;

int bfs ( Bitset G[MAXN] ) {
    vis.set () ;
    vis.flip ( 0 ) ;
    queue < int > Q ;
    Q.push ( 0 ) ;
    while ( !Q.empty () ) {
        int u = Q.front () ;
        Q.pop () ;
        for ( int i = 0 ; i < LIM ; ++ i ) {
            for ( UI j = G[u][i] & vis[i] ; j ; j -= j & -j ) {
                int v = __builtin_ctz ( j ) ;
                vis[i] ^= 1U << v ;
                Q.push ( i << 5 | v ) ;
            }
        }
    }
    for ( int i = 0 ; i < n ; ++ i ) {
        if ( vis[pos[i]] & val[i] ) return 0 ;
    }
    return 1 ;
}

void solve () {
    LIM = ( n - 1 ) / 32 + 1 ;
    m = 0 ;
    for ( int i = 0 ; i < n ; ++ i ) {
        V1[i].reset () ;
        V2[i].reset () ;
        pos[i] = i / 32 ;
        val[i] = 1U << ( i % 32 ) ;
        for ( int j = 0 ; j < n ; ++ j , ++ m ) {
            scanf ( "%d" , &a[m].x ) ;
            a[m].i = i ;
            a[m].j = j ;
        }
    }
    m = 0 ;
    for ( int i = 0 ; i < n ; ++ i ) {
        for ( int j = 0 ; j < n ; ++ j , ++ m ) {
            scanf ( "%d" , &a[m].y ) ;
        }
    }
    sort ( a , a + m ) ;
    int ans = INT_MAX ;
    priority_queue < pii > q ;
    for ( int i = 0 ; i < m ; ++ i ) {
        V1[a[i].i].flip ( a[i].j ) ;
        V2[a[i].j].flip ( a[i].i ) ;
        q.push ( pii ( a[i].y , i ) ) ;
        while ( !q.empty () ) {
            int t = q.top ().second ;
            V1[a[t].i].flip ( a[t].j ) ;
            V2[a[t].j].flip ( a[t].i ) ;
            if ( !bfs ( V1 ) || !bfs ( V2 ) ) {
                V1[a[t].i].flip ( a[t].j ) ;
                V2[a[t].j].flip ( a[t].i ) ;
                break ;
            }
            q.pop () ;
            ans = min ( ans , a[i].x + q.top ().first ) ;
        }
    }
    printf ( "%d\n" , ans ) ;
}

int main () {
    //freopen ( "inputf.in" , "r" , stdin ) ;
    while ( ~scanf ( "%d" , &n ) ) solve () ;
    //printf ( "%.3f\n" , 1.0 * clock () / CLOCKS_PER_SEC ) ;
    return 0 ;
}

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值