G小沙的身法 树上前缀和+Tarjan离线求LCA,0%通过

试过很多数据都能过,为什么过不了啊嗷
求大神指点下


#include<iostream>
#include<cstring>
#define ll long long
#define endl "\n"
using namespace std;
const int N = 1e6 + 10;
const int M = 1e5 + 10;
struct Edge {
	int to, nxt;
}edge[2 * N], qedge[2 * M];
int head[N];
int cnt;
int qhead[M];
int qcnt;
bool vis[N],vis2[N];
ll sum[N], resum[N];
int pre[N];
int n, m, x, y, a[N], fa[M], u[M], v[M];

void init()
{
	memset(qhead, -1, sizeof(qhead));
	memset(head, -1, sizeof(head));
	for (int i = 1; i <= n; i++)
		pre[i] = i;
}

void add(int u, int v)
{
	cnt++;
	edge[cnt].to = v;
	edge[cnt].nxt = head[u];
	head[u] = cnt;
}

void add_(int u, int v)
{
	qcnt++;
	qedge[qcnt].to = v;
	qedge[qcnt].nxt = qhead[u];
	qhead[u] = qcnt;
}

int find(int x) {
	return pre[x] == x ? x : pre[x] = find(pre[x]);
}

void join(int x, int y)
{
	x = find(x);
	y = find(y);
	pre[x] = y;
}

void dfs(int u)
{
	vis[u] = true;
	for (int i = head[u]; ~i; i = edge[i].nxt) {
		int v = edge[i].to;
		if (vis[v])
			continue;
		sum[v] = sum[u] + (a[v] > a[u] ? a[v]-a[u] : 0);
		resum[v] = resum[u] + (a[u] > a[v] ? a[u] - a[v] : 0);
		dfs(v);
	}
}

void tarjan(int u)
{
	vis2[u] = true;
	for (int i = head[u]; ~i; i = edge[i].nxt) {
		int v = edge[i].to;
		if (vis2[v])
			continue;
		tarjan(v);
		join(v, u);
	}
	for (int i = qhead[u]; ~i; i = qedge[i].nxt) {
		int v = qedge[i].to;
		if (vis2[v])
			fa[(i + 1) / 2] = find(v);
	}
}

int main()
{
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin >> n >> m;
	init();
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	for (int i = 1; i < n; i++) {
		cin >> x >> y;
		add(x, y);
		add(y, x);
	}
	for (int i = 1; i <= m; i++) {
		cin >> u[i] >> v[i];
		add_(u[i], v[i]);
		add_(v[i], u[i]);
	}
	dfs(1);
	tarjan(1);
	ll ans;
	for (int i = 1; i <= m; i++) {
		ans = a[u[i]] + (resum[u[i]] - resum[fa[i]]) + (sum[v[i]] - sum[fa[i]]);
		cout << ans << endl;
	}

	return 0;
}

全部评论
ac区千篇一律的倍增lca,没一个Tarjan的,为什么
点赞 回复 分享
发布于 2022-03-26 17:21

相关推荐

不愿透露姓名的神秘牛友
06-19 14:46
和女友两个人马上毕业,现在我在鹅实习995,周六日偶尔也去北京;她在北京金融007,经常忙到后半夜,周末也没啥休息机会两个人现在都不咋聊天了,一句话隔半小时甚至半天才回。&nbsp;她是个很优秀的妹子,工作也很努力,是值得学习一辈子的人。我在努力工作求转正,即便不行至少赚到了一段不错的实习经历。已经异地了半年,接下来可能还会持续是这个状态。我们都算是对方重要的人,只是感觉看上去不是很有未来的样子。希望牛友们给点的鼓励
梦旅奇缘:很难。异地首先就已经很难了,加上妹子是金融行业,忙碌高压,对情感需求很高,而且见惯纸醉金迷,你的很多优势在她那里可能就不算什么了。这种情况下,在她们那里遇到一个能及时照顾她的人,即使那人可能很多条件不如你,你也有可能被分手。 说白了,两个卷王就不太适合在一起。因为卷王最大的优势,在另一个卷王那里就不算优势了。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务