제출 #1366978

#제출 시각아이디문제언어결과실행 시간메모리
1366978thanhbinh13Harmonija (COCI25_harmonija)C++20
110 / 110
1162 ms811848 KiB
#include<bits/stdc++.h>
using namespace std;


const int N = 1e5+5;
struct matrix{
    long long a[5][5];
    matrix() {
        for (int i =0 ;i< 5; i++) for (int j = 0; j < 5; j++) a[i][j] = -1e18;
    }
};
matrix nhan(matrix &x,matrix &y) {
    matrix z;
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            for (int k = 0; k < 5; k++) {
                z.a[i][j] = max(z.a[i][j],x.a[i][k]+y.a[k][j]);
            }
        }
    }
    return z;
}
long long par[20][N];
matrix f[20][N],f2[20][N];
long long n;
long long blue[N],red[N];
long long h[N];
vector<long long> g[N];
void dfs(long long u,long long p = -1) {
    if (p == -1) {
        h[u] = 1;
        par[0][u] = u;
    } else {
        h[u] = h[p]+1;
        par[0][u] = p; 
    }
    for (auto v:g[u]) if (v != p) dfs(v,u);
}
long long getLca(long long u,long long v) {
    if (h[u] < h[v]) swap(u,v);
    long long delta = h[u]-h[v];
    for (int i = 0; i < 20; i++) {
        if ((delta >> i)&1) {
            u = par[i][u];
        }
    }
    if (u == v) return u;
    for (int i = 19; i >= 0; i--){
        if (par[i][u] != par[i][v]) {
            u = par[i][u];
            v = par[i][v];
        }
    }
    return par[0][u];
}
long long q;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> q;
    for (int i = 1; i <= n; i++ ){
        cin >> red[i];
    }
    for (int i = 1; i<= n; i++) {
        cin >> blue[i];
    }
    for (int i = 1; i < n; i++) {
        long long u,v;
        cin>> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    g[0].push_back(1);
    dfs(0);
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j < 5; j++) {
            if (j-1 >= 0) {
                f[0][i].a[j][j-1] = blue[i];
            }
            if (j+1 < 5) {
                f[0][i].a[j][j+1] = red[i];
            }
        }
        f2[0][i] = f[0][i];
    }
    for(int i = 1; i < 20; i++){
		for(int j = 0; j <= n; j++){
			long long nex = par[i-1][j];
			par[i][j] = par[i-1][nex];
			f[i][j] = nhan(f[i-1][j],f[i-1][nex]);
			f2[i][j] = nhan(f2[i-1][nex],f2[i-1][j]);
		}
	}
    while(q--) {
        long long u,v;
        cin >> u >> v;
        long long p = getLca(u,v);
        matrix res,res2;
        res.a[2][2] = 0;
        long long delta = h[u]-h[p];
        for (int i = 19; i >= 0; i--) {
            if (!((delta >> i)&1)) continue;
            res = nhan(res,f[i][u]);
            u = par[i][u];
        }
        res = nhan(res,f[0][p]);
        bool f = true;
        long long del = h[v]-h[p];
        for (int i = 19; i >= 0; i--) {
            if (!((del >> i)&1)) {
                continue;
            }
            if (f) res2 = f2[i][v];
            else res2 = nhan(f2[i][v],res2);
            v = par[i][v];
            f = false;
        }
        if (del != 0) res = nhan(res,res2);
        long long ans = -1e18;
        for (int i = 0; i < 5; i++) ans = max(ans,res.a[2][i]);
        cout << ans << "\n";
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…