社区讨论
RE on #4 求助
P3258[JLOI2014] 松鼠的新家参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lrxh5qon
- 此快照首次捕获于
- 2024/01/28 20:26 2 年前
- 此快照最后确认于
- 2024/01/28 22:10 2 年前
感觉不是空间开小了,有没有哪个大佬能帮忙调一下qwq
CPP#include<bits/stdc++.h>
#define int long long
#define ls (p << 1)
#define rs (p << 1 | 1)
using namespace std;
int n, m, ro, mod;
int head[3000005], cnt, w[3000005], wt[3000005];
int son[3000005], id[3000005], fa[3000005], dfn, dep[3000005], sz[200005], top[200005];
int res;
struct node {
int ans, tag;
} t[3000005];
struct edg {
int to, nxt;
} e[3000005];
inline void add(int u, int v) {
e[++cnt].to = v;
e[cnt].nxt = head[u];
head[u] = cnt;
}
inline void pushdown(int p, int l, int r) {
int mid = l + r >> 1;
t[ls].tag += t[p].tag;
t[rs].tag += t[p].tag;
t[ls].ans += t[p].tag * (mid - l + 1);
t[rs].ans += t[p].tag * (r - mid);
t[p].tag = 0;
}
inline void pushup(int p) {
t[p].ans = t[ls].ans + t[rs].ans;
}
void build(int l, int r, int p) {
t[p].tag = 0;
if(l == r) {
t[p].ans = wt[l];
return;
}
int mid = l + r >> 1;
build(l, mid, ls);
build(mid + 1, r, rs);
pushup(p);
}
void query(int p, int l, int r, int sl, int sr) {
if(sl <= l and r <= sr) {
res += t[p].ans;
return;
}
int mid = l + r >> 1;
pushdown(p, l, r);
if(mid >= sl) query(ls, l, mid, sl, sr);
if(mid < sr) query(rs, mid + 1, r, sl, sr);
}
void update(int p, int l, int r, int sl, int sr, int k) {
if(sl <= l and r <= sr) {
t[p].tag += k;
t[p].ans += (r - l + 1) * k;
return;
}
int mid = l + r >> 1;
pushdown(p, l, r);
if(mid >= sl) update(ls, l, mid, sl, sr, k);
if(mid < sr) update(rs, mid + 1, r, sl, sr, k);
pushup(p);
}
inline void dfs1(int u, int f, int deep) {
dep[u] = deep;
fa[u] = f;
sz[u] = 1;
int maxsz = 0;
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if(v == f) continue;
dfs1(v, u, deep + 1);
sz[u] += sz[v];
if(sz[v] > maxsz) {
son[u] = v;
maxsz = sz[v];
}
}
}
inline void dfs2(int u, int topp) {
id[u] = ++dfn;
wt[dfn] = w[u];
top[u] = topp;
if(!son[u]) return;
dfs2(son[u], topp);
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if(v == fa[u] or v == son[u]) continue;
dfs2(v, v);
}
}
inline int qrange(int u, int v) {
int ans = 0;
while(top[u] != top[v]) {
if(dep[top[u]] < dep[top[v]]) swap(u, v);
res = 0;
query(1, 1, n, id[top[u]], id[u]);
ans += res;
u = fa[top[u]];
}
if(dep[u] > dep[v]) swap(u, v);
res = 0;
query(1, 1, n, id[u], id[v]);
ans += res;
return ans;
}
inline void uprange(int u, int v, int k) {
while(top[u] != top[v]) {
if(dep[top[u]] < dep[top[v]]) swap(u, v);
update(1, 1, n, id[top[u]], id[u], k);
u = fa[top[u]];
}
if(dep[u] > dep[v]) swap(u, v);
update(1, 1, n, id[u], id[v], k);
}
int st[3000005];
signed main() {
cin>>n;
//for(int i = 1; i <= n; i++) w[i] = 0;
for(int i = 1; i <= n; i++)
cin>>st[i];
for(int i = 1; i < n; i++) {
int u, v;
cin>>u>>v;
add(u, v);
add(v, u);
}
dfs1(1, 0, 1);
dfs2(1, 1);
build(1, n, 1);
for(int i = 1; i < n; i++) {
uprange(st[i], st[i + 1], 1);
uprange(st[i + 1], st[i + 1], -1);
}
for(int i = 1; i <= n; i++)
cout<<qrange(i, i)<<'\n';
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...