제출 #439062

#제출 시각아이디문제언어결과실행 시간메모리
439062adamjinwei열대 식물원 (Tropical Garden) (IOI11_garden)C++14
100 / 100
2923 ms41332 KiB
#include <bits/stdc++.h> #include "garden.h" #include "gardenlib.h" #define inf 1000000007 #define mod 1000000007 #define rnd() rand_num() #define bigrnd() dis(rand_num) //#pragma GCC optimize("Ofast","inline","-ffast-math") //#pragma GCC target("avx,sse2,sse3,sse4,mmx") //#define int long long using namespace std; unsigned sed=std::chrono::system_clock::now().time_since_epoch().count(); mt19937 rand_num(sed); uniform_int_distribution<long long> dis(0,inf); template <typename T> void read(T &x){ x=0;char ch=getchar();int fh=1; while (ch<'0'||ch>'9'){if (ch=='-')fh=-1;ch=getchar();} while (ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); x*=fh; } template <typename T> void write(T x) { if (x<0) x=-x,putchar('-'); if (x>9) write(x/10); putchar(x%10+'0'); } template <typename T> void writeln(T x) { write(x); puts(""); } int len[2]={inf,inf},color,col[150005][2]; int dist[150005][2][2]; bool vis[150005][2]; vector<int> g[150005]; vector<pair<int,int>> out[150005][2]; void buildgraph(int node,int cur) { if(vis[node][cur]) return; vis[node][cur]=1; int nnode,nxt; if(cur==0) nnode=g[node][0]; else nnode=(g[node].size()>1?g[node][1]:g[node][0]); if(g[nnode][0]==node) nxt=1; else nxt=0; buildgraph(nnode,nxt); out[nnode][nxt].push_back(make_pair(node,cur)); } void dfs(int node,int w,int d,int s) { if(col[node][w]==color) { if(w==s) len[s]=d; return; } col[node][w]=color; dist[node][w][s]=d; for(pair<int,int> i:out[node][w]) dfs(i.first,i.second,d+1,s); } void count_routes(int N,int M,int P,int R[][2],int Q,int G[]) { for(int i=0;i<M;++i) { g[R[i][0]].push_back(R[i][1]); g[R[i][1]].push_back(R[i][0]); } for(int i=0;i<N;++i) for(int j=0;j<2;++j) if(!vis[i][j]) buildgraph(i,j); for(int i=0;i<N;++i) for(int j=0;j<2;++j) for(int k=0;k<2;++k) dist[i][j][k]=inf; color++; dfs(P,0,0,0); color++; dfs(P,1,0,1); for(int i=0;i<Q;++i) { int ans=0; for(int j=0;j<N;++j) { if(G[i]>=dist[j][0][0]&&(G[i]-dist[j][0][0])%len[0]==0) ans++; if(G[i]>=dist[j][0][1]&&(G[i]-dist[j][0][1])%len[1]==0) ans++; } answer(ans); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...