Submission #1339248

#TimeUsernameProblemLanguageResultExecution timeMemory
1339248athenaLight Bulbs (EGOI24_lightbulbs)C++20
0 / 100
1 ms352 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long int
int n;
int query(vector<string>&out)
{
    cout<<"?"<<endl;
    for(auto ii:out)
    cout<<ii<<endl;
   // cout<<endl;
    int x;
    cin>>x;
    return x;
}
bool same(int x,int y,int i,int j)
{
  vector<string>out(n,string(n,'0'));
  out[x][y]='1';
  out[i][j]='1';
  return (query(out)%n==0);
}
int findh(int i,int type)
{
    int l=0,r=n-1;
    int ans=-1;

    while(l<=r)
    {
        int mid=(l+r)/2;
        vector<string>out(n,string(n,'0'));
        for(int j=0;j<=mid;j++)
            out[i][j]='1';
        int c=query(out);

        if(c==(mid+1)*n)
            l=mid+1;
        else
        {
            ans=mid;
            r=mid-1;
        }
    }
    return ans;
}
int findv(int j,int type)
{
    int l=0,r=n-1;
    int ans=-1;

    while(l<=r)
    {
        int mid=(l+r)/2;
        vector<string>out(n,string(n,'0'));
        for(int i=0;i<=mid;i++)
            out[i][j]='1';
        int c=query(out);

        if(c==(mid+1)*n)
            l=mid+1;
        else
        {
            ans=mid;
            r=mid-1;
        }
    }
    return ans;
}
vector<string> build(char type)
{
    //find rows
   vector<int>rows(n,0);
   for(int i=0;i<n;i++)
   {
     vector<string> out(n, string(n, '0'));
       for(int j=0;j<n;j++)
       {
          out[i][j]='1';
       }
       if(query(out)!=n*n)
        rows[i]=1;
       else 
       return out;
   }
   vector<int>col(n,0);
   for(int j=0;j<n;j++)
   {
    vector<string> out(n, string(n, '0'));
       for(int i=0;i<n;i++)
       {
          out[i][j]='1';
       }
       if(query(out)!=n*n)
        col[j]=1;
       else 
       return out;
   }
   vector<vector<int>>dp(n+1,vector<int>(n+1,1e18));
        for(int i=n;i>=0;i--)
        {
            for(int j=n;j>=0;j--)
            {
                if(i==n||j==n)
                {
                    dp[i][j]=0;
                    continue;
                }
                  if(rows[i])
                  {
                     dp[i][j]=min(dp[i][j],dp[i+1][j]+1);
                  }
                  if(col[j])
                  {
                     dp[i][j]=min(dp[i][j],dp[i][j+1]+1);
                  }
            }
        }
    vector<string>out(n,string(n,'0'));
    int i=0,j=0;
    while (i<n&&j<n) {
      //  bool ok=false;
        if (rows[i]==1&&dp[i][j]==dp[i+1][j]+1) {
                   int J=findh(i,type);
                    out[i][J]='1';
                    i++;
            }
            else
            {
                int I=findv(j,type);
                out[I][j]='1';
                j++;
            }
        }
      
  //  }
    return out;
}
vector<string> recons(const vector<string>&grid,vector<vector<int>>&dp) {
   
}
int32_t main() {
    cin>>n;
    vector<vector<int>>grid(n,vector<int>(n));
    //assume 0,0 as something
    vector<char>assume={'H','V'};
    for(char t:assume)
    {
        //build a grid based on how it responds do that
        vector<string> out=build(t);
        //build a dp to check our ans and to output positions
        
        //rebuild
        //vector<string>out=recons(grid,dp);
        //test
        if(query(out)==n*n)
        {
            cout<<"!"<<endl;
            for(auto i:out)
                cout<<i<<endl;
            cout<<endl;
            return 0;
        }
    }
    
    
    
}

Compilation message (stderr)

Main.cpp: In function 'std::vector<std::__cxx11::basic_string<char> > recons(const std::vector<std::__cxx11::basic_string<char> >&, std::vector<std::vector<long long int> >&)':
Main.cpp:139:1: warning: no return statement in function returning non-void [-Wreturn-type]
  139 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...