Submission #354293

#TimeUsernameProblemLanguageResultExecution timeMemory
354293denkendoemeerToll (APIO13_toll)C++14
100 / 100
2205 ms14024 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector<int>g[100005],aux;
array<int,3>ed[300005];
array<int,2>edk[25];
ll sum[25],ans;
int d[25],t[25],w[25],comp[100005],u;
template<int sz>
struct dsu
{
    int t[sz];
    int findt(int nod)
    {
        if (nod==t[nod])
            return nod;
        return t[nod]=findt(t[nod]);
    }
    bool onion(int x,int y)
    {
        x=findt(x);
        y=findt(y);
        t[y]=x;
        if (x==y)
            return 0;
        return 1;
    }
};
dsu<100005>d1,d2,d3;
dsu<25>d4,d5;
void dfs(int nod,int ta)
{
    t[nod]=ta;
    if (ta==-1)
        d[nod]=0;
    else
        d[nod]=d[ta]+1;
    for(auto it:g[nod])
        if (it!=ta)
            dfs(it,nod);
}
ll dfs2(int nod,ll s)
{
    ll cnt=s*sum[nod];
    for(auto it:g[nod])
        if (it!=t[nod])
            cnt=cnt+dfs2(it,s+w[it]);
    return cnt;

}
deque<array<int,3>>dq;
int main()
{
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    int n,m,k,x;
    scanf("%d%d%d",&n,&m,&k);
    int i;
    for(i=0;i<m;i++)
        scanf("%d%d%d",&ed[i][1],&ed[i][2],&ed[i][0]),--ed[i][1],--ed[i][2];
    sort(ed,ed+m);
    for(i=0;i<n;i++)
        d1.t[i]=i,d2.t[i]=i,d3.t[i]=i;
    for(i=0;i<k;i++){
        scanf("%d%d",&edk[i][0],&edk[i][1]);
        --edk[i][0];
        --edk[i][1];
        d1.onion(edk[i][0],edk[i][1]);
    }
    for(i=0;i<m;i++){
        if (d2.onion(ed[i][1],ed[i][2])==0)
            continue;
        if (d1.onion(ed[i][1],ed[i][2]))
            d3.onion(ed[i][1],ed[i][2]);
        else
            aux.push_back(i);
    }
    for(i=0;i<n;i++)
        if (d3.findt(i)==i)
            comp[i]=u++;
    for(i=0;i<n;i++){
        scanf("%d",&x);
        sum[comp[d3.findt(i)]]+=x;
    }
    for(auto it:aux){
        ed[it][1]=comp[d3.findt(ed[it][1])];
        ed[it][2]=comp[d3.findt(ed[it][2])];
    }
    for(i=0;i<k;i++){
        edk[i][0]=comp[d3.findt(edk[i][0])];
        edk[i][1]=comp[d3.findt(edk[i][1])];
    }
    int j;
    for(i=0;i<(1<<k);i++){
        for(j=0;j<u;j++)
            g[j].clear();
        for(j=0;j<u;j++)
            d4.t[j]=j,d5.t[j]=j;
        for(j=0;j<k;j++){
            if (i&(1<<j) && d4.onion(edk[j][0],edk[j][1])){
                g[edk[j][0]].push_back(edk[j][1]);
                g[edk[j][1]].push_back(edk[j][0]);
            }
        }
        dq.clear();
        for(auto it:aux){
            if (d4.onion(ed[it][1],ed[it][2])){
                g[ed[it][1]].push_back(ed[it][2]);
                g[ed[it][2]].push_back(ed[it][1]);
                dq.push_front((array<int,3>){0,ed[it][1],ed[it][2]});
            }
            else
                dq.push_back(ed[it]);
        }
        dfs(comp[d3.findt(0)],-1);
        for(auto it:dq){
            int x,y;
            x=d5.findt(it[1]);
            y=d5.findt(it[2]);
            while(x!=y){
                if (d[x]<d[y])
                    swap(x,y);
                w[x]=it[0];
                d5.onion(t[x],x);
                x=d5.findt(x);
            }
        }
        ans=max(ans,dfs2(comp[d3.findt(0)],0));
    }
    printf("%lld\n",ans);
return 0;
}

Compilation message (stderr)

toll.cpp: In function 'int main()':
toll.cpp:57:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   57 |     scanf("%d%d%d",&n,&m,&k);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
toll.cpp:60:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   60 |         scanf("%d%d%d",&ed[i][1],&ed[i][2],&ed[i][0]),--ed[i][1],--ed[i][2];
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
toll.cpp:65:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   65 |         scanf("%d%d",&edk[i][0],&edk[i][1]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
toll.cpp:82:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   82 |         scanf("%d",&x);
      |         ~~~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...