QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#188947 | #7509. 01tree | zhoukangyang# | AC ✓ | 38ms | 44976kb | C++11 | 3.7kb | 2023-09-26 17:40:28 | 2023-09-26 17:40:29 |
Judging History
answer
#include<bits/stdc++.h>
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)
#define ll long long
#define vi vector < int >
#define sz(a) ((int) (a).size())
#define ll long long
#define ull unsigned long long
#define me(a, x) memset(a, x, sizeof(a))
using namespace std;
const int N = 1 << 19, mod = 1e9 + 7;
int qpow(int x, int y = mod - 2) {
int res = 1;
for(; y; x = (ll) x * x % mod, y >>= 1) if(y & 1) res = (ll) res * x % mod;
return res;
}
int fac[N], ifac[N], inv[N];
void init(int x) {
fac[0] = ifac[0] = inv[1] = 1;
L(i, 2, x) inv[i] = (ll) (mod - mod / i) * inv[mod % i] % mod;
L(i, 1, x) fac[i] = (ll) fac[i - 1] * i % mod, ifac[i] = (ll) ifac[i - 1] * inv[i] % mod;
}
int C(int x, int y) {
return x < y || y < 0 ? 0 : (ll) fac[x] * ifac[y] % mod * ifac[x - y] % mod;
}
int n;
char s[N], t[N];
vi e[N];
int scnt[N], snon[N];
int tcnt[N], tnon[N];
int col[N];
void dfs(int x, int fa) {
if(col[x]) {
if(s[x] != '?')
s[x] ^= 1;
if(t[x] != '?')
t[x] ^= 1;
}
scnt[x] = s[x] == '1';
snon[x] = s[x] == '?';
tcnt[x] = t[x] == '1';
tnon[x] = t[x] == '?';
for(auto v : e[x]) if(v != fa) {
col[v] = col[x] ^ 1, dfs(v, x);
scnt[x] += scnt[v];
snon[x] += snon[v];
tcnt[x] += tcnt[v];
tnon[x] += tnon[v];
}
}
struct node {
int L, D;
} ask[N];
int top;
int B;
struct Q {
int pn, all;
int L, D;
int ans1;
inline void recalc() {
ans1 = 0;
L(a, 0, D)
(ans1 += (ll) C(L, a) * C(all - L, pn - a) % mod) %= mod;
}
Q(int P = 0, int A = 0) {
pn = P, all = A;
L = 0, D = 0;
recalc();
}
void move(int l, int d) {
while(L < l) {
(ans1 += mod - (ll) C(L, D) * C(all - L - 1, pn - D - 1) % mod) %= mod;
++L;
if(L == 0) recalc();
}
while(L > l) {
--L;
if(L < 0) recalc();
(ans1 += (ll) C(L, D) * C(all - L - 1, pn - D - 1) % mod) %= mod;
}
while(D < d) {
++D;
(ans1 += (ll) C(L, D) * C(all - L, pn - D) % mod) %= mod;
}
while(D > d) {
(ans1 += mod - (ll) C(L, D) * C(all - L, pn - D) % mod) %= mod;
--D;
}
}
} CUR1, CUR2;
void Main() {
cin >> n;
B = sqrt(n);
L(i, 1, n - 1) {
int u, v;
cin >> u >> v;
e[u].emplace_back(v);
e[v].emplace_back(u);
}
cin >> (s + 1) >> (t + 1);
col[1] = 0, dfs(1, 0);
int ans = 0;
int pn = tnon[1] + tcnt[1] - scnt[1];
int all = snon[1] + tnon[1];
top = 0;
L(i, 2, n) {
int sx = snon[i];
int sy = snon[1] - snon[i];
int tx = tnon[i];
int ty = tnon[1] - tnon[i];
int L = sx + tx, R = sy + ty, D = tx + tcnt[i] - scnt[i];
++top;
ask[top].L = L;
ask[top].D = D;
}
sort(ask + 1, ask + top + 1, [&] (node a, node b) {
return a.L / B == b.L / B ? a.D < b.D : a.L < b.L;
});
CUR1 = Q(pn, all);
CUR2 = Q(pn - 1, all - 1);
L(i, 1, top) {
int L = ask[i].L, D = ask[i].D;
if(L < 0 || L > all) continue;
(ans += (ll) (mod - D) * C(all, pn) % mod) %= mod;
(ans += (ll) L * C(all - 1, pn - 1) % mod) %= mod;
CUR1.move(L, D);
CUR2.move(L - 1, D - 1);
(ans += (ll) CUR1.ans1 * (D + mod) * 2 % mod) %= mod;
(ans += (ll) CUR2.ans1 * (mod - L * 2) % mod) %= mod;
// L(a, 0, D) {
// (ans += (ll) C(L, a) * C(all - L, pn - a) % mod * D * 2 % mod) %= mod;
// }
// L(a, 0, D - 1) {
// (ans += (ll) C(L - 1, a) * C(all - L, pn - a - 1) % mod * (mod - L * 2) % mod) %= mod;
// }
// CUR.move(L, D);
// (ans += CUR.ans2) %= mod;
}
cout << ans << '\n';
L(i, 1, n) {
e[i].clear();
}
}
int main() {
init(2e5 + 7);
ios :: sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t; cin >> t; while(t--) Main();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 29788kb
input:
3 2 1 2 00 11 3 1 2 2 3 ??? ??? 3 1 2 2 3 ??1 0?0
output:
1 16 1
result:
ok 3 number(s): "1 16 1"
Test #2:
score: 0
Accepted
time: 8ms
memory: 30588kb
input:
1000 23 1 2 1 3 1 4 2 5 5 6 4 7 3 8 4 9 8 10 8 11 8 12 1 13 7 14 10 15 7 16 7 17 5 18 18 19 12 20 9 21 21 22 6 23 00?10?0000??1?00111?010 011??1?10?01?110?0??101 6 1 2 1 3 1 4 4 5 3 6 000?10 1???01 25 1 2 2 3 2 4 4 5 5 6 2 7 4 8 5 9 7 10 8 11 11 12 5 13 11 14 3 15 6 16 14 17 1 18 4 19 6 20 4 21 5 22...
output:
53545 24 11724 2228 162 14 711 28 550 1680 52 2 13 988 9480 2342 626416 0 71780 1 88 39207 19448 4 37395 9602 3253496 38057200 1066 3 303732 1608 281022 11718 170 78 15 1219376 29364 9092 7 0 2 7014 1942448 170371 75845 167217 16554 64 904 564290 14822 1127090 1758504 1227646 14833316 14954550 36055...
result:
ok 1000 numbers
Test #3:
score: 0
Accepted
time: 0ms
memory: 30140kb
input:
1 3000 1 2 2 3 2 4 1 5 3 6 2 7 5 8 8 9 9 10 10 11 2 12 11 13 7 14 11 15 7 16 13 17 8 18 1 19 11 20 10 21 18 22 7 23 7 24 15 25 23 26 24 27 14 28 15 29 25 30 16 31 6 32 10 33 3 34 30 35 16 36 9 37 36 38 28 39 26 40 33 41 1 42 11 43 20 44 23 45 14 46 31 47 41 48 11 49 48 50 45 51 6 52 10 53 32 54 38 5...
output:
924036898
result:
ok 1 number(s): "924036898"
Test #4:
score: 0
Accepted
time: 3ms
memory: 30460kb
input:
1 3000 1 2 1 3 2 4 2 5 3 6 3 7 4 8 4 9 5 10 5 11 6 12 6 13 7 14 7 15 8 16 8 17 9 18 9 19 10 20 10 21 11 22 11 23 12 24 12 25 13 26 13 27 14 28 14 29 15 30 15 31 16 32 16 33 17 34 17 35 18 36 18 37 19 38 19 39 20 40 20 41 21 42 21 43 22 44 22 45 23 46 23 47 24 48 24 49 25 50 25 51 26 52 26 53 27 54 2...
output:
429465738
result:
ok 1 number(s): "429465738"
Test #5:
score: 0
Accepted
time: 4ms
memory: 32196kb
input:
1 3000 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 5...
output:
650625747
result:
ok 1 number(s): "650625747"
Test #6:
score: 0
Accepted
time: 36ms
memory: 35888kb
input:
1 100000 1 2 1 3 3 4 1 5 2 6 6 7 2 8 1 9 6 10 1 11 3 12 11 13 5 14 9 15 12 16 6 17 13 18 13 19 14 20 7 21 14 22 21 23 12 24 17 25 14 26 3 27 4 28 8 29 22 30 12 31 6 32 30 33 4 34 15 35 12 36 3 37 20 38 7 39 37 40 5 41 13 42 34 43 9 44 27 45 39 46 43 47 3 48 17 49 36 50 12 51 1 52 45 53 35 54 15 55 2...
output:
143309878
result:
ok 1 number(s): "143309878"
Test #7:
score: 0
Accepted
time: 37ms
memory: 37308kb
input:
1 100000 1 2 1 3 2 4 2 5 3 6 3 7 4 8 4 9 5 10 5 11 6 12 6 13 7 14 7 15 8 16 8 17 9 18 9 19 10 20 10 21 11 22 11 23 12 24 12 25 13 26 13 27 14 28 14 29 15 30 15 31 16 32 16 33 17 34 17 35 18 36 18 37 19 38 19 39 20 40 20 41 21 42 21 43 22 44 22 45 23 46 23 47 24 48 24 49 25 50 25 51 26 52 26 53 27 54...
output:
724432513
result:
ok 1 number(s): "724432513"
Test #8:
score: 0
Accepted
time: 34ms
memory: 44976kb
input:
1 100000 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52...
output:
164448583
result:
ok 1 number(s): "164448583"
Test #9:
score: 0
Accepted
time: 38ms
memory: 33832kb
input:
1 100000 1 2 1 3 1 4 4 5 2 6 5 7 3 8 5 9 9 10 6 11 4 12 6 13 11 14 1 15 6 16 15 17 6 18 6 19 8 20 11 21 1 22 11 23 20 24 9 25 2 26 5 27 14 28 7 29 28 30 10 31 7 32 17 33 2 34 24 35 14 36 10 37 2 38 5 39 39 40 14 41 35 42 25 43 33 44 11 45 41 46 1 47 33 48 36 49 25 50 20 51 13 52 4 53 46 54 45 55 21 ...
output:
159386883
result:
ok 1 number(s): "159386883"
Test #10:
score: 0
Accepted
time: 23ms
memory: 35752kb
input:
1 100000 1 2 1 3 2 4 2 5 3 6 3 7 4 8 4 9 5 10 5 11 6 12 6 13 7 14 7 15 8 16 8 17 9 18 9 19 10 20 10 21 11 22 11 23 12 24 12 25 13 26 13 27 14 28 14 29 15 30 15 31 16 32 16 33 17 34 17 35 18 36 18 37 19 38 19 39 20 40 20 41 21 42 21 43 22 44 22 45 23 46 23 47 24 48 24 49 25 50 25 51 26 52 26 53 27 54...
output:
752214506
result:
ok 1 number(s): "752214506"
Test #11:
score: 0
Accepted
time: 18ms
memory: 44872kb
input:
1 100000 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52...
output:
419022702
result:
ok 1 number(s): "419022702"