调了两天实在没办法了,求助dalao帮条
查看原帖
调了两天实在没办法了,求助dalao帮条
927155
_Elysia_楼主2024/6/5 09:18

下面的是样例,感觉是修改的问题。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6 + 20, s = 1;
ll n, m, q, V[N], W[N],C[N], a[N<<1], tot = 0;
ll in[N], out[N], tmp = 0;;
ll h[N], cnt = 1,cc = 0,cq = 0;
ll f[N][30], dep[N], ans[N];
ll S, bnum, bl[N], br[N], B[N], num[N];
bool vis[N];
struct node{
	ll v, nxt;
}e[N<<1];
struct query{
	ll l, r, time, id, lca, kk;
}Q[N<<1], c[N];
void add_edge(ll u, ll v) {
	e[++cnt] = (node){v, h[u]};
	h[u] = cnt;
}
void dfs(ll u, ll fa) {
	f[u][0] = fa;
	dep[u] = dep[fa] + 1;
	a[++tot] = u;
	in[u] = tot;
	for(int i = 1; i <= 20; i++) f[u][i] = f[f[u][i-1]][i-1];
	for(int i = h[u]; i; i = e[i].nxt){
		ll v = e[i].v;
		if(v == fa) continue;
		dfs(v, u);
	}
	a[++tot] = u;
	out[u] = tot;
}
ll LCA(ll u, ll v) {
	if(dep[u] < dep[v]) swap(u, v);
	for(int i = 20; i>= 0; i--) {
		if(dep[f[u][i]] >= dep[v]) u = f[u][i];
	}
	if(u == v) return u;
	for(int i = 20; i>= 0; i--) {
		if(f[u][i] != f[v][i]) u = f[u][i], v = f[v][i];
	}
	return f[u][0];
}

bool cmp(query a, query b) {
	return B[a.l] == B[b.l] ? B[a.r] == B[b.r] ? a.time < b.time : a.r < b.r : a.l < b.l;
}
void move(ll I, ll k) {
	vis[a[I]] ^= 1;
	if(vis[a[I]]) num[C[a[I]]]++, tmp += V[C[a[I]]] * W[num[C[a[I]]]];
	else tmp -= V[C[a[I]]] * W[num[C[a[I]]]], num[C[a[I]]]--;
}
//void AD(ll Col, ll k) {
//	if(k > 0) tmp += V[Col] * W[++num[Col]];
//	else      tmp -= V[Col] * W[num[Col]--];
//	
//}
int main(){
	scanf("%lld%lld%lld", &n, &m, &q);
	n *= 2;
	S = ceil(n/pow(q,1.0/3));
	bnum = ceil(n/S+0.5);
	for(int i = 1; i <= bnum; i++) {
		bl[i] = (i-1) * bnum + 1;
		br[i] = min(n, i * bnum);
		for(int j = bl[i]; j <= br[i]; j++) B[j] = i;
	}
	for(int i = 1; i <= m; i++) scanf("%lld", &V[i]);
	for(int i = 1; i <= n/2; i++) {
		scanf("%lld", &W[i]);
	}
	for(int i = 1; i < n/2; i++) {
		ll u, v;
		scanf("%lld%lld", &u, &v);
		add_edge(u, v);
		add_edge(v, u);
	}
	dfs(s, 0); 
	for(int i = 1; i <= n/2; i++) scanf("%lld", &C[i]);
	for(int i = 1; i <= q; i++) {
		ll t, x, y;
		scanf("%lld%lld%lld", &t, &x, &y);
		if(t == 0) {
			c[++cc] = (query){in[x],out[x], y};
		}
		else {
			if(dep[x] < dep[y]) swap(x, y);
			ll lca = LCA(x, y), kk = 0;
			if(lca == y || lca == x) x = in[x], y = in[y], kk = 0;
			else x = out[x], y = in[y], kk = 1;
			if(x > y) swap(x, y);
 			Q[++cq] = (query){x, y, cc, cq, lca, kk};
		}
	}
	sort(Q+1, Q+cq+1, cmp);
	ll l = 1, r = 0, t = 0;
	ll i = 0;
//	cout << endl <<"-----------------" << endl << endl;
	for(int i = 1; i <= cq; i++) {
		ll ql = Q[i].l, qr = Q[i].r, time = Q[i].time;
//		cout << ql << " " << qr << " " << time << endl;
		while(ql < l) move(--l, 1);
		while(r < qr) move(++r, 1);
		while(ql > l) move(l++, -1);
		while(r > qr) move(r--, -1);
//		cout << tmp << endl;
		while(t < time) {
			t++;
			ll change = C[a[c[t].l]];
			bool flag1 = 0, flag2 = 0;
			if(l <= c[t].l && c[t].l <= r) move(c[t].l, -1), flag1 = 1;
			if(l <= c[t].r && c[t].r <= r) move(c[t].r, -1), flag2 = 1;
			
			if(flag1 == 1) C[a[c[t].l]] = c[t].time, move(c[t].l, 1);
			if(flag2 == 1) C[a[c[t].r]] = c[t].time, move(c[t].r, 1);
			C[a[c[t].l]] = c[t].time;
			C[a[c[t].r]] = c[t].time;
			
			c[t].time = change;
			
		}
		while(t > time) {
			ll change = C[a[c[t].l]];
			bool flag1 = 0, flag2 = 0;
			if(l <= c[t].l && c[t].l <= r) move(c[t].l, -1), flag1 = 1;
			if(l <= c[t].r && c[t].r <= r) move(c[t].r, -1), flag2 = 1;
			
			if(flag1 == 1) C[a[c[t].l]] = c[t].time, move(c[t].l, 1);
			if(flag2 == 1) C[a[c[t].r]] = c[t].time, move(c[t].r, 1);
			C[a[c[t].l]] = c[t].time;
			C[a[c[t].r]] = c[t].time;
			c[t].time = change;
			t--;
		}
		ll lca = Q[i].lca;
		if(Q[i].kk) ans[Q[i].id] = tmp + (V[C[lca]] * W[num[C[lca]]+1]); 
		else ans[Q[i].id] = tmp;
	}
	
	for(int i = 1; i <= cq;i++) printf("%lld\n", ans[i]);
	
	
	return 0;
} 
/*
20 20 20
338985 290791 463601 487134 164037 217966 634037 150123 864209 974801 42241 909963 920357 443745 134001 852157 115722 364223 450033 259781
963481 938865 915101 822609 811713 768863 730441 590323 563935 559238 483185 478333 476461 431631 360547 123470 103899 93068 51575 31346
19 11
19 18
19 3
11 5
18 17
3 20
5 15
17 1
20 12
6 1
16 11
10 6
13 15
7 15
9 18
4 7
8 11
14 1
2 19
1 9 1 1 17 3 6 1 11 17 5 14 16 2 13 20 11 12 1 3
1 7 19
0 13 5
0 15 9
0 17 1
1 2 20
0 14 1
1 12 5
0 16 1
1 15 16
1 16 7
1 4 5
1 3 13
0 15 11
1 17 7
1 17 13
1 13 18
1 5 9
1 7 11
1 11 14
1 1 11
*/

/*
1692900670227
1924186465420
1788619871315
1428797039393
1638803139039
1480756606242
1901066789423
2041845801659
1985848300018
1667587147993
1513578549988
520246981646
2268702977160
1989850865295
*/

2024/6/5 09:18
加载中...