Submission #1140068

#TimeUsernameProblemLanguageResultExecution timeMemory
1140068c32ardashCutting a rectangle (LMIO18_staciakampis)C++20
25 / 100
249 ms123068 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()
{
    if(k%2)
        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);
}

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(check_spiral())
        cout<<"2\n1\n"<<k/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...