Luogu P5068 [Ynoi2015]我回來了

題目
Ynoi可貴的水題。
首先咱們能夠\(O(n^2)\)地求出任意兩點之間的距離。
而後咱們能夠\(O(n^3)\)地求出對於任意一個點\(u\),跟它距離\(\le d\)的點的集合。
而後對於每一個詢問,咱們就能夠直接把全部到\(x_i\)距離小於\(y_i\)的集合或起來,複雜度爲\(O(n\sum\limits a)\)
用bitset優化能夠保證空間和時間複雜度的正確性。c++

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
namespace IO
{
    char ibuf[(1<<21)+1],obuf[(1<<21)+1],st[15],*iS,*iT,*oS=obuf,*oT=obuf+(1<<21);
    char Get(){return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++);}
    void Flush(){fwrite(obuf,1,oS-obuf,stdout),oS=obuf;}
    void Put(char x){*oS++=x;if(oS==oT)Flush();}
    int read(){int x=0,c=Get();while(!isdigit(c))c=Get();while(isdigit(c))x=x*10+c-48,c=Get();return x;}
    void write(int x){int top=0;if(!x)Put('0');while(x)st[++top]=(x%10)+48,x/=10;while(top)Put(st[top--]);Put('\n');}
}
using namespace IO;
const int N=1007,INF=0x3f3f3f3f;
int n,m,Q,dis[N][N];vector<int>E[N];queue<int>q;bitset<N>s[N][N],t;
void add(int u,int v){E[u].pb(v),E[v].pb(u);}
void bfs(int x)
{
    dis[x][x]=0,q.push(x);
    for(int u;!q.empty();)
    {
    u=q.front(),q.pop();
    for(int v:E[u]) if(dis[x][v]==INF) dis[x][v]=dis[x][u]+1,q.push(v);
    }
}
void init()
{
    for(int u,v=1;u<=n;++u) for(v=1;v<=n;++v) if(dis[u][v]^INF) s[u][dis[u][v]][v]=1;
    for(int u=1,d;u<=n;++u) for(d=1;d<=n;++d) s[u][d]|=s[u][d-1];
}
void work()
{
    int a=read();t.reset();
    for(int x,d;a;--a) x=read(),d=read(),t|=s[x][d];
    write(t.count());
}
int main()
{
    memset(dis,0x3f,sizeof dis),n=read(),m=read(),Q=read();
    for(int i=1;i<=m;++i) add(read(),read());
    for(int i=1;i<=n;++i) bfs(i);
    init();
    while(Q--) work();
    return Flush(),0;
}
相關文章
相關標籤/搜索