Submission #413308

#TimeUsernameProblemLanguageResultExecution timeMemory
413308azberjibiouMeetings (JOI19_meetings)C++17
100 / 100
1153 ms960 KiB
#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;
#define fir first
#define sec second
const int mxN=2020;
vector <int> v[mxN], g[mxN];
bool Chk[mxN];
bool used[mxN];
int sub[mxN];
int msub[mxN];
int f[mxN], invf[mxN];
bool cmp1(int a, int b)
{
    return sub[a]>sub[b];
}
void dfs1(int now, int pre)
{
    sub[now]=1;
    msub[now]=-1;
    for(int nxt : v[now])
    {
        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 Solve(int N) {
    for(int i=0;i<N;i++)    f[i]=i;
    random_shuffle(f, f+N);
    for(int i=0;i<N;i++)    invf[f[i]]=i;
    v[0].push_back(1);
    v[1].push_back(0);
    for(int i=2;i<N;i++)
    {
        if(used[i]) continue;
        int root=1;
        for(int j=0;j<N;j++)    Chk[j]=false;
        int cnt=0;
        while(true)
        {
            cnt++;
            dfs1(root, -1);
            int cent=root;
            while(msub[cent]!=-1 && sub[msub[cent]]*2>sub[root])   cent=msub[cent];
            for(int nxt : v[cent])
            {
                if(Chk[nxt] || sub[nxt]<sub[cent])   continue;
                sub[nxt]=sub[root]-sub[cent];
            }
            g[cent].clear();
            for(int nxt : v[cent])  if(!Chk[nxt])   g[cent].push_back(nxt);
            sort(g[cent].begin(), g[cent].end(), cmp1);
            if(g[cent].empty())
            {
                v[cent].push_back(i);
                v[i].push_back(cent);
                break;
            }
            bool par=true;
            bool flag=false;
            for(int j=0;j<g[cent].size();j++)
            {
                int nxt=g[cent][j];
                int res=invf[Query(f[cent], f[nxt], f[i])];
                if(res!=cent)
                {
                    par=false;
                    if(res==i)
                    {
                        //printf("s1");
                        for(int k=0;k<v[cent].size();k++)
                        {
                            if(v[cent][k]==nxt)
                            {
                                v[cent][k]=i;
                                break;
                            }
                        }
                        for(int k=0;k<v[nxt].size();k++)
                        {
                            if(v[nxt][k]==cent)
                            {
                                v[nxt][k]=i;
                                break;
                            }
                        }
                        v[i].push_back(cent);
                        v[i].push_back(nxt);
                        flag=true;
                    }
                    else if(res==nxt)
                    {
                        root=nxt;
                        Chk[cent]=true;
                    }
                    else
                    {
                        for(int k=0;k<v[cent].size();k++)    {if(v[cent][k]==nxt) {v[cent][k]=res;   break;}}
                        for(int k=0;k<v[nxt].size();k++)    {if(v[nxt][k]==cent) {v[nxt][k]=res;    break;}}
                        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(par)
            {
                v[cent].push_back(i);
                v[i].push_back(cent);
                break;
            }
        }
    }
    for(int i=0;i<N;i++)
    {
        for(int nxt : v[i])
        {
            if(f[nxt]>f[i]) Bridge(f[i], f[nxt]);
        }
    }
}

Compilation message (stderr)

meetings.cpp: In function 'void Solve(int)':
meetings.cpp:64:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |             for(int j=0;j<g[cent].size();j++)
      |                         ~^~~~~~~~~~~~~~~
meetings.cpp:74:38: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |                         for(int k=0;k<v[cent].size();k++)
      |                                     ~^~~~~~~~~~~~~~~
meetings.cpp:82:38: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |                         for(int k=0;k<v[nxt].size();k++)
      |                                     ~^~~~~~~~~~~~~~
meetings.cpp:101:38: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  101 |                         for(int k=0;k<v[cent].size();k++)    {if(v[cent][k]==nxt) {v[cent][k]=res;   break;}}
      |                                     ~^~~~~~~~~~~~~~~
meetings.cpp:102:38: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |                         for(int k=0;k<v[nxt].size();k++)    {if(v[nxt][k]==cent) {v[nxt][k]=res;    break;}}
      |                                     ~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...