# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
49764 | 2018-06-02T21:19:02 Z | gs13105 | 열대 식물원 (Tropical Garden) (IOI11_garden) | C++17 | 0 ms | 0 KB |
#include <cstdio> #include <cstdlib> #include <cstring> #include <cassert> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <list> #include <stack> #include <queue> #include <deque> #include <set> #include <map> #include <tuple> #include <iterator> using namespace std; const int MAXN = 150000; int arr[2 * MAXN + 10]; int dis[2][2 * MAXN + 10]; bool chk[2][2 * MAXN + 10]; void f(int x, int p) { chk[p % 2][x] = 1; if(arr[x] == p) { dis[p % 2][x] = 1; return; } if(!chk[p % 2][arr[x]]) f(arr[x], p); if(dis[p%2][arr[x]]) dis[p % 2][x] = dis[p % 2][arr[x]] + 1; } int mem[MAXN + 10][2]; int sum[2][2 * MAXN + 10]; void count_routes(int N, int M, int P, int R[][2], int Q, int G[]) { memset(mem, -1, sizeof mem); memset(arr, -1, sizeof arr); for(int i = 0; i < M; i++) { int x = R[i][0]; int y = R[i][1]; if(mem[x][0] == -1) mem[x][0] = y; else if(mem[x][1] == -1) mem[x][1] = y; if(mem[y][0] == -1) mem[y][0] = x; else if(mem[y][1] == -1) mem[y][1] = x; } for(int i = 0; i < N; i++) { if(mem[mem[i][0]][0] == i && mem[mem[i][0]][1] != -1) arr[2 * i] = 2 * mem[i][0] + 1; else arr[2 * i] = 2 * mem[i][0]; if(mem[i][1] != -1) { if(mem[mem[i][1]][0] == i && mem[mem[i][1]][1] != -1) arr[2 * i + 1] = 2 * mem[i][1] + 1; else arr[2 * i + 1] = 2 * mem[i][1]; } } for(int r = 0; r < 2; r++) for(int i = 0; i < 2 * N; i++) if(!chk[r][i] && arr[i] != -1) f(i, 2 * P + r); for(int r = 0; r < 2; r++) for(int i = 0; i < N; i++) if(dis[r][2 * i]) sum[r][dis[r][2 * i]]++; for(int r = 0; r < 2; r++) { int c = dis[r][2 * P + r]; if(!c) continue; for(int i = 1; i <= 2 * N; i++) if(c && i - c >= 1) sum[r][i] += sum[r][i - c]; } int c = max(dis[0][2 * P], dis[1][2 * P + 1]); for(int i = 0; i < Q; i++) { int t = G[i]; if(t > 2 * N && c) t -= ((t - 2 * N + c - 1) / c) * c; if(t > 2 * N) answer(0); else answer(sum[0][t] + sum[1][t]); } }