Submission #1361062

#TimeUsernameProblemLanguageResultExecution timeMemory
1361062minhphatHarmonija (COCI25_harmonija)C++20
0 / 110
1 ms836 KiB
#include <iostream>
#include<bits/stdc++.h>
#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 = -1e9 ;
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 = -1e9 ;
        luu.clear() ;
        memset(mark , 0 , sizeof(mark)) ;
    }
}
}
signed main()
{
    ios::sync_with_stdio(0) ;
    cin.tie(0) ; cout.tie(0) ;
    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 ;
    return 0;
}

#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...