「Ynoi2015」我回来了

Posted henryhuang-never-settle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「Ynoi2015」我回来了相关的知识,希望对你有一定的参考价值。

「Ynoi2015」我回来了

如何提升自己的数据结构能力?从Ynoi做起

题目链接

其实这个题很小清新的辣,而且不卡常。

由于边权为 (1),所以 ( exttt{BFS}) 预处理出任意两点间距离。

记录 (f[i][j]) 为与点 (i) 距离 (le j) 的点的集合。

这里我们可以使用 ( exttt{bitset}) 维护。

然后每次将对应的集合并上去即可。

时间复杂度 (O(max(n(n+m),frac{n^3+sum k}{w})))

贴代码

/*---Author:HenryHuang---*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
bitset<maxn> f[maxn][maxn];
vector<int> d[maxn];
int dis[maxn];
int n,m,T;
void bfs(int x){
    queue<int> Q;
    memset(dis,0,sizeof dis);
    Q.push(x);
    while(!Q.empty()){
        int u=Q.front();Q.pop();
        for(auto v:d[u]){
            if(!dis[v]&&v!=x){
                dis[v]=dis[u]+1;
                Q.push(v);
            }
        }
    }
    for(int i=1;i<=n;++i)
        if(dis[i]!=0||i==x)
            f[x][dis[i]].set(i);
    for(int i=1;i<=n;++i)
        f[x][i]|=f[x][i-1];
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m>>T;
    for(int i=1;i<=m;++i){
        int a,b;
        cin>>a>>b;
        d[a].emplace_back(b),d[b].emplace_back(a);
    }
    for(int i=1;i<=n;++i) bfs(i);
    while(T--){
        int k;
        cin>>k;
        bitset<maxn>ans;
//      ans.set();
        for(int i=1;i<=k;++i){
            int x,y;
            cin>>x>>y;
            ans|=f[x][y];
        }
        cout<<ans.count()<<'
';
    }
    return 0;
}

以上是关于「Ynoi2015」我回来了的主要内容,如果未能解决你的问题,请参考以下文章

[Ynoi2015]我回来了

P5068 [Ynoi2015]我回来了

[Ynoi2015]此时此刻的光辉

[Ynoi2014]不归之人与望眼欲穿的人们

P5072 [Ynoi2015]盼君勿忘

PopBackStack 但将第一个片段保留在 android