제출 #1361288

#제출 시각아이디문제언어결과실행 시간메모리
1361288minhphatHarmonija (COCI25_harmonija)C++20
68 / 110
25 ms8256 KiB
#include <iostream>
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;

const int N = 1e5 + 5 ;
int n , q , c[N] , p[N] ;
pair<int,int> Q[N] ;
vector<int> g[N] ;

namespace sub1
{

int dist[N] ;
void bfs(int start)
{
    for(int i = 1 ; i <= n ; i ++)
    {
        dist[i] = 1e9 ;
    }
    queue<int> q ;
    dist[start] = 0 ;
    q.push(start) ;
    while(q.empty() == false)
    {
        int u = q.front() ;
        q.pop() ;
        for(int v : g[u])
        {
            if(dist[v] == 1e9)
            {
                dist[v] = dist[u] + 1 ;
                q.push(v) ;
            }
        }
    }
}

vector<int> luu ;
int mark[N] ;
int ans = -1e18 ;
void ql(int pos)
{
    if(pos > luu.size() - 1)
    {
        int cur_0 = 0 ;
        int cur_1 = 0 ;
        for(int i = 0 ; i <= luu.size() - 1 ; i ++)
        {
            if(mark[luu[i]] == 0) cur_0 ++ ;
            else cur_1 ++ ;
            if(abs(cur_0 - cur_1) >= 3) return ;
        }

        int tong = 0 ;
        for(int i = 0 ; i <= luu.size() - 1 ; i ++ )
        {
            if(mark[luu[i]] == 0)
            {
                tong += c[luu[i]] ;
            }
            else
            {
                tong += p[luu[i]] ;
            }
        }
        ans = max(ans , tong) ;
        return ;
    }
    for(int i = 0 ; i <= 1 ; i ++ )
    {
        mark[luu[pos]] = i ;
        ql(pos + 1) ;
    }
}
void solve()
{
    for(int i = 1 ; i <= q ; i ++ )
    {
        int bdau = Q[i].first ;
        int kthuc = Q[i].second ;
        bfs(kthuc) ;
        luu.push_back(bdau) ;
        int cur = bdau ;
        while(cur != kthuc)
        {
            for(int next : g[cur])
            {
                if(dist[next] + 1 == dist[cur])
                {
                    cur = next ;
                    luu.push_back(cur) ;
                    break ;
                }
            }
        }
        ql(0) ;
        cout<<ans<<endl ;
        ans = -1e18 ;
        luu.clear() ;
        memset(mark , 0 , sizeof(mark)) ;
    }
}
}



namespace sub2
{

int dist[N] ;
void bfs(int start)
{
    for(int i = 1 ; i <= n ; i ++)
    {
        dist[i] = 1e9 ;
    }
    queue<int> q ;
    dist[start] = 0 ;
    q.push(start) ;
    while(q.empty() == false)
    {
        int u = q.front() ;
        q.pop() ;
        for(int v : g[u])
        {
            if(dist[v] == 1e9)
            {
                dist[v] = dist[u] + 1 ;
                q.push(v) ;
            }
        }
    }
}


int dp[N][3][2];
vector<int> luu ;
void intit()
{
    for(int i = 0 ; i <= luu.size() - 1 ; i ++)
    {
        dp[i][0][0] = dp[i][0][1] =
        dp[i][1][0] = dp[i][1][1] =
        dp[i][2][0] = dp[i][2][1] = -1e18 ;
    }
        dp[0][1][0] = c[luu[0]] ;
        dp[0][1][1] = p[luu[0]] ;
    for(int i = 1 ; i <= luu.size() - 1 ; i ++)
    {
        dp[i][0][0] = dp[i][0][1] = max(dp[i-1][1][0] + p[luu[i]] , dp[i-1][1][1] + c[luu[i]]) ;
        dp[i][1][0] = max(dp[i-1][0][0] + c[luu[i]] , dp[i-1][2][0] + p[luu[i]]);
        dp[i][2][0] = dp[i-1][1][0] + c[luu[i]];
        dp[i][1][1] = max(dp[i-1][0][1] + p[luu[i]] , dp[i-1][2][1] + c[luu[i]]);
        dp[i][2][1] = dp[i-1][1][1] + p[luu[i]];
    }
}
void solve()
{
    for(int i = 1 ; i <= q ; i ++ )
    {
        int bdau = Q[i].first ;
        int kthuc = Q[i].second ;
        bfs(kthuc) ;
        luu.push_back(bdau) ;
        int cur = bdau ;
        while(cur != kthuc)
        {
            for(int next : g[cur])
            {
                if(dist[next] + 1 == dist[cur])
                {
                    cur = next ;
                    luu.push_back(cur) ;
                    break ;
                }
            }
        }
        intit() ;
        cout<<max({dp[luu.size() - 1][0][0] , dp[luu.size() - 1][0][1] ,
                   dp[luu.size() - 1][1][0] , dp[luu.size() - 1][1][1] ,
                   dp[luu.size() - 1][2][0] , dp[luu.size() - 1][2][1]})<<endl ;
       luu.clear() ;
    }
}
}
signed main()
{
    ios::sync_with_stdio(0) ;
    cin.tie(0) ; cout.tie(0) ;
//    freopen(".inp" , "r" , stdin) ; 
//    freopen(".out" , "w" , stdout) ; 
    cin>>n>>q;
    for(int i = 1 ; i <= n ; i ++ )
    {
        cin>>c[i] ;
    }
    for(int i = 1 ; i <= n ; i ++)
    {
        cin>>p[i] ;
    }
    for(int i = 1 ; i <= n - 1 ; i ++)
    {
        int u , v ;
        cin>>u>>v;
        g[u].push_back(v) ;
        g[v].push_back(u) ;
    }
    for(int i = 1 ; i <= q ; i ++ )
    {
        cin>>Q[i].first>>Q[i].second;
    }
    if(n <= 15 && q <= 15) return sub1::solve() , 0 ;
    if(n <= 1000 && q <= 1000)return sub2::solve() ,0 ;
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…