社区讨论

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 条回复,欢迎继续交流。

正在加载回复...