求调 马蜂好看
查看原帖
求调 马蜂好看
722313
Whiking楼主2024/8/29 16:08

rt 样例没过 懒得调了

#include <bits/stdc++.h>
#define mid ((l + r) >> 1)

void Freopen() {
    freopen("", "r", stdin);
    freopen("", "w", stdout);
}

using namespace std;
const int N = 2e5 + 10, M = 2e5 + 10, inf = 1e9, mod = 998244353;

int read( int x = 0) { return cin >> x, x; }

int n, Q, A; 
int a[N], ind[N];

vector< pair< int, int> > G[N];

int dis[N], dep[N], son[N], fa[N], siz[N];

void dfs1( int u, int fu) {
	dep[u] = dep[fu] + 1, fa[u] = fu, siz[u] = 1;
	
	for ( auto i : G[u]) {
		int v = i.first;
		
		if (v == fu) continue ;
		
		dis[v] = dis[u] + i.second;
		
		dfs1(v, u);
		
		siz[u] += siz[v];
		son[u] = (siz[son[u]] < siz[v] ? v : son[u]);
	}
}

int top[N];

void dfs2( int u, int topt) {
	top[u] = topt;
	
	if (son[u]) dfs2(son[u], topt);
	
	for ( auto i : G[u])
		if (i.first != fa[u] && i.first != son[u])
			dfs2(i.first, i.first);
}

int lca( int u, int v) {
	int tu = top[u], tv = top[v];
	
	while (tu != tv) {
		if (dep[tu] < dep[tv]) swap(tu, tv), swap(u, v);
		
		u = fa[tu], tu = top[u];
	}
	
	return dep[u] < dep[v] ? u : v;
}

int Dis( int u, int v) {
	return dis[u] + dis[v] - 2 * dis[lca(u, v)];
}

struct node {
    int root;

    int siz[N], fa[N], vis[N], mx[N];

    void init()    {
        root = 0;

        memset(siz, 0, sizeof siz);
        memset(fa, 0, sizeof fa);
        memset(vis, 0, sizeof vis);
        memset(mx, 0, sizeof mx);
    }

    void getsiz( int u, int fu) {
        siz[u] = 1;
        int v;

        for ( auto i : G[u])
            if ((v = i.first) != fu && ! vis[v])
                getsiz(v, u), siz[u] += siz[v];
    }

    void getrt( int u, int fu, int sum, int & rt) {
        mx[u] = 0;
        int v;

        for ( auto i : G[u])
            if ((v = i.first) != fu && ! vis[v])
                getrt(v, u, sum, rt), mx[u] = max(mx[u], siz[v]);

        mx[u] = max(mx[u], sum - siz[u]);

        if (mx[u] <= sum / 2) rt = u;
    }

    int build( int u) {
        getsiz(u, 0);

        int rt = 0, v;
        getrt(u, 0, siz[u], rt);

        vis[rt] = 1;

        for ( auto i : G[rt]) 
            if (! vis[(v = i.first)])     
                fa[build(v)] = rt;

        return rt;
    }
} S;

int sum[N * 70], ls[N * 70], rs[N * 70];
int tot;

void ins( int & k, int l, int r, int x, int v) {
	if (! k) k = ++ tot;
	
	if (l == r) return sum[k] += v, void();
	
	x <= mid ? ins(ls[k], l, mid, x, v) : ins(rs[k], mid + 1, r, x, v);
	sum[k] = sum[ls[k]] + sum[rs[k]];
}

int ask( int k, int l, int r, int x, int y)  {
	if (! k) return 0;
	
	if (x <= l && r <= y) return sum[k];
	
	int res = 0;
	
	if (x <= mid) res += ask(ls[k], l, mid, x, y);
	if (y > mid) res += ask(rs[k], mid + 1, r, x, y);
	
	return res;
}

int rt1[N], rt2[N], f[N];

signed main() {
    ios :: sync_with_stdio(false);
    
	n = read(), Q = read(), A = read();
	
	for ( int i = 1; i <= n; i ++) a[i] = read();
		
	for ( int i = 1; i < n; i ++) {
		int u = read(), v = read(), w = read();
		
		G[u].push_back({v, w}), G[v].push_back({u, w});
	}
	
	dfs1(1, 0), dfs2(1, 1);
	
	S.init(), S.root = S.build(1);
	
	for ( int u = 1; u <= n; u ++) {
		for ( int x = u; x; x = S.fa[x]) {
			int d = Dis(u, x);
			
			ins(rt1[x], 0, A, a[u], d);
			f[x] += 1;
			
			if (S.fa[x]) {
				d = Dis(u, S.fa[x]);
				
				ins(rt2[x], 0, A, a[u], d);
			}
		}
	}
	
	int lst = 0;
	
	while (Q --) {
		int u = read(), a = read(), b = read();
		
		int L = min((a + lst) % A, (b + lst) % A), R = min((a + lst) % A, (b + lst) % A);
		
		int ans = ask(rt1[u], 0, A, L, R);
		
		for ( int x = u; S.fa[x]; x = S.fa[x]) {
			ans += ask(rt1[S.fa[x]], 0, A, L, R);
			ans -= ask(rt2[x], 0, A, L, R);
			ans += (f[S.fa[x]] - f[x]) * Dis(S.fa[x], u);
		}
		
		cout << (lst = ans) << endl;
	}
} 

2024/8/29 16:08
加载中...