Atcoder AGC 012 Bスプラッター絵画题解

効果の対象に

いいえN-もし図エッジ、および$ Q $操作、各時間$ V_ {I} $、$ D_ {I} $、$ C_ {I} $の所与の​​セットに$ $ $ M $点、それは$ V_センター用{I} $、$のC_ {I} $色着色の$ D_ {I} $ノードを超えない距離を表すことになります

ソリューション

そこQ _ {} $操作ドル、逆染色上問い合わせを読み、プラス不要判定条件の多くは動作を引くかもしれないと思うのが自然であるからです。

[I] [J] $は、中心の$ I $で発現$ COR [I] [場合は、検索$ COR中のプロセス条件を分析して、$ J $ $ C $を超えない距離は、染色カラーでありますJ]ゼロより$大きいが$ J $の範囲の染色は、検索する必要がないことが証明されています。

小さなスキルがあり、すべての点$プッシュ$ _彼の最後の$ COR背後$バック$チャンネル[I] [0] $が所望されます。

コード

高速本当に不快間違って読んで

#include<bits/stdc++.h>

typedef long long ll;

const int maxn = 1e5 + 10;

int n, m, a, b, q, cor[maxn][14], qwq[maxn], qaq[maxn], c[maxn];

std::vector <int> pb[maxn];

void Work(int st, int deep, int cl)
{
    if(deep == -1) return;
    if(cor[st][deep]) return;
    cor[st][deep] = cl;
    for(int i = 0; i < pb[st].size(); ++ i) Work(pb[st][i], deep-1, cl);
}

int read()
{
    int x=0, ch= getchar(), f=1;
    while(!isdigit(ch)) if(ch == '-')f = -1, ch = getchar();
    while(isdigit(ch)) x = x *10 + ch-'0', ch = getchar();
    return x * f;
} 

int main()
{
    n=read(), m=read();
    for(int i=1;i<=m;i++) a=read(), b=read(), pb[a].push_back(b), pb[b].push_back(a);
    for(int i=1;i<=n;i++) pb[i].push_back(i);
    q=read();
    for(int i=1;i<=q;i++) qwq[i]=read(), qaq[i] = read(), c[i] = read();
    for(int i=q;i>=1;i--) Work(qwq[i], qaq[i], c[i]);
    for(int i=1;i<=n;i++) std::cout<<cor[i][0]<<std::endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/-52hz/p/11787832.html