Submission #1370880

#TimeUsernameProblemLanguageResultExecution timeMemory
1370880solution6312Multi Communication 2 (JOI26_multi)C++17
21 / 100
498 ms2528 KiB
#include "multi.h"
#include <iostream>
#include <vector>
#include <cassert>
#include <tuple>
#include <algorithm>
#include <set>
using namespace std;
using ull=unsigned long long;
using piu=pair<int, ull>;
using ti2u=tuple<int, int, ull>;

namespace
{
    const ull inf64=(1ull<<48)-1;
    const int MN=256;
    int dsu[MN], par[MN];
    ti2u opt[MN];
    bool tkn[MN];
    vector<int> g[MN];
    int find(int x)
    {
        if (dsu[x]==x) return x;
        else return dsu[x]=find(dsu[x]);
    }
    bool unite(int x, int y)
    {
        x=find(x); y=find(y);
        if (x==y) return 0;
        dsu[y]=x; return 1;
    }
    void dfs(int u)
    {
        //cerr<<u<<endl;
        dsu[u]=par[u];
        for (int v:g[u]) if (v!=par[u])
        {
            par[v]=u;
            dfs(v);
        }
    }
}

vector<ull> strategy(int N, int R, int U, vector<ull> A, vector<ull> B)
{
    //cerr<<"STRATEGY "<<N<<' '<<R<<' '<<U<<endl;
    //cerr<<"A: "; for (ull i:A) cerr<<i<<' '; cerr<<endl;
    //cerr<<"B: "; for (ull i:B) cerr<<i<<' '; cerr<<endl;
    if (R==0)
    {
        piu edge={0, inf64};
        for (int i=0; i<N; i++) if (i!=U) if (edge.second>A[i]) edge={i, A[i]};
        ull val=0;
        for (int i=0; i<8; i++) if ((U>>i)&1) val^=(1ull<<i);
        for (int i=0; i<8; i++) if ((edge.first>>i)&1) val^=(1ull<<(8+i));
        for (int i=0; i<48; i++) if ((edge.second>>i)&1) val^=(1ull<<(16+i));
        vector<ull> vec(N, val);
        //cerr<<edge.first<<' '<<edge.second<<endl;
        return vec;
    }
    if (R==9)
    {
        ull ans=0;
        for (int i=0; i<N; i++)
        {
            ull wgt=0;
            for (int j=0; j<48; j++) if ((B[i]>>j)&1) wgt^=(1ull<<j);
            ans+=wgt;
        }
        //cerr<<"! "<<ans<<endl;
        return {ans};
    }
    for (int i=0; i<N; i++) g[i].clear();
    for (int i=0; i<N; i++)
    {
        dsu[i]=0;
        for (int j=0; j<8; j++) if ((B[i]>>j)&1) dsu[i]^=(1ull<<j);
        if (dsu[i]!=i)
        {
            g[i].push_back(dsu[i]);
            g[dsu[i]].push_back(i);
        }
        opt[i]={i, 0, 0};
        for (int j=0; j<8; j++) if ((B[i]>>(8+j))&1) get<1>(opt[i])^=(1ull<<j);
        for (int j=0; j<48; j++) if ((B[i]>>(16+j))&1) get<2>(opt[i])^=(1ull<<j);
        //cerr<<i<<": "<<get<1>(opt[i])<<' '<<get<2>(opt[i])<<endl;
    }
    for (int i=0; i<N; i++)
    {
        if (get<2>(opt[find(i)])>get<2>(opt[i]))
        {
            opt[find(i)]=opt[i];
        }
    }
    for (int i=0; i<N; i++)
    {
        if (dsu[i]==i)
        {
            auto [u, v, w]=opt[i];
            if (w==inf64) continue;
            assert(find(u)!=find(v));
            g[u].push_back(v);
            g[v].push_back(u);
            //cerr<<u<<" AND "<<v<<endl;
            assert(unite(u, v));
        }
    }
    for (int i=0; i<N; i++)
    {
        if (dsu[i]==i)
        {
            par[i]=i;
            dfs(i);
        }
    }
    //for (int i=0; i<N; i++) cerr<<i<<": "<<par[i]<<endl;
    vector<ull> vec;
    if (R<8)
    {
        piu edge={0, inf64};
        for (int i=0; i<N; i++)
        {
            if (find(i)!=find(U))
            {
                if (edge.second>A[i])
                {
                    edge.first=i;
                    edge.second=A[i];
                }
            }
        }
        ull val=0;
        for (int i=0; i<8; i++) if ((par[U]>>i)&1) val^=(1ull<<i);
        for (int i=0; i<8; i++) if ((edge.first>>i)&1) val^=(1ull<<(8+i));
        for (int i=0; i<48; i++) if ((edge.second>>i)&1) val^=(1ull<<(16+i));
        vec=vector<ull>(N, val);
    }
    else
    {
        ull val=0;
        for (int i=0; i<48; i++) if ((A[par[U]]>>i)&1) val^=(1ull<<i);
        vec=vector<ull>(N, val);
    }
    return vec;
}
#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...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...