Submission #1316715

#TimeUsernameProblemLanguageResultExecution timeMemory
1316715athenaTowers (NOI22_towers)C++20
16 / 100
2096 ms85468 KiB
#include <bits/stdc++.h>
using namespace std;
//#define int long long int
int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    int n;
    cin>>n;
    vector<pair<int,int>>edge(n);
    vector<vector<int>>xx(1e6+1);
    vector<vector<int>>yy(1e6+1);
    for(int i=0;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        edge[i]={x,y};
        xx[x].push_back(y);
        yy[y].push_back(x);
    }
    for(int mask=0;mask<(1<<n);mask++)
    {int sm=0;int ll=0;
    int sm2=0;int ll2=0;
      int c=1;
      bool ok=true;
     // cout<<"MASK"<<endl;
       //for(int i=0;i<n;i++)
       // {
          //  if(mask&(1<<i))cout<<1;
           // else
            //    cout<<0;
      //  }
       // cout<<endl;
        for(int i=0;i<n;i++)
        {c=1;
            if(mask&(1<<i))//if tower
            {//check if no of towers exceed 2
                auto [x,y]=edge[i];
               // cout<<"EDGE "<<i<<endl;
                for(int u:xx[x])
                {
                    //find the i of this edge
                    int ind=0;
                    for(int j=0;j<n;j++)
                    {
                        if(edge[j].first==x&&edge[j].second==u)//found j
                        {
                           ind=j;
                         //  cout<<"J "<<j<<endl;
                           break;
                        }
                    }
                    if(ind!=i){
                    if(mask&(1<<ind))
                    {
                     c++;
                    // cout<<"IND "<<ind<<" C "<<c<<endl;
                    }
                    }
                    if(c>2){
                        ok=false;
                       // cout<<"HEY"<<endl;
                     break;
                    }
                }
                if(!ok)break;
                c=1;
                 for(int u:yy[y])
                {
                    //find the i of this edge
                    int ind=0;
                    for(int j=0;j<n;j++)
                    {
                        if(edge[j].first==u&&edge[j].second==y)//found j
                        {
                          
                           ind=j;
                    //         cout<<"IND "<<ind<<endl;
                           break;
                        }
                    }if(ind!=i){
                    if(mask&(1<<ind))
                    {
                     c++;
                    }
                    }
                    if(c>2){//cout<<"MEOW"<<endl;
                    ok=false;
                     break;
                    }
                }
                if(!ok)break;
            }
            else
            {   //find node in my adj
               // ll=0;sm=0;
               ok=false;
                   auto [x,y]=edge[i];
               // cout<<"EDGE "<<i<<endl;
               bool hy=false,ly=false;
                for(int u:xx[x])
                {
                 //   cout<<"U "<<u<<endl;
                      int ind=-1;
                     for(int j=0;j<n;j++)
                    {
                        if(edge[j].first==x&&edge[j].second==u)//found j
                        {
                           ind=j;
                           break;
                        }
                    }
                     if(ind==-1)continue;
                    if(!(mask&(1<<ind)))continue;
                  
                    if(u<y)
                    {
                     ly=true;
                    }
                    if(u>y)
                    {
                     hy=true;
                    }
                }
                
                bool hx=false,lx=false;
                for(int u:yy[y])
                {
                     int ind=-1;
                     for(int j=0;j<n;j++)
                    {
                        if(edge[j].first==u&&edge[j].second==y)//found j
                        {
                           ind=j;
                           break;
                        }
                    }
                    if(ind==-1)continue;
                    if(!(mask&(1<<ind)))continue;
                    
                    if(u<x)
                    {
                        lx=true;
                    }
                    if(u>x)
                    {
                        hx=true;
                    }
                }
              bool cc=(hx&&lx)||(hy&&ly);
              if(!cc){ok=false;break;}
              else
              ok=true;
            }

        }
        if(!ok)continue;
        //if((ll!=1||sm!=1)&&(ll2!=1||sm2!=1))continue;
        for(int i=0;i<n;i++)
        {
            if(mask&(1<<i))cout<<1;
            else
                cout<<0;
        }
        break;
    }
    return 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...