#include <bits/stdc++.h>
#include "Joi.h"
#define fi first
#define se second
#define ssize(x) int(x.size())
#define pn printf("\n")
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend();
#define vv vector
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
int inf = 2e09; ll infll = 2e18; int mod = 119<<23|1, S = 60;
#ifdef LOCAL
int Move(int x){ return x; }
void MessageBoard(int a, int b){}
#endif
struct graph{
vv<vv<int>> bg, g;
vv<int> vis, good, is_top, sz;
vv<ll> info;
void init(int n){
bg.resize(n+1), g.resize(n+1), vis.resize(n+1), good.resize(n+1, 0), info.resize(n+1, 0), sz.resize(n+1), is_top.resize(n+1);
}
void add_edge_b(int a, int b){ bg[a].emplace_back(b), bg[b].emplace_back(a); }
void add_edge(int a, int b){ g[a].emplace_back(b), g[b].emplace_back(a); }
void get_tree(int x){
vis[x] = 1;
for(int &u : bg[x]) if(!vis[u]) add_edge(x, u), get_tree(u);
}
vv<int> find_closest_group(int x){ // zwroci wektor tych, po ktorych musze sie poruszac, by dojsc do najblizszej grupy
fill(all(vis), 0);
int v;
vv<int> ret;
queue<int> q; q.emplace(x); vis[x] = -1;
while(!q.empty()){
v = q.front(); q.pop();
if(good[v]){
while(vis[v] != -1) ret.emplace_back(v), v = vis[v];
break;
}
for(int &u : g[v]) if(!vis[u]) vis[u] = v, q.emplace(u);
}
q = queue<int>();
return ret;
}
int bit = 0;
ll process(int x, int gr, ll X, int par){ // X -1 = zwroc, w przeciwnym wypadku zakoduj TRZEBA PAMIETAC, BY POSORTOWAC WEKTOR SASIEDZTWA
if(is_top[x]) bit = 0;
ll ret = 0;
//~ printf("%d: %lld %d\n", x, info[x], bit);
if(X == -1) ret = info[x]<<bit;
else info[x] = ((X&(1ll<<bit)) == 0) ? 0 : 1;
for(int &u : g[x]) if(good[u] == gr && u != par) ++bit, ret += process(u, gr, X, x);
return ret;
}
int l = 0; // ktora grupa
void get_groups(int x, int par, ll X){
//~ printf("%d\n", x);
sz[x] = 1;
for(int &u : g[x]) if(u != par) get_groups(u, x, X), sz[x] += sz[u];
if(sz[x] >= 60){
int cnt = 0, v, p;
good[x] = ++l, is_top[x] = 1;
queue<pii> q; q.emplace(x, par);
while(!q.empty() && cnt < 60){
v = q.front().fi, p = q.front().se; q.pop(), ++cnt, good[v] = l;
for(int &u : g[v]) if(u != p && !good[u]) q.emplace(u, v);
}
if(X != -1) process(x, good[x], X, 0);
q = queue<pii>(), sz[x] = 0;
}
}
};
void Joi(int n, int m, int a[], int b[], ll X, int T){
graph g; g.init(n+1);
for(int i = 0; i < m; ++i) g.add_edge_b(a[i]+1, b[i]+1);
g.get_tree(31);
for(int i = 1; i <= n; ++i) sort(all(g.g[i]));
g.get_groups(31, 0, X);
for(int i = 1; i <= n; ++i) MessageBoard(i-1, g.info[i]);
}
#ifdef LOCAL
void answer(){
}
int main(){
int T = 1;
for(++T; --T; ) answer();
return 0;
}
#endif
#include <bits/stdc++.h>
#include "Ioi.h"
#define fi first
#define se second
#define ssize(x) int(x.size())
#define pn printf("\n")
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend();
#define vv vector
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#ifdef LOCAL
int Move(int x){ return x; }
void MessageBoard(int a, int b){}
#endif
struct gph{
vv<vv<int>> bg, g;
vv<int> vis, good, is_top, sz;
vv<ll> info;
void init(int n){
bg.resize(n+1), g.resize(n+1), vis.resize(n+1), good.resize(n+1, 0), info.resize(n+1, 0), sz.resize(n+1), is_top.resize(n+1);
}
void add_edge_b(int a, int b){ bg[a].emplace_back(b), bg[b].emplace_back(a); }
void add_edge(int a, int b){ g[a].emplace_back(b), g[b].emplace_back(a); }
void get_tree(int x){
vis[x] = 1;
for(int &u : bg[x]) if(!vis[u]) add_edge(x, u), get_tree(u);
}
vv<int> find_closest_group(int x){ // zwroci wektor tych, po ktorych musze sie poruszac, by dojsc do najblizszej grupy
fill(all(vis), 0);
int v;
vv<int> ret;
queue<int> q; q.emplace(x); vis[x] = -1;
while(!q.empty()){
v = q.front(); q.pop();
if(good[v]){
while(vis[v] != -1) ret.emplace_back(v), v = vis[v];
break;
}
for(int &u : g[v]) if(!vis[u]) vis[u] = v, q.emplace(u);
}
q = queue<int>();
return ret;
}
int get_info(int x, int gr, int par, int val){
int ret = is_top[x] ? x : 0;
info[x] = val;
for(int &u : g[x]) if(u != par && good[u] == gr) ret = max(ret, get_info(u, gr, x, Move(u-1)));
if(par) Move(par-1);
return ret;
}
int bit = 0;
ll process(int x, int gr, ll X, int par){ // X -1 = zwroc, w przeciwnym wypadku zakoduj TRZEBA PAMIETAC, BY POSORTOWAC WEKTOR SASIEDZTWA
if(is_top[x]) bit = 0;
ll ret = 0;
//~ printf("%d: %lld %d\n", x, info[x], bit);
if(X == -1) ret = info[x]<<bit;
else info[x] = ((X&(1ll<<bit)) == 0) ? 0 : 1;
for(int &u : g[x]) if(good[u] == gr && u != par) ++bit, ret += process(u, gr, X, x);
return ret;
}
int l = 0; // ktora grupa
void get_groups(int x, int par, ll X){
//~ printf("%d\n", x);
sz[x] = 1;
for(int &u : g[x]) if(u != par) get_groups(u, x, X), sz[x] += sz[u];
if(sz[x] >= 60){
int cnt = 0, v, p;
good[x] = ++l, is_top[x] = 1;
queue<pii> q; q.emplace(x, par);
while(!q.empty() && cnt < 60){
v = q.front().fi, p = q.front().se; q.pop(), ++cnt, good[v] = l;
for(int &u : g[v]) if(u != p && !good[u]) q.emplace(u, v);
}
if(X != -1) process(x, good[x], X, 0);
q = queue<pii>(), sz[x] = 0;
}
}
};
ll Ioi(int n, int m, int a[], int b[], int p, int val, int T){
gph g; g.init(n+1); ++p;
for(int i = 0; i < m; ++i) g.add_edge_b(a[i]+1, b[i]+1);
g.get_tree(31);
for(int i = 1; i <= n; ++i) sort(all(g.g[i]));
g.get_groups(31, 0, -1);
vv<int> path = g.find_closest_group(p);
while(!path.empty()) p = path.back(), path.pop_back(), val = Move(p-1);
int TOP = g.get_info(p, g.good[p], 0, val);
ll ret = g.process(TOP, g.good[TOP], -1, 0);
//~ printf("%lld\n", ret);
return ret;
return 0;
}
#ifdef LOCAL
void answer(){
}
int main(){
int T = 1;
for(++T; --T; ) answer();
return 0;
}
#endif
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
792 KB |
Output is correct |
2 |
Correct |
0 ms |
784 KB |
Output is correct |
3 |
Correct |
1 ms |
800 KB |
Output is correct |
4 |
Correct |
1 ms |
796 KB |
Output is correct |
5 |
Correct |
1 ms |
1296 KB |
Output is correct |
6 |
Correct |
1 ms |
1048 KB |
Output is correct |
7 |
Correct |
1 ms |
796 KB |
Output is correct |
8 |
Correct |
2 ms |
796 KB |
Output is correct |
9 |
Correct |
1 ms |
788 KB |
Output is correct |
10 |
Correct |
1 ms |
784 KB |
Output is correct |
11 |
Correct |
3 ms |
1384 KB |
Output is correct |
12 |
Correct |
1 ms |
800 KB |
Output is correct |
13 |
Correct |
1 ms |
804 KB |
Output is correct |
14 |
Correct |
1 ms |
800 KB |
Output is correct |
15 |
Correct |
1 ms |
804 KB |
Output is correct |
16 |
Correct |
1 ms |
804 KB |
Output is correct |
17 |
Correct |
1 ms |
800 KB |
Output is correct |
18 |
Correct |
1 ms |
796 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
22 ms |
7828 KB |
Output is correct |
2 |
Correct |
23 ms |
8228 KB |
Output is correct |
3 |
Correct |
23 ms |
8224 KB |
Output is correct |
4 |
Correct |
14 ms |
4484 KB |
Output is correct |
5 |
Correct |
15 ms |
7248 KB |
Output is correct |
6 |
Correct |
15 ms |
5712 KB |
Output is correct |
7 |
Correct |
14 ms |
6472 KB |
Output is correct |
8 |
Correct |
14 ms |
6220 KB |
Output is correct |
9 |
Correct |
14 ms |
6472 KB |
Output is correct |
10 |
Correct |
12 ms |
4612 KB |
Output is correct |
11 |
Correct |
14 ms |
4680 KB |
Output is correct |
12 |
Correct |
12 ms |
3884 KB |
Output is correct |
13 |
Correct |
12 ms |
3892 KB |
Output is correct |
14 |
Correct |
12 ms |
4160 KB |
Output is correct |
15 |
Correct |
13 ms |
4172 KB |
Output is correct |
16 |
Correct |
14 ms |
4172 KB |
Output is correct |
17 |
Correct |
13 ms |
4172 KB |
Output is correct |
18 |
Correct |
13 ms |
4172 KB |
Output is correct |
19 |
Correct |
15 ms |
4176 KB |
Output is correct |
20 |
Correct |
14 ms |
6996 KB |
Output is correct |
21 |
Correct |
12 ms |
7244 KB |
Output is correct |
22 |
Correct |
14 ms |
6476 KB |
Output is correct |
23 |
Correct |
14 ms |
5708 KB |
Output is correct |
24 |
Correct |
14 ms |
6744 KB |
Output is correct |
25 |
Correct |
14 ms |
5700 KB |
Output is correct |
26 |
Correct |
15 ms |
6220 KB |
Output is correct |
27 |
Correct |
16 ms |
5960 KB |
Output is correct |
28 |
Correct |
14 ms |
6476 KB |
Output is correct |
29 |
Correct |
13 ms |
6016 KB |
Output is correct |
30 |
Correct |
14 ms |
5952 KB |
Output is correct |
31 |
Correct |
1 ms |
800 KB |
Output is correct |
32 |
Correct |
1 ms |
788 KB |
Output is correct |
33 |
Correct |
1 ms |
800 KB |
Output is correct |
34 |
Correct |
2 ms |
800 KB |
Output is correct |
35 |
Correct |
1 ms |
788 KB |
Output is correct |
36 |
Correct |
2 ms |
784 KB |
Output is correct |
37 |
Correct |
0 ms |
788 KB |
Output is correct |
38 |
Correct |
2 ms |
784 KB |
Output is correct |
39 |
Correct |
1 ms |
796 KB |
Output is correct |
40 |
Correct |
1 ms |
784 KB |
Output is correct |
41 |
Correct |
1 ms |
800 KB |
Output is correct |
42 |
Correct |
1 ms |
800 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
780 KB |
Output is correct |
2 |
Correct |
1 ms |
788 KB |
Output is correct |
3 |
Correct |
1 ms |
800 KB |
Output is correct |
4 |
Correct |
4 ms |
2888 KB |
Output is correct |
5 |
Correct |
3 ms |
2368 KB |
Output is correct |
6 |
Correct |
2 ms |
2376 KB |
Output is correct |
7 |
Correct |
3 ms |
2368 KB |
Output is correct |
8 |
Correct |
3 ms |
2372 KB |
Output is correct |
9 |
Correct |
13 ms |
9812 KB |
Output is correct |
10 |
Correct |
13 ms |
9808 KB |
Output is correct |
11 |
Correct |
13 ms |
9808 KB |
Output is correct |
12 |
Correct |
1 ms |
796 KB |
Output is correct |
13 |
Correct |
0 ms |
788 KB |
Output is correct |
14 |
Correct |
1 ms |
788 KB |
Output is correct |
15 |
Correct |
1 ms |
800 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
22 ms |
7792 KB |
Output is correct |
2 |
Correct |
20 ms |
8172 KB |
Output is correct |
3 |
Correct |
23 ms |
8388 KB |
Output is correct |
4 |
Correct |
13 ms |
4164 KB |
Output is correct |
5 |
Correct |
16 ms |
9048 KB |
Output is correct |
6 |
Correct |
14 ms |
5696 KB |
Output is correct |
7 |
Correct |
14 ms |
5704 KB |
Output is correct |
8 |
Correct |
14 ms |
6224 KB |
Output is correct |
9 |
Correct |
18 ms |
6496 KB |
Output is correct |
10 |
Correct |
12 ms |
4672 KB |
Output is correct |
11 |
Correct |
12 ms |
4416 KB |
Output is correct |
12 |
Correct |
13 ms |
3892 KB |
Output is correct |
13 |
Correct |
13 ms |
3892 KB |
Output is correct |
14 |
Correct |
12 ms |
4156 KB |
Output is correct |
15 |
Correct |
13 ms |
4116 KB |
Output is correct |
16 |
Correct |
13 ms |
4172 KB |
Output is correct |
17 |
Correct |
14 ms |
4168 KB |
Output is correct |
18 |
Partially correct |
13 ms |
4104 KB |
Partially correct |
19 |
Correct |
13 ms |
4160 KB |
Output is correct |
20 |
Correct |
11 ms |
6996 KB |
Output is correct |
21 |
Correct |
11 ms |
6964 KB |
Output is correct |
22 |
Correct |
16 ms |
6220 KB |
Output is correct |
23 |
Correct |
14 ms |
6212 KB |
Output is correct |
24 |
Correct |
16 ms |
6908 KB |
Output is correct |
25 |
Correct |
16 ms |
6396 KB |
Output is correct |
26 |
Partially correct |
17 ms |
5696 KB |
Partially correct |
27 |
Correct |
15 ms |
6840 KB |
Output is correct |
28 |
Correct |
14 ms |
6224 KB |
Output is correct |
29 |
Correct |
14 ms |
5172 KB |
Output is correct |
30 |
Correct |
15 ms |
5696 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
23 ms |
7836 KB |
Output is correct |
2 |
Correct |
22 ms |
8624 KB |
Output is correct |
3 |
Correct |
22 ms |
8232 KB |
Output is correct |
4 |
Correct |
13 ms |
4168 KB |
Output is correct |
5 |
Correct |
15 ms |
8780 KB |
Output is correct |
6 |
Correct |
14 ms |
6228 KB |
Output is correct |
7 |
Correct |
14 ms |
6476 KB |
Output is correct |
8 |
Correct |
15 ms |
5704 KB |
Output is correct |
9 |
Correct |
14 ms |
6216 KB |
Output is correct |
10 |
Correct |
12 ms |
4680 KB |
Output is correct |
11 |
Correct |
12 ms |
4616 KB |
Output is correct |
12 |
Correct |
13 ms |
3840 KB |
Output is correct |
13 |
Correct |
14 ms |
3856 KB |
Output is correct |
14 |
Correct |
13 ms |
4188 KB |
Output is correct |
15 |
Correct |
13 ms |
4172 KB |
Output is correct |
16 |
Correct |
12 ms |
4172 KB |
Output is correct |
17 |
Correct |
13 ms |
4168 KB |
Output is correct |
18 |
Incorrect |
14 ms |
4168 KB |
Output isn't correct |
19 |
Halted |
0 ms |
0 KB |
- |