首页 > 其他分享 >「ABC245G」 Foreign Friends

「ABC245G」 Foreign Friends

时间:2024-12-20 15:21:43浏览次数:3  
标签:read ll while Foreign vis dijkstra ABC245G Friends dis

题意

一张 \(n\) 个点,\(m\) 条边的图,每个点都有给定的颜色 \(col_i\)。给定 \(l\) 个点作为“特殊点” ,求出每个点到最近的颜色不同“特殊点” 的距离。

分析

学校里定时训练的 abc 套题,赛时直接跳了。

赛后看,结果是一个套路题。

枚举的二进制位,类似 旅行者,然后比对 \(col_i\) 二进制当前位的数字,在跑最短路时更新答案。

注意每一位都要跑两次最短路,一次以所有当前位为 \(0\) 的做起点;一次以当前位为 \(1\) 的做起点。

具体实现可以看代码(做这个题的人应该看得懂吧)。

因为枚举二进制,所以用 dijkstra 跑最短路时间复杂度有两个 \(\log\),是 \(O(m\log n\log k)\)。

Code

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
#define dbg(x) cout<<#x<<": "<<x<<"\n"
inline ll read(){ll x=0,f=1;char c=getchar();while(c<48||c>57){if(c==45)f=0;c=getchar();}while(c>47&&c<58)x=(x<<3)+(x<<1)+(c^48),c=getchar();return f?x:-x;}
const ll mod=1e9+7,maxn=2e5+5,maxt=505;
ll n,m,k,l,col[maxn],ans[maxn],dis[maxn],vis[maxn];
vector<ll>ts;
vector<pair<ll,ll> >son[maxn];
priority_queue<pair<ll,ll>,vector<pair<ll,ll> >,greater<pair<ll,ll> > >q;
inline void dijkstra(ll s,ll val){
    memset(vis,0,sizeof(vis));
    while(!q.empty()){
        ll u=q.top().second;q.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(auto to:son[u]){
            ll v=to.first,d=to.second;
            if(dis[u]+d<dis[v]){
                dis[v]=dis[u]+d;
                if((col[v]>>s&1)==val)ans[v]=min(ans[v],dis[v]);
                q.push({dis[v],v});
            }
        }
    }
}
inline void solve(){
    n=read(),m=read(),k=read(),l=read();
    for(ll i=1;i<=n;++i)col[i]=read();
    for(ll i=1;i<=l;++i){
        ts.push_back(read());
    }
    for(ll i=1;i<=m;++i){
        ll u=read(),v=read(),w=read();
        son[u].push_back({v,w});
        son[v].push_back({u,w});
    }
    memset(ans,0x3f,sizeof(ans));
    for(ll i=0;i<=17;++i){
        while(!q.empty())q.pop();
        memset(dis,0x3f,sizeof(dis));
        for(auto u:ts){
            if(col[u]>>i&1)q.push({0,u}),dis[u]=0;
        }
        dijkstra(i,0);
        while(!q.empty())q.pop();
        memset(dis,0x3f,sizeof(dis));
        for(auto u:ts){
            if((col[u]>>i&1)==0)q.push({0,u}),dis[u]=0;
        }
        dijkstra(i,1);
    }
    for(ll i=1;i<=n;++i){
        if(ans[i]>=1e14)printf("-1 ");
        else printf("%lld ",ans[i]);
    }
}
signed main(){
    ll t=1;
    while(t--){
        solve();
    }
    return 0;
}

标签:read,ll,while,Foreign,vis,dijkstra,ABC245G,Friends,dis
From: https://www.cnblogs.com/run-away/p/18619355

相关文章

  • 老友记台词 第二季 第十八集 Friends 218(全英版)
    文章目录218Dr.RemoreDies[Scene:MonicaandRachel'sapartment.EveryoneexceptRossistherewatchingDaysofOurLives.][Scene:ChandlerandEddie'sapartment.ChandlerisatthefoosballtabletryingtogetPhoebetoplayagamewithhim.][Sce......
  • MySQL 中的 FOREIGN KEY 约束:确保数据完整性的关键
    在MySQL数据库中,FOREIGNKEY(外键)约束是一种非常重要的机制,它可以帮助我们确保数据的完整性和一致性。那么,FOREIGNKEY约束究竟是什么呢?让我们一起来深入了解一下。一、什么是FOREIGNKEY约束?FOREIGNKEY约束是一种用于建立两个表之间关系的约束。它通过在一个表中定义一个......
  • 2024Mysql And Redis基础与进阶操作系列(4)作者——LJS[含MySQL FOREIGN KEY、CHECK 、D
    接上集1.FOREIGNKEY约束1.1作用限定某个表的某个字段的引用完整性。例如:员工表的员工所在部门的选择,必须在部门表能找到对应的部分。1.2关键字FOREIGNKEY1.3主表和从表/父表和子表主表(父表):被引用的表,被参考的表从表(子表):引用别人的表,参考别人的表例如:员工表的员工所在部门这......
  • 老友记台词 第一季 第十七集 Friends 117(全英版)
    文章目录117TheOneWithTwoParts,Part2[Scene:AnEmergencyRoom,RachelandMonicaenter.RachelislimpingandleaningonMonicaforsupport.][Scene:CentralPerk,Chandler,hassplituphisnewspapersoJoeycanlookatthefunnies,whileRoss'......
  • Steps to remove a foreign key entry
    Herearethegeneralstepstoremoveaforeignkeyentry:Identifythetableandcolumnthatcontainstheforeignkeyconstraint.Disabletheforeignkeyconstrainttoallowthedeletionoftherelatedrecords.Thiscanusuallybedoneusingdatabasemanage......
  • CF241B Friends 题解
    是异或粽子的超级加强版,但是本题因为\(m\)很大,不能套用那一题的解法。换一种思路:考虑把\(a_i\)从高位到低位插入0-1Trie之后,二分第\(m\)大,通过第\(m\)大求答案。对于二分的一个值\(x\),枚举每个位置\(i\),在0-1Trie上找与\(a_i\)异或值大于等于\(x\)的值的......
  • Friends
    注意到这里\(m\)太大了,我们肯定没办法把所有的前\(m\)大的数找出来,所以我们只能先尝试把第\(m\)大的数找出来这里的trick跟上一题一样,先将\(m\)乘以\(2\),但是这里必须二分第\(m\)大的值,设为\(ans\)找到之后我们再统计严格大于\(ans\)的值的和以及数量就可以做了和:预处理\(sum\)......
  • 2024牛客暑期补题 4 I Friends
    新手做题当然会有许多的经验。本人就是蒟蒻(这个题用到map作为预备大二)还没有完全学懂stl但是大体内容学的差不多。用到图论的知识以及set的自动排序和去重以及双指针就可以做。大家要是像我一样水平可以先去看看这几个知识图论看怎么构建set了解一下就行双指针最好去......
  • 【YashanDB数据库】自关联外键插入数据时报错:YAS-02033 foreign key constraint viola
    问题现象使用如下的sql语句创建自关联外键表:droptableself_f_key;createtableself_f_key(t1numberprimarykeynotnull,t2number);createindexi_s_1onself_f_key(t2);altertableself_f_keyaddconstraintc_0001foreignkey(t2)referencesself_f_key(t1);......
  • 题解:CF771A Bear and Friendship Condition
    CF771ABearandFriendshipCondition题解算法并查集,图的基本性质分析题目意思是,一旦有一些点联通,那么这些点必须两两直接相连。换句话讲,就是图中的每个联通块都是完全图。所谓完全图,就是图中的每个点都两两相连,假设一个完全图有\(n\)个点,那么我们可以通过乘法原理算出这......