Submission #1342453

#TimeUsernameProblemLanguageResultExecution timeMemory
1342453WarinchaiDžumbus (COCI19_dzumbus)C++20
0 / 110
30 ms24120 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;

int inf=1e3;

struct node{
    int ar[3];
    node(){
        ar[0]=ar[1]=ar[2]=inf;
    }
};

int d[1005];
int p[1005];
vector<int>adj[1005];
vector<node>dp[1005];
int sz[1005];

int state[3][3]={
    {0,0,0},
    {1,2,2},
    {2,2,2}
};

int add[3][3]={
    {0,0,0},
    {0,2,1},
    {0,1,0}
};

int fp(int a){
    if(p[a]==a)return a;
    return p[a]=fp(p[a]);
}

void un(int a,int b){
    p[fp(a)]=fp(b);
}

void merge(int a,int b){
    int n=dp[a].size()+dp[b].size();
    vector<node>temp(n,node());
    for(int i=0;i<dp[a].size();i++)for(int j=0;j<dp[b].size();j++){
        for(int k=0;k<3;k++)for(int l=0;l<3;l++){
            if(dp[a][i].ar[k]==inf||dp[b][j].ar[l]==inf)continue;
            int go=i+j+add[k][l];
            temp[go].ar[state[k][l]]=min(temp[go].ar[state[k][l]],dp[a][i].ar[k]+dp[b][j].ar[l]);
        }
    }
    dp[a]=temp;
}

void dfs(int u,int p){
    //cerr<<"u:"<<u<<"\n";
    dp[u].push_back(node());
    dp[u][0].ar[0]=0;
    dp[u][0].ar[1]=d[u];
    dp[u][0].ar[2]=inf;
    dp[u].push_back(node());
    dp[u][1].ar[0]=inf;
    dp[u][1].ar[1]=inf;
    dp[u][1].ar[2]=inf;
    for(auto x:adj[u])if(x!=p){
        dfs(x,u);
        merge(u,x);
    }
}

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,m;cin>>n>>m;
    int sum=0;
    for(int i=1;i<=n;i++)cin>>d[i],p[i]=i,sum+=d[i];
    //cerr<<"sum:"<<sum<<"\n";
    for(int i=0;i<m;i++){
        int a,b;cin>>a>>b;
        adj[a].push_back(b);
        adj[b].push_back(a);
        un(a,b);
    }
    for(int i=1;i<=n;i++){
        if(fp(i)==i){
            //cerr<<"i:"<<i<<"\n";
            adj[0].push_back(i);
            adj[i].push_back(0);
        }
    }
    dfs(0,-1);
    vector<int>val;
    for(int i=0;i<=n;i++){
        if(i==1)val.push_back(0);
        else val.push_back(dp[0][i].ar[0]);
    }
    //for(auto x:val)cerr<<x<<" ";
    //cerr<<"\n";
    int q;cin>>q;
    for(int i=0;i<q;i++){
        int x;cin>>x;
        int id=upper_bound(val.begin(),val.end(),x)-val.begin()-1;
        if(id==1)id=0;
        //cout<<id<<"\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...