#include "bits/stdc++.h"
using namespace std;
using ll = long long;
using vi = vector<int>;
using pi = pair<int, int>;
#define forn(i,n) for(int i = 0; i < n; ++i)
#define forb(i,b,n) for(int i = b; i < n; ++i)
#define pb push_back
#define sz(v) ((int)((v).size()))
/* #define ONPC */
void setHintLen(int l);
void setHint(int i, int j, bool b);
int getLength();
bool getHint(int j);
bool goTo(int x);
void
assignHints(int s, int n, int *a, int *b)
{
if (s == 1) {
setHintLen(n);
forb(i,1,n) {
setHint(a[i], b[i], 1);
setHint(b[i], a[i], 1);
}
} else if (s == 2) {
setHintLen(20);
int spec = 0;
if (n == 2)
spec = 1;
else {
if (a[1] == a[2])
spec = a[1];
if (b[1] == b[2])
spec = b[1];
if (a[1] == b[2])
spec = a[1];
if (b[1] == a[2])
spec = b[1];
}
forb(i,1, n+1) {
forn(j, 10) {
if (spec&(1<<j))
setHint(i,j+1,1);
}
}
} else if (s == 3) {
setHintLen(20);
vi cn(n+1,0);
/* forb(i, 1, n+1) { */
/* forn(j,10) { */
/* if (i&(1<<j)) */
/* setHint(i,j+1,1); */
/* if (i&(1<<j)) */
/* setHint(i,j+11,1); */
/* } */
/* } */
forb(i, 1, n) {
/* cout << cn[a[i]] << ' ' << cn[b[i]] << endl; */
forn(j,10) {
if (a[i]&(1<<j))
setHint(b[i], j+1+10*cn[b[i]], 1);
else
setHint(b[i], j+1+10*cn[b[i]], 0);
if (b[i]&(1<<j))
setHint(a[i], j+1+10*cn[a[i]], 1);
else
setHint(a[i], j+1+10*cn[a[i]], 0);
}
++cn[a[i]];
++cn[b[i]];
}
} else {
}
}
vi p;
void dfs1(int x, int n)
{
forb(i,1,n+1) {
if (x == i) continue;
if (i == p[x]) continue;
if (getHint(i)) {
p[i] = x;
goTo(i);
dfs1(i,n);
goTo(x);
}
}
}
void dfs3(int x, int p) {
int nx = 0;
forn(j, 10)
if (getHint(j+1))
nx |= 1<<j;
if (nx != p && nx != 0) {
goTo(nx);
dfs3(nx,x);
goTo(x);
}
nx = 0;
forn(j, 10)
if (getHint(j+11))
nx |= 1<<j;
if (nx != p && nx != 0) {
goTo(nx);
dfs3(nx,x);
goTo(x);
}
}
void
speedrun(int s, int n, int x) {
if (s == 1) {
p.assign(n+1, -1);
dfs1(x,n);
} else if (s == 2) {
int spec = 0;
forn(j, 10) {
if (getHint(j+1))
spec |= 1<<j;
}
goTo(spec);
forb(i, 1, n+1) {
goTo(i);
goTo(spec);
}
} else if (s == 3) {
dfs3(x,x);
}
}
#ifdef ONPC
int lg;
int cur;
vector<bool> vis;
int cnt = 0;
int mist = 0;;
const int N = 1000;
int a[N+1], b[N+1];
vector<vector<bool>> h;
void setHintLen(int l){
lg = l;
forn(i, sz(h))
h[i].assign(l,0);
}
void setHint(int i, int j, bool b) {
--i, --j;
assert(i < sz(h));
assert(j < lg);
h[i][j] = b;
}
int getLength() {
return lg;
}
bool getHint(int j) {
j--;
assert(j < lg);
return h[cur][j];
}
bool goTo(int x) {
for(int i = 1; i < sz(h); ++i) {
if (a[i] == cur+1 && b[i] == x
|| b[i] == cur+1 && a[i] == x ) {
cur = x - 1;
if (vis[cur] == 0) {
vis[cur] = 1;
++cnt;
}
return 1;
}
}
++mist;
return 0;
}
int32_t
main(int argc, char *argv[])
{
if (argc > 1)
freopen(argv[1], "r", stdin);
ios_base::sync_with_stdio(0); cin.tie(0);
int sub, n, st;
cin >> sub >> n >> st;
cur = st-1;
h.assign(n,{});
vis.assign(n,0);
vis[st-1] = 1;
cnt = 1;
for (int i = 1; i < n; ++i) {
cin >> a[i] >> b[i];
}
assignHints(sub, n, a, b);
speedrun(sub, n, st);
cout << cnt << ' ' << mist;
}
#endif
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
51 ms |
732 KB |
Output is correct |
2 |
Correct |
40 ms |
820 KB |
Output is correct |
3 |
Correct |
34 ms |
1112 KB |
Output is correct |
4 |
Correct |
38 ms |
796 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
48 ms |
672 KB |
Output is correct |
2 |
Correct |
49 ms |
724 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
191 ms |
672 KB |
Output is correct |
2 |
Correct |
167 ms |
676 KB |
Output is correct |
3 |
Correct |
199 ms |
724 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
336 KB |
setHintLen was never called |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
208 KB |
setHintLen was never called |
2 |
Halted |
0 ms |
0 KB |
- |