제출 #720445

#제출 시각아이디문제언어결과실행 시간메모리
720445bin9638Vision Program (IOI19_vision)C++17
100 / 100
18 ms1820 KiB
#include <bits/stdc++.h>

#ifndef SKY
#include "vision.h"
#endif // SKY

using namespace std;

#define N 210
#define ll long long
#define fs first
#define sc second
#define ii pair<int,int>
#define pb push_back

const int num_bit=9;

#ifdef SKY
vector<int>ask;

int add_not(int x)
{
    int res=ask.size();
    ask.pb((!ask[x]));
    return res;
}

int add_and(vector<int>s)
{
    assert(!s.empty());
    int res=ask.size();
    int val=1;
    for(auto u:s)
        val&=ask[u];
    ask.pb(val);
    return res;
}

int add_or(vector<int>s)
{
     assert(!s.empty());
    int res=ask.size();
    int val=0;
    for(auto u:s)
        val|=ask[u];
    ask.pb(val);
    return res;
}

int add_xor(vector<int>s)
{
     assert(!s.empty());
    int res=ask.size();
    int val=0;
    for(auto u:s)
        val^=ask[u];
    ask.pb(val);
    return res;
}
#endif // SKY

int bit_0,bit_1;

int solve(int pos,int x,int vt)
{
    vector<int>them;
    for(int i=0;i<vt;i++)
        them.pb(bit_0);
    them.pb(x);
    for(int i=vt+1;i<num_bit;i++)
        them.pb(add_and({them[i-1],pos+i-1}));
    int res=add_xor({them[0],pos});
    for(int i=1;i<num_bit;i++)
        add_xor({them[i],pos+i});
    return res;
}

int build(int n,vector<int>s,int id)
{
    //cout<<n<<endl;
    //for(auto u:s)cout<<ask[u]<<" ";cout<<endl;
    vector<int>hoi;
    for(auto u:s)
        hoi.pb(u);
    int kt=add_xor(hoi),copy_kt=kt;
    kt=add_not(kt);
    bit_0=add_and({kt,copy_kt});
    for(int i=0;i<n;i++)
        s[i]=add_and({s[i],kt});
    for(int i=1;i<n;i++)
    s[i]=add_xor({s[i],s[i-1]});
   // for(auto u:s)cout<<ask[u]<<" ";cout<<endl;
    int pos=add_and({bit_0});
    for(int i=1;i<num_bit;i++)
        add_and({bit_0});
    for(int i=0;i<n;i++)
        pos=solve(pos,s[i],0);
    //for(int i=0;i<num_bit;i++)cout<<ask[pos+i]<<" ";cout<<endl;
    return pos;
}

void construct_network(int n, int m, int k)
{
    vector<int>s;
    int pos[2];
    //hàng
    for(int i=0;i<n;i++)
    {
        vector<int>hoi;
        for(int j=0;j<m;j++)
            hoi.pb(i*m+j);
        s.pb(add_or(hoi));
    }
    pos[0]=build(n,s,0);
    //cột
    s.clear();
    for(int j=0;j<m;j++)
    {
        vector<int>hoi;
        for(int i=0;i<n;i++)
            hoi.pb(i*m+j);
        s.pb(add_or(hoi));
    }
    pos[1]=build(m,s,1);
   // cout<<pos[0]<<" "<<pos[1]<<endl;
   bit_1=add_not(bit_0);
   int vt=pos[0];
   for(int i=0;i<num_bit;i++)
        vt=solve(vt,pos[1]+i,i);
   //for(int i=0;i<num_bit;i++)cout<<ask[vt+i]<<" ";cout<<endl;
    int pos_k=add_and({(k%2==1 ? bit_1 : bit_0)});
    for(int i=1;i<num_bit;i++)
       add_and({((k>>i)&1) ? bit_1 : bit_0});
    vector<int>hoi;
    for(int i=0;i<num_bit;i++)
        hoi.pb(add_xor({vt+i,pos_k+i}));
    add_not(add_or(hoi));
}

#ifdef SKY
int main()
{
    freopen("A.inp","r",stdin);
    freopen("A.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    int n,m,k;
    cin>>n>>m>>k;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            int u;
            cin>>u;
            ask.pb(u);
        }
    construct_network(n,m,k);
    cout<<ask.back();
    return 0;
}
#endif
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...