Submission #1140078

#TimeUsernameProblemLanguageResultExecution timeMemory
1140078c32ardashCutting a rectangle (LMIO18_staciakampis)C++20
25 / 100
250 ms123156 KiB
#include <bits/stdc++.h>
#define int long long

using namespace std;

const int KMAX=1e5+5, AMAX=5e6+5;
int viz[KMAX], a[KMAX], b[KMAX], k;
vector<int> adj[AMAX];
set<int> p;

int get_other(int i, int x)
{
    if(a[i]!=x)
        return a[i];
    return b[i];
}

void DFS(int x, int y, int nviz)
{
    if(nviz==k)
    {
        p.insert(min(x, y));
        return;
    }
    if(x<AMAX)
        for(auto i:adj[x])
            if(!viz[i])
            {
                viz[i]=1;
                DFS(x, y+get_other(i, x), nviz+1);
                viz[i]=0;
            }
    if(y<AMAX)
        for(auto i:adj[y])
            if(!viz[i])
            {
                viz[i]=1;
                DFS(x+get_other(i, y), y, nviz+1);
                viz[i]=0;
            }
}

bool check_spiral_even()
{
    if(k%2==1)
        return 0;
    for(int i=2;i<=k/2;i++)
        if(adj[i].size()==0)
            return 0;
    int st=a[k]-k/2+2;
    for(int i=st;i<=st+k/2-2;i++)
        if(adj[i].size()==0)
            return 0;
    int s=0;
    for(int i=k/2+1;i<st;i++)
        if(adj[i].size()>0)
            s+=i;
    return (s==st);
}

bool check_spiral_odd()
{
    if(k%2==0)
        return 0;
    for(int i=2;i<=(k-1)/2;i++)
        if(adj[i].size()==0)
            return 0;
    int st=a[k]-(k-1)/2+1;
    for(int i=st;i<=st+(k-1)/2-1;i++)
        if(adj[i].size()==0)
            return 0;
    int s=0;
    for(int i=(k-1)/2+1;i<st;i++)
        if(adj[i].size()>0)
            s+=i;
    return (s==st);
}

signed main()
{
    cin>>k;
    for(int i=1;i<=k;i++)
    {
        cin>>a[i]>>b[i];
        adj[a[i]].push_back(i);
        adj[b[i]].push_back(i);
    }
    if(k<=10)
    {
        for(int i=1;i<=k;i++)
        {
            viz[i]=1;
            DFS(a[i], b[i], 1);
            viz[i]=0;
        }
        cout<<p.size()<<'\n';
        for(auto x:p)
            cout<<x<<'\n';
        return 0;
    }
    if((k%2==0 && check_spiral_even()) || (k%2==1 && check_spiral_odd()))
        cout<<"2\n1\n"<<(k+1)/2;
    else
        cout<<"1\n1";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...