# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
426049 | duality | From Hacks to Snitches (BOI21_watchmen) | C++11 | 98 ms | 20644 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
typedef long long int LLI;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vpii;
int readInt() {
char c;
int n = 0;
while ((c=getchar()) < '0');
n = c-'0';
while ((c=getchar()) >= '0') n = n*10+c-'0';
return n;
}
vi adjList[250000];
pair<int,pii> p[250000];
vi dist[250000];
int done[250000],done2[250000];
priority_queue<pii> H;
int main() {
int i,j;
int N,M,K;
int u,v,l;
scanf("%d %d",&N,&M);
for (i = 0; i < M; i++) {
u = readInt();
v = readInt();
u--,v--;
adjList[u].pb(v);
adjList[v].pb(u);
}
scanf("%d",&K);
for (i = 0; i < K; i++) {
scanf("%d",&l);
for (j = 0; j < l; j++) scanf("%d",&v),p[v-1] = mp(l,mp(j,i));
}
for (i = 0; i < N; i++) {
if (p[i].first == 0) p[i].first = 1;
dist[i].resize(p[i].first);
fill(dist[i].begin(),dist[i].end(),-1);
}
dist[0][0] = 0,H.push(mp(0,0));
while (!H.empty()) {
int u = H.top().second;
int d = -H.top().first;
H.pop();
if (d > dist[u][d % p[u].first]) continue;
else if (u == N-1) {
printf("%d\n",d);
return 0;
}
if (done2[u]) continue;
done2[u] = 1;
for (i = 0; i < adjList[u].size(); i++) {
int v = adjList[u][i],t = d;
for (j = 0; j < ((p[u].first == 1) ? p[v].first:1); j++) {
if (done[v] && (p[u].first == 1)) break;
int bad = 0;
if (p[v].first != 1) {
if (((d+1) % p[v].first) == p[v].second.first) bad = 1;
if (((d % p[v].first) == p[v].second.first) && (p[u].second.second == p[v].second.second) \
&& (p[u].second.first == ((p[v].second.first+1) % p[v].first))) bad = 1;
}
if (!bad) {
if ((dist[v][(d+1) % p[v].first] == -1) || (d+1 < dist[v][(d+1) % p[v].first])) {
dist[v][(d+1) % p[v].first] = d+1;
H.push(mp(-(d+1),v));
}
}
d++;
if ((p[u].first != 1) && ((d % p[u].first) == p[u].second.first)) break;
}
if ((p[u].first == 1) && (p[v].first != 1)) done[v] = 1;
d = t;
}
}
printf("impossible\n");
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |