QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#690282#9492. 树上简单求和dieselhuang0 2897ms64068kbC++143.7kb2024-10-30 21:25:422024-10-30 21:25:43

Judging History

This is the latest submission verdict.

  • [2024-10-30 21:25:43]
  • Judged
  • Verdict: 0
  • Time: 2897ms
  • Memory: 64068kb
  • [2024-10-30 21:25:42]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
int n, m, B;
int dfx = 0, dfn[200010], rnk[200010], siz[200010], c[200010];
ull a[200010], ans[200010], f[200010], tg[510];
struct Tree{
	int hd[200010], e[400010][2], fa[200010], dep[200010], Fa[200010][19];
	int b[200010];
	void dfs1(int u){
		int i, v;
		for(i = 1, Fa[u][0] = fa[u]; i <= 18; i++) Fa[u][i] = Fa[Fa[u][i - 1]][i - 1];
		for(i = hd[u]; i > 0; i = e[i][0]){
			v = e[i][1];
			if(v != fa[u]){
				fa[v] = u; dep[v] = dep[u] + 1; dfs1(v);
			}
		}
	}
	void dfs2(int u){
		dfn[u] = ++dfx; rnk[dfx] = u; siz[u] = 1;
		int i, v;
		for(i = hd[u]; i > 0; i = e[i][0]){
			v = e[i][1];
			if(v != fa[u]){
				dfs2(v);
				siz[u] += siz[v];
			}
		}
	}
	void dfs4(int u, int x){
		b[u] = x;
		int i, v;
		for(i = hd[u]; i > 0; i = e[i][0]){
			v = e[i][1];
			if(v != fa[u] && b[v] == 0) dfs4(v, x);
		}
	} 
	int dfs3(int u){
		int i, v, x = 0;
		for(i = hd[u]; i > 0; i = e[i][0]){
			v = e[i][1];
			if(v != fa[u]){
				x = max(x, dfs3(v) + 1);
			}
		}
		if(x >= B || u == 1){ dfs4(u, u); return -1; }
		else return x;
	}
	void dfs5(int u){
		int i, v;
		for(i = hd[u]; i > 0; i = e[i][0]){
			v = e[i][1];
			if(v != fa[u]){
				c[v] += c[u]; dfs5(v);
			}
		}
	}
	void init(bool fl){
		int i, u, v;
		for(i = 1; i <= n; i++) hd[i] = 0, b[i] = 0;
		for(i = 1; i >> 1 < n - 1; i++){
			scanf("%d%d", &u, &v);
			e[i][0] = hd[u]; e[i][1] = v; hd[u] = i;
			i++;
			e[i][0] = hd[v]; e[i][1] = u; hd[v] = i;
		}
		fa[1] = 1; dep[1] = 0; dfs1(1);
		if(fl){
			for(i = 1; i <= n; i++) b[i] = (i + B - 1) / B;
		}
	}
	int lca(int u, int v){
		if(dep[u] < dep[v]) swap(u, v);
		int i, j = dep[u] - dep[v];
		for(i = 0; 1 << i <= j; i++){
			if(j >> i & 1) u = Fa[u][i];
		}
		if(u == v) return u;
		for(i = 18; i >= 0; i--){
			if(Fa[u][i] != Fa[v][i]) u = Fa[u][i], v = Fa[v][i];
		}
		return fa[u];
	}
} T1, T2;
int qry2(int x){ return (x > 0 ? f[x] + tg[T1.b[x]] : 0); }
int qry(int u){ return qry2(dfn[u] + siz[u] - 1) - qry2(dfn[u] - 1); }
void upd(int u, ull x){
	u = dfn[u];
	int i;
	for(i = u; i <= n && T1.b[i] == T1.b[u]; i++) f[i] += x;
	for(i = T1.b[u] + 1; i <= T1.b[n]; i++) tg[i] += x;
}
ull calc(int u){
	ull res = 0;
	while(u != T2.b[u]){
		res += qry(u); u = T2.fa[u];
	}
	return res;
}
struct Node{
	int u, v, w1, w2; ull k;
} q[200010];
int main()
{
	int i, j, u, v, w;
	ull x;
	scanf("%d%d", &n, &m); B = sqrt(n);
	for(i = 1; i <= n; i++){
		scanf("%llu", &a[i]); f[i] = 0;
	}
	T1.init(1); T2.init(0);
	T1.dfs2(1); T2.dfs3(1);
	for(i = 1; i <= m; i++){
		scanf("%d%d%llu", &q[i].u, &q[i].v, &q[i].k); ans[i] = 0;
		q[i].w1 = T1.lca(q[i].u, q[i].v); q[i].w2 = T2.lca(q[i].u, q[i].v);
	}
	for(i = 1; i <= n; i++){
		if(T2.b[i] == i){
			x = 0;
			for(u = 1; u <= n; u++) c[u] = 0;
			for(u = i; 1; u = T2.fa[u]){
				c[u]++; x += a[u];
				if(u == 1) break;
			}
			T1.dfs5(1);
			for(j = 1; j <= m; j++){
				u = q[j].u; v = q[j].v; w = q[j].w1;
				x += (c[u] + c[v] - c[w] - (w > 1 ? c[T1.fa[w]] : 0)) * q[j].k;
				w = q[j].w2;
				if(i == T2.b[u]) ans[j] += x;
				if(i == T2.b[v]) ans[j] += x;
				if(i == T2.b[w]) ans[j] -= x;
				if(w > 1 && i == T2.b[T2.fa[w]]) ans[j] -= x;
			}
		}
	}
	for(i = 1; i <= T1.b[n]; i++) tg[i] = 0;
	for(i = 1; i <= n; i++){
		upd(i, a[i]);
		if(i > 1) upd(T1.fa[i], -a[i]);
	}
	for(i = 1; i <= m; i++){
		u = q[i].u; v = q[i].v; w = q[i].w1; x = q[i].k;
		upd(u, x); upd(v, x); upd(w, -x);
		if(w > 1) upd(T1.fa[w], -x);
		w = q[i].w2;
		ans[i] += calc(u) + calc(v) - calc(w) - (w > 1 ? calc(T2.fa[w]) : 0llu);
		printf("%llu\n", ans[i]);
	}
	return 0;
}

詳細信息

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 8ms
memory: 26472kb

input:

3000 3000
7236742292501328495 17973811477309806363 16075782662531676171 17971236571771878676 11392080645527132110 3685563455925680459 9773593720088356683 8313828403245053795 7736401634567449043 1634817828009987181 6951124933529719486 12775126714635387213 15460977209223753216 397573676785925632 31372...

output:

18213677769774559108
17093949732820879813
6110234250561971030
6110234228423663688
1330905225009004758
11074110175631365991
8433723884804489525
11723819164747508792
2350619461296926746
4061418469493211354
2350619469274930855
2350619475661824409
12622461363894560980
18446744073567209572
18298806766670...

result:

wrong answer 1st lines differ - expected: '12105153858659381124', found: '18213677769774559108'

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Skipped

Dependency #2:

0%

Subtask #4:

score: 0
Wrong Answer

Test #21:

score: 0
Wrong Answer
time: 1426ms
memory: 58872kb

input:

200000 200000
622783158027686223 2242697872372232537 8481648430436878777 10092474834140799044 15403999682625301609 12614289513474949582 9180944589267018841 7823784919308285798 8257785171198951273 5134508521895120821 8041682272181381093 3835432206618893170 2653803171409877650 5589823419153460372 1007...

output:

5992130163325007899
15788779831852462006
5992130156728352042
6740920874893153742
18446744050101345185
6740920858806597237
6752936956096127136
18446744068888736763
14379797934398346571
19356463153
15706774571095152241
15350898835381430140
4238848451990875552
6558621449428044457
28539808038
6558621414...

result:

wrong answer 1st lines differ - expected: '9042998055336671259', found: '5992130163325007899'

Subtask #5:

score: 0
Time Limit Exceeded

Test #27:

score: 0
Time Limit Exceeded

input:

200000 200000
1958469220619413759 14991498002015735322 6054491201406941902 18206143187746582567 15082377615826460430 2936248617457291604 10073577150351675920 16534472678586906457 2207599132486246393 10301540360769075442 1492580560381080472 551692353431379140 13238280352539145808 8462626987240986565 ...

output:

12443773617971303229
17958613905992277634
10844063474478471115
1596102579398339954
5898414357963520549
8723621788247717768
5389285892797269859
10465985597189066040
443898306555964067
8745373126383700524
14784395955507208613
10287438334892623361
12977874567624650582
16380308455126745954
5098578956645...

result:


Subtask #6:

score: 0
Wrong Answer

Test #34:

score: 0
Wrong Answer
time: 2897ms
memory: 64068kb

input:

200000 200000
6794776813641982926 1561596256197101737 10910039723053043515 7892247858295192798 12233819960547881004 17695389034783066733 9173201689566865598 17626618141377486739 7358781671024283919 6787559733384974662 3884392438269280436 14872846228351316833 9037842441501571648 14299818404271084016 ...

output:

1370573908951975329
7153661384656771363
17475059586371309861
13997910247847513485
12660536706123999875
14361768362401820099
16570665247875482874
1993432124531586127
7119560896192262864
7155027614797542047
14959367101851052309
5404761479915667951
4004205354693387280
7764333739647442641
17792450473835...

result:

wrong answer 1st lines differ - expected: '5519324519442957729', found: '1370573908951975329'

Subtask #7:

score: 0
Skipped

Dependency #1:

0%