ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#204781 | #3620. A | Tony2 | 100 | 18009ms | 98368kb | C++11 | 4.8kb | 2024-06-09 11:51:10 | 2024-06-09 13:13:43 |
answer
/*
Even with one's eyes closed, heaven is there.
As long as heaven is lodged in,
there is no way to avert your gaze
from what you wish not to see.
Meaning, you may only see
what it wants you to see.
Even though one's eyes were closed,
one's sight remained open.
It will be forever impossible to close.
*/
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 3e5 + 5;
int n, q, srt[N];
vector<int> e[N];
int fa[N], de[N], sz[N], son[N];
int top[N], dfsnum, dfn[N], rev[N];
ll a[N];
set<pair<int, int>> st[N];
void dfs1(int u){
sz[u] = 1;
for (int v : e[u])
if (v != fa[u]){
fa[v] = u;
de[v] = de[u] + 1;
dfs1(v);
sz[u] += sz[v];
if (sz[v] > sz[son[u]])
son[u] = v;
}
}
void dfs2(int u){
rev[dfn[u] = ++dfsnum] = u;
if (son[u]){
top[son[u]] = top[u];
dfs2(son[u]);
}
for (int v : e[u])
if (v != fa[u] && v != son[u]){
top[v] = v;
dfs2(v);
}
}
void dfs3(int u){
st[u].insert({sz[u], u});
for (int v : e[u])
if (v != fa[u]){
dfs3(v);
if (st[u].size() < st[v].size()) swap(st[u], st[v]);
for (pair<int, int> p : st[v]) st[u].insert(p);
st[v].clear();
}
while (st[u].begin()->first * 2 <= sz[u]) st[u].erase(st[u].begin());
srt[u] = st[u].begin()->second;
}
int kfa(int u, int k){
k = de[u] - k;
while (de[top[u]] - 1 >= k) u = fa[top[u]];
return rev[dfn[u] - (de[u] - k)];
}
int lca(int u, int v){
while (top[u] != top[v]){
if (de[top[u]] < de[top[v]]) swap(u, v);
u = fa[top[u]];
}
return de[u] < de[v] ? u : v;
}
vector<pair<int, int>> getpath(int u, int v){
vector<pair<int, int>> res;
while (top[u] != top[v]){
if (de[top[u]] < de[top[v]]) swap(u, v);
res.emplace_back(dfn[top[u]], dfn[u]);
u = fa[top[u]];
}
if (dfn[u] > dfn[v]) swap(u, v);
res.emplace_back(dfn[u], dfn[v]);
return res;
}
struct tree{
ll a[N];
void add(int x, ll k){
for (; x <= n; x += x & -x) a[x] += k;
}
ll ask(int x){
ll res = 0;
for (; x; x -= x & -x) res += a[x];
return res;
}
}T, Ts, Td;
void add(int l, int r, ll k){
T.add(l, k);
T.add(r + 1, -k);
}
void addsz(int l, int r, ll k){
Ts.add(l, k);
Ts.add(r + 1, -k);
}
void addde(int l, int r, ll k){
Td.add(l, k);
Td.add(r + 1, -k);
}
ll ask(int u){
return T.ask(dfn[u]) + Td.ask(dfn[u]) * de[u] + Ts.ask(dfn[u]) * sz[u];
}
int step(int u){
if (ask(1) <= 0) return 1;
if (u > 1 && ask(u) <= 0){
while (top[u] != 1 && ask(top[u]) <= 0) u = fa[top[u]];
int l = dfn[top[u]], r = dfn[u], mid;
while (l <= r){
mid = (l + r) >> 1;
if (ask(rev[mid]) <= 0) r = mid - 1;
else l = mid + 1;
}
u = rev[r];
}
return u;
}
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
cin >> n >> q;
for (int i = 1; i < n; i++){
int u, v;
cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
dfs1(1);
top[1] = 1;
dfs2(1);
dfs3(1);
int ans = 1;
while (q--){
int opt, u, val, mid;
cin >> opt >> u;
if (opt == 1){
mid = srt[u];
cin >> val;
add(1, dfn[u] - 1, -1ll * sz[u] * val);
if (u > 1){
vector<pair<int, int>> vec = getpath(1, fa[u]);
for (pair<int, int> p : vec){
int l = p.first, r = p.second;
add(l, r, 2ll * sz[u] * val);
}
}
add(dfn[u], dfn[u] + sz[u] - 1, -1ll * sz[u] * val);
addsz(dfn[u], dfn[u] + sz[u] - 1, 2 * val);
add(dfn[u] + sz[u], n, -1ll * sz[u] * val);
}else{
int v;
cin >> v >> val;
int l = lca(u, v), len = de[u] + de[v] - 2 * de[l] + 1;
if (len & 1) mid = kfa(de[u] > de[v] ? u : v, len / 2);
else mid = kfa(de[u] > de[v] ? u : v, len / 2);
add(1, dfn[l], -1ll * len * val);
vector<pair<int, int>> vec = getpath(1, l);
for (pair<int, int> p : vec){
int l2 = p.first, r2 = p.second;
add(l2, r2, 2ll * len * val);
}
add(dfn[l] + 1, dfn[l] + sz[l] - 1, -1ll * len * val);
if (u != l){
vec = getpath(u, kfa(u, de[u] - de[l] - 1));
for (pair<int, int> p : vec){
int l2 = p.first, r2 = p.second;
add(l2, r2, 2ll * (de[u] + 1) * val);
addde(l2, r2, -2 * val);
}
}
if (v != l){
vec = getpath(v, kfa(v, de[v] - de[l] - 1));
for (pair<int, int> p : vec){
int l2 = p.first, r2 = p.second;
add(l2, r2, 2ll * (de[v] + 1) * val);
addde(l2, r2, -2 * val);
}
}
add(dfn[l] + sz[l], n, -1ll * len * val);
}
// for (int i = 2; i <= n; i++) cout << ask(i) << ' ';
// cout << endl;
ans = step(ans);
mid = step(mid);
if (de[mid] > de[ans]) ans = mid;
cout << ans << endl;
// pair<int, int> mx(-1, 1);
// for (int i = 2; i <= n; i++)
// if (ask(i) > 0)
// mx = max(make_pair(de[i], i), mx);
// cout << mx.second << endl;
}
return 0;
}
详细
小提示:点击横条可展开更详细的信息
Subtask #1:
score: 10
Accepted
Test #1:
score: 10
Accepted
time: 19ms
memory: 22844kb
input:
1631 1695 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...
output:
1303 721 688 701 682 737 588 628 713 769 774 780 862 866 871 886 909 929 937 943 941 946 945 954 949...
result:
ok 1695 lines
Test #2:
score: 0
Accepted
time: 21ms
memory: 22592kb
input:
1724 1881 2 1 3 2 4 2 5 2 6 1 7 6 8 2 9 8 10 6 11 10 12 1 13 1 14 12 15 7 16 3 17 14 18 13 19 4 20 8...
output:
910 910 910 910 910 910 910 910 910 910 910 910 826 826 826 826 826 826 1006 1006 1006 1006 1006 100...
result:
ok 1881 lines
Test #3:
score: 0
Accepted
time: 12ms
memory: 22592kb
input:
1935 1603 2 1 3 2 4 3 5 1 6 1 7 2 8 6 9 1 10 1 11 8 12 11 13 10 14 4 15 2 16 9 17 8 18 14 19 14 20 7...
output:
14 2 10 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 ...
result:
ok 1603 lines
Test #4:
score: 0
Accepted
time: 22ms
memory: 22584kb
input:
1782 1942 2 1 3 1 4 2 5 4 6 1 7 1 8 1 9 7 10 4 11 5 12 10 13 4 14 7 15 14 16 15 17 3 18 5 19 16 20 1...
output:
14 7 7 7 4 4 4 4 4 1 1 7 1 4 4 4 4 4 4 2 1 1 4 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1...
result:
ok 1942 lines
Subtask #2:
score: 20
Accepted
Test #5:
score: 20
Accepted
time: 1546ms
memory: 94988kb
input:
281495 252939 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 1...
output:
213578 210748 135169 135026 144651 132400 134957 124141 118451 118781 137612 154321 170613 166113 17...
result:
ok 252939 lines
Test #6:
score: 0
Accepted
time: 1706ms
memory: 92984kb
input:
273746 287587 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 1...
output:
189163 189918 190785 185592 183371 184857 188261 186057 186098 184608 193692 178813 178667 179002 17...
result:
ok 287587 lines
Test #7:
score: 0
Accepted
time: 1438ms
memory: 86280kb
input:
247712 269003 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 1...
output:
176247 185709 162271 169277 173592 171721 153484 155588 162688 163154 161122 160221 154947 154853 14...
result:
ok 269003 lines
Test #8:
score: 0
Accepted
time: 1477ms
memory: 98368kb
input:
294554 246011 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 1...
output:
225125 191067 199412 203257 197830 189818 184048 184192 183424 180181 180167 185337 187207 185668 18...
result:
ok 246011 lines
Subtask #3:
score: 30
Accepted
Test #9:
score: 30
Accepted
time: 1409ms
memory: 94076kb
input:
286640 284270 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 1...
output:
257488 195036 211947 235498 241668 232198 232766 228649 228553 208960 201281 202100 202317 203208 20...
result:
ok 284270 lines
Test #10:
score: 0
Accepted
time: 1494ms
memory: 43108kb
input:
260280 269761 2 1 3 1 4 2 5 4 6 5 7 2 8 3 9 6 10 7 11 1 12 7 13 3 14 9 15 3 16 11 17 13 18 2 19 14 2...
output:
180457 180457 171997 177266 159775 159174 159174 159174 232429 232429 146084 146084 146084 146084 14...
result:
ok 269761 lines
Test #11:
score: 0
Accepted
time: 1235ms
memory: 46152kb
input:
299939 243207 2 1 3 1 4 2 5 1 6 5 7 5 8 1 9 3 10 8 11 1 12 9 13 8 14 11 15 5 16 13 17 11 18 14 19 16...
output:
289736 289736 8 5 1 1 1 1 1 1 9190 9190 9190 9190 9190 9190 9190 9190 9190 9190 9190 9190 9190 9190 ...
result:
ok 243207 lines
Test #12:
score: 0
Accepted
time: 1146ms
memory: 43084kb
input:
260657 248813 2 1 3 1 4 1 5 4 6 5 7 1 8 5 9 5 10 5 11 1 12 9 13 11 14 6 15 12 16 10 17 12 18 16 19 1...
output:
192653 115832 172896 11 5 190178 32264 32264 9 9 9 9 12 12 12 12 3992 3992 3992 3992 3992 3992 3992 ...
result:
ok 248813 lines
Subtask #4:
score: 40
Accepted
Test #13:
score: 40
Accepted
time: 1357ms
memory: 84632kb
input:
241289 290298 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 1...
output:
198749 185755 175529 192379 192636 183414 183546 173058 171195 154762 156345 166238 164292 163728 15...
result:
ok 290298 lines
Test #14:
score: 0
Accepted
time: 1946ms
memory: 48272kb
input:
295796 290103 2 1 3 1 4 2 5 1 6 1 7 6 8 4 9 8 10 2 11 5 12 4 13 4 14 3 15 12 16 2 17 10 18 1 19 14 2...
output:
70561 125326 125326 133092 125326 125326 125326 125326 125326 125326 125326 133092 133092 133092 125...
result:
ok 290103 lines
Test #15:
score: 0
Accepted
time: 1661ms
memory: 45788kb
input:
268550 291961 2 1 3 2 4 1 5 1 6 3 7 3 8 3 9 3 10 2 11 4 12 6 13 12 14 12 15 3 16 1 17 14 18 6 19 1 2...
output:
223475 1 2 2 2 4435 4435 4435 4435 2716 2716 2716 2716 2716 2716 2716 2716 2716 2716 2716 2716 2716 ...
result:
ok 291961 lines
Test #16:
score: 0
Accepted
time: 1520ms
memory: 47396kb
input:
287030 275087 2 1 3 1 4 1 5 4 6 3 7 6 8 6 9 3 10 5 11 9 12 8 13 1 14 4 15 10 16 1 17 5 18 11 19 12 2...
output:
18 9 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 712...
result:
ok 275087 lines
Extra Test:
score: 0
Extra Test Passed