The Preliminary Contest for ICPC Asia Nanchang 2019

Posted c4lnn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The Preliminary Contest for ICPC Asia Nanchang 2019相关的知识,希望对你有一定的参考价值。

Link

Solutions


B. Fire-Fighting Hero

题意:

思路:
dijkstra最短路
先以 hero 为起点 跑一遍 dijkstra
建立 起点 (p) 并与各 fire-fighting point 建立权为 (0) 的边,跑一遍 dijkstra
第二次 dijkstra 中 dis[i] 为各 fire-fighting point 到各点的最短路径中的最小值
最后将两遍 dijkstra 的 dis 中的最大值进行比较即可
代码:


[View Code]

#include<bits/stdc++.h>
using namespace std;
 
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f;
 
int v,e,s,k,c;
int cnt;
int to[520000];
int val[520000];
int nxt[520000];
int head[1005];
int dis[1005];
int vis[1005];
int xfy[1005];
int o;
priority_queue<pii,vector<pii>,greater<pii> >q; 
 
void init1()
{
    cnt=0;
    for(int i=1;i<=k+k+e+e;i++) to[i]=val[i]=0;
    for(int i=0;i<=v;i++) head[i]=0;
}
void init2()
{
    for(int i=0;i<=v;i++) vis[i]=0,dis[i]=INF;
    dis[o]=0;
    while(!q.empty()) q.pop();
}
void addEdge(int a,int b,int d)
{
    cnt++;
    to[cnt]=b;
    val[cnt]=d;
    nxt[cnt]=head[a];
    head[a]=cnt;
}
void dijkstra()
{
    q.push(pii(0,o));
    while(!q.empty())
    {
        
        int u=q.top().second;
        q.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(int e=head[u];e;e=nxt[e])
            if(dis[u]<INF&&dis[to[e]]>dis[u]+val[e])
            {
                dis[to[e]]=dis[u]+val[e];
                q.push(pii(dis[to[e]],to[e]));
            }
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    int a,b,d;
    int resXfy;
    int resHero;
    while(T--)
    {
        scanf("%d%d%d%d%d",&v,&e,&s,&k,&c);
        init1();
        resXfy=-1;
        resHero=-1;
        for(int i=0;i<k;i++) scanf("%d",&xfy[i]);
        while(e--)
        {
            scanf("%d%d%d",&a,&b,&d);
            addEdge(a,b,d);
            addEdge(b,a,d);
        }
        o=s;
        init2();
        dijkstra();
        for(int i=1;i<=v;i++) resHero=max(resHero,dis[i]);
        for(int i=0;i<k;i++) addEdge(0,xfy[i],0),addEdge(xfy[i],0,0);
        o=0;
        init2();
        dijkstra();
        for(int i=1;i<=v;i++) resXfy=max(resXfy,dis[i]);
        if(resHero<=resXfy*c) printf("%d
",resHero);
        else printf("%d
",resXfy);
    }
    return 0;
}

E. Magic Master

题意:

思路:
约瑟夫环
由题意得第 (k) 张牌即求 (k) 为第几个报数为 (m+1) 的单位
用队列模拟即可
代码:


[View Code]

#include<bits/stdc++.h>
using namespace std;
int a[40000001];
int main()
{
    int T;
    scanf("%d",&T);
    int n,m,c;
    while(T--)
    {
        int t=0;
        scanf("%d%d%d",&n,&m,&c);
        a[++t]=1;    
        queue<int>q;
        for(int i=2;i<=n;i++) q.push(i);
        while(!q.empty())
        {
            int b=m;
            while(b)
            {
                q.push(q.front());
                q.pop();
                b--;
            }
            a[q.front()]=++t;
            q.pop();
        }
        int d;
        while(c--)
        {
            scanf("%d",&d);
            printf("%d
",a[d]);
        }            
    } 
    return 0;
}

以上是关于The Preliminary Contest for ICPC Asia Nanchang 2019的主要内容,如果未能解决你的问题,请参考以下文章

The Preliminary Contest for ICPC Asia Yinchuan 2019

The Preliminary Contest for ICPC Asia Shenyang 2019

The Preliminary Contest for ICPC Asia Shanghai 2019

The Preliminary Contest for ICPC Asia Shanghai 2019

The Preliminary Contest for ICPC Asia Xuzhou 2019

The Preliminary Contest for ICPC Asia Nanchang 2019