Submission #13644686
Source Code Expand
#include <algorithm>
#include <cmath>
#include <iostream>
#include <iterator>
#include <map>
#include <queue>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vi2;
typedef vector<vi2> vi3;
typedef pair<int, int> pii;
typedef vector<pii> vii;
typedef vector<ll> vll;
typedef vector<vll> vll2;
typedef vector<vll2> vll3;
typedef vector<bool> vb;
#define el '\n'
#define rep(i, a, b) for (int i = a; i < b; i++)
#define repi(i, a, b) for (int i = a; i >= b; i--)
#define umap unordered_map
#define uset unordered_set
#define vec vector
#define loop(a) for (auto &x : a)
#define all(a) a.begin(), a.end()
#define mp make_pair
int n, m;
vec<vec<pii>> adj;
vll edge_mask;
ll ans = 0;
void dfs(int which, ll mask, int in_ex) {
#ifdef LOCAL
// cout << "which:" << which << " mask:" << mask << " bits:" << __builtin_popcountll(mask) << el;
#endif
if (which == m) {
int edge_left = n - 1 - __builtin_popcountll(mask);
#ifdef LOCAL
assert(edge_left >= 0);
// cout << "edge_left=" << edge_left << el;
#endif
ans += (ll)in_ex * (1LL << edge_left);
return;
}
dfs(which + 1, mask, in_ex);
dfs(which + 1, mask | edge_mask[which], -in_ex);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
adj = vec<vec<pii>>(n);
rep(i, 0, n - 1) {
int a, b;
cin >> a >> b;
a--, b--;
adj[a].emplace_back(b, i);
adj[b].emplace_back(a, i);
}
cin >> m;
edge_mask = vll(m);
rep(i, 0, m) {
int u, v;
cin >> u >> v;
u--, v--;
queue<int> q;
vii from(n, {-1, -1});
q.push(u);
from[u] = {u, -1};
while (!q.empty()) {
int h = q.front();
q.pop();
if (h == v) {
break;
}
loop(adj[h]) {
if (from[x.first].first == -1) {
from[x.first] = {h, x.second};
q.push(x.first);
}
}
}
set<int> edges;
int work = v;
while (work != u) {
edges.insert(from[work].second);
work = from[work].first;
}
#ifdef LOCAL
cout << "edges for " << i << ":";
loop(edges) {
cout << x << ' ';
}
cout << el;
#endif
loop(edges) {
edge_mask[i] += 1LL << x;
}
#ifdef LOCAL
cout << "edge_mask for " << i << ":" << edge_mask[i] << el;
#endif
}
dfs(0, 0, 1);
cout << ans << el;
}
Submission Info
| Submission Time |
|
| Task |
F - Tree and Constraints |
| User |
happy15 |
| Language |
C++14 (GCC 5.4.1) |
| Score |
600 |
| Code Size |
2767 Byte |
| Status |
AC |
| Exec Time |
9 ms |
| Memory |
256 KiB |
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
600 / 600 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt |
| All |
dense_01.txt, dense_02.txt, dense_03.txt, dense_04.txt, dense_05.txt, large_ans.txt, line_01.txt, line_02.txt, line_03.txt, no_overlap.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt, star_01.txt, star_02.txt, star_03.txt |
| Case Name |
Status |
Exec Time |
Memory |
| dense_01.txt |
AC |
9 ms |
256 KiB |
| dense_02.txt |
AC |
1 ms |
256 KiB |
| dense_03.txt |
AC |
1 ms |
256 KiB |
| dense_04.txt |
AC |
9 ms |
256 KiB |
| dense_05.txt |
AC |
1 ms |
256 KiB |
| large_ans.txt |
AC |
1 ms |
256 KiB |
| line_01.txt |
AC |
9 ms |
256 KiB |
| line_02.txt |
AC |
9 ms |
256 KiB |
| line_03.txt |
AC |
9 ms |
256 KiB |
| no_overlap.txt |
AC |
9 ms |
256 KiB |
| random_01.txt |
AC |
5 ms |
256 KiB |
| random_02.txt |
AC |
9 ms |
256 KiB |
| random_03.txt |
AC |
5 ms |
256 KiB |
| random_04.txt |
AC |
9 ms |
256 KiB |
| random_05.txt |
AC |
5 ms |
256 KiB |
| random_06.txt |
AC |
9 ms |
256 KiB |
| random_07.txt |
AC |
5 ms |
256 KiB |
| random_08.txt |
AC |
5 ms |
256 KiB |
| random_09.txt |
AC |
9 ms |
256 KiB |
| random_10.txt |
AC |
9 ms |
256 KiB |
| sample_01.txt |
AC |
1 ms |
256 KiB |
| sample_02.txt |
AC |
1 ms |
256 KiB |
| sample_03.txt |
AC |
1 ms |
256 KiB |
| sample_04.txt |
AC |
1 ms |
256 KiB |
| star_01.txt |
AC |
9 ms |
256 KiB |
| star_02.txt |
AC |
9 ms |
256 KiB |
| star_03.txt |
AC |
9 ms |
256 KiB |