Submission #369889

#TimeUsernameProblemLanguageResultExecution timeMemory
369889azberjibiouMeetings (JOI19_meetings)C++17
29 / 100
2494 ms17192 KiB
#include "meetings.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
using namespace std;
#define fir first
#define sec second
const int mxN=2020;
vector <int> v[mxN], g[mxN];
int msub[mxN];
bool Chk[mxN];
bool used[mxN];
int sub[mxN];
int par[mxN][mxN];
int findpar(int a, int b)
{
    if(par[a][b]==b)    return b;
    return par[a][b]=findpar(a, par[a][b]);
}
bool cmp1(int a, int b)
{
    return sub[a]>sub[b];
}
void dfs1(int now, int pre)
{
    //printf("now=%d\n", now);
    g[now].clear();
    sub[now]=1;
    msub[now]=-1;
    for(int pnxt : v[now])
    {
        int nxt=findpar(now, pnxt);
        if(Chk[nxt] || nxt==pre)    continue;
        dfs1(nxt, now);
        sub[now]+=sub[nxt];
        if(msub[now]==-1)   msub[now]=nxt;
        else if(sub[msub[now]]<sub[nxt])    msub[now]=nxt;
    }
}
void dfs2(int now, int pre)
{
    //printf("2now=%d\n", now);
    g[now].clear();
    sub[now]=1;
    for(int pnxt : v[now])
    {
        int nxt=findpar(now, pnxt);
        if(Chk[nxt] || nxt==pre)    continue;
        dfs2(nxt, now);
        sub[now]+=sub[nxt];
        g[now].push_back(nxt);
    }
}
void Solve(int N) {
    v[0].push_back(1);
    v[1].push_back(0);
    for(int i=0;i<N;i++)    for(int j=0;j<N;j++)    par[i][j]=j;
    for(int i=2;i<N;i++)
    {
        if(used[i]) continue;
        int root=i-1;
        for(int j=0;j<N;j++)    Chk[j]=false;
        int cnt=0;
        while(true)
        {
            dfs1(root, -1);
            int cent=root;
            while(!g[cent].empty() && sub[msub[cent]]*2>sub[cent])   cent=g[cent][0];
            dfs2(cent, -1);
            //printf("cent=%d\n", cent);
            //for(int j=0;j<i;j++)    printf("Chk[%d]=%d\n", j, Chk[j]);
            /*for(int j=0;j<i;j++)
            {
                printf("%d: ", j);
                for(int nxt : g[j]) printf("%d ", nxt);
                printf("\n");
            }*/
            if(g[cent].empty())
            {
                v[cent].push_back(i);
                v[i].push_back(cent);
                break;
            }
            bool ispar=true;
            bool flag=false;
            sort(g[cent].begin(), g[cent].end(), cmp1);
            for(int j=0;j<g[cent].size();j++)
            {
                int nxt=g[cent][j];
                int res=Query(cent, nxt, i);
                if(res!=cent)
                {
                    ispar=false;
                    if(res==i)
                    {
                        //printf("s1");
                        par[cent][nxt]=i;
                        par[nxt][cent]=i;
                        v[i].push_back(cent);
                        v[i].push_back(nxt);
                        flag=true;
                    }
                    else if(res==nxt)
                    {
                        //printf("s2");
                        root=nxt;
                        Chk[cent]=true;
                        //assert(cent!=nxt);
                    }
                    else
                    {
                        //printf("s3");
                        par[cent][nxt]=res;
                        par[nxt][cent]=res;
                        v[res].push_back(cent);
                        v[res].push_back(nxt);
                        v[i].push_back(res);
                        v[res].push_back(i);
                        used[res]=true;
                        flag=true;
                    }
                    break;
                }
            }
            if(flag)    break;
            if(ispar)
            {
                v[cent].push_back(i);
                v[i].push_back(cent);
                break;
            }
        }
    }
    for(int i=0;i<N;i++)
    {
        for(int pnxt : v[i])
        {
            int nxt=findpar(i, pnxt);
            if(nxt>i)   Bridge(i, nxt);
        }
    }
}

Compilation message (stderr)

meetings.cpp: In function 'void Solve(int)':
meetings.cpp:88:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |             for(int j=0;j<g[cent].size();j++)
      |                         ~^~~~~~~~~~~~~~~
meetings.cpp:64:13: warning: unused variable 'cnt' [-Wunused-variable]
   64 |         int cnt=0;
      |             ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...