ZJU-ICPC Summer 2020 Contest 7 D Cafeterias

Posted gk0328

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZJU-ICPC Summer 2020 Contest 7 D Cafeterias相关的知识,希望对你有一定的参考价值。

https://zjusummer.contest.codeforces.com/group/clkkguw3vK/contest/102661/problem/D

对于一个节点,设有食物时为黑色,无食物时为白色,可以发现,一个节点顶多经历三个阶段

(1.)一直是白色

(2.)黑白闪烁

(3.)一直是黑色

这样比较难处理,我们对于奇偶分别讨论

一个状态记录为((v,eo))(v)表示其节点标号,(eo)表示其奇偶性,那么对于一个状态,只有前面全白,后面全黑的过渡过程

我们记录每个状态第一次黑色的位置,可以通过最短路获得,直接(BFS)

转移:((u,eo)->(v,eo quad xorquad 1))

对于询问,直接二分即可

注意,孤立节点单独判断,否则会(WA)

(C++ Code:)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#define N 4000005
using namespace std;
int n,m,k,x,y,t,T;
int tot,head[N],nxt[N],d[N],rd[N];
int c[N],g[2][N],g0[N],g1[N];
bool s[N];
struct node
{
    int dis,eo,id;
};
queue<node>q;
void add(int x,int y)
{
    tot++;
    d[tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
    rd[y]++;
}
void Solve()
{
    for (int i=1;i<=n;i++)
        g[0][i]=-1,g[1][i]=-1;
    for (int i=1;i<=k;i++)
        if (s[c[i]])
            q.push((node){1,1,c[i]}),g[1][c[i]]=0;
    while (!q.empty())
    {
        node u=q.front();
        q.pop();
        for (int i=head[u.id];i;i=nxt[i])
        {
            int v=d[i];
            if (g[u.eo^1][v]!=-1)
                continue;
            q.push((node){u.dis+1,u.eo^1,v});
            g[u.eo^1][v]=u.dis+1;
        }
    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for (int i=1;i<=k;i++)
    {
        scanf("%d",&c[i]);
        s[c[i]]=true;
    }
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
    }
    for (int i=1;i<=n;i++)
        if (!rd[i])
            s[i]=false;
    Solve();
    for (int i=1;i<=n;i++)
        g0[i]=g[0][i],g1[i]=g[1][i];
    sort(g0+1,g0+n+1);
    int g_0=0;
    for (int i=1;i<=n;i++)
        if (g0[i]==-1)
            g_0++;
    sort(g1+1,g1+n+1);
    int g_1=0;
    for (int i=1;i<=n;i++)
        if (g1[i]==-1)
            g_1++;
    scanf("%d",&T);
    while (T --> 0)
    {
        scanf("%d",&t);
        if (t==1)
            printf("%d
",k); else
            {
                int o;
                if (t&1)
                    o=upper_bound(g1+1,g1+n+1,t)-g1-1; else
                    o=upper_bound(g0+1,g0+n+1,t)-g0-1;
                o=min(o,n);
                o-=(t&1)?g_1:g_0;
                printf("%d
",o);
            }
    }
}

以上是关于ZJU-ICPC Summer 2020 Contest 7 D Cafeterias的主要内容,如果未能解决你的问题,请参考以下文章

「ZJU Summer Training 2020 - Round 2/3」部分补题记录

「ZJU Summer Training 2020 - Round 2/3」部分补题记录

「RADIO EVA 2020 Spring/Summer 新作Collection」于涩谷Parco举行先行受理会

无法连接到 mySQL,因为无法识别服务器时区值“GMT Summer Time”

使用 Summer note 编辑存储在数据库中的 HTML + CSS

我如何编写这个较短的 jquery?