# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
426378 | duality | From Hacks to Snitches (BOI21_watchmen) | C++11 | 6039 ms | 136300 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];
int pos[250000];
pair<int,pii> p[250000];
bool comp(int a,int b) {
return p[a] < p[b];
}
vi dist[250000];
int done[250000],done2[250000];
vi Q[1000000];
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);
sort(adjList[i].begin(),adjList[i].end(),comp);
while ((pos[i] < adjList[i].size()) && (p[adjList[i][pos[i]]].first <= 1)) pos[i]++;
}
int pp = 0;
dist[0][0] = 0,Q[0].pb(0);
while (1) {
while ((pp < 1000000) && (Q[pp].empty())) pp++;
if (pp == 1000000) break;
int u = Q[pp].back();
int d = pp;
Q[pp].pop_back();
if (d > dist[u][d % p[u].first]) continue;
else if (u == N-1) {
printf("%d\n",d);
return 0;
}
i = 0;
if (done2[u]) i = pos[u];
for (; 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;
Q[d+1].pb(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+p[u].first;
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;
Q[d+1].pb(v);
}
}
d = t;
}
done2[u] = 1;
}
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... |