題目
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; }