Submission #259743

#TimeUsernameProblemLanguageResultExecution timeMemory
259743peti1234Vision Program (IOI19_vision)C++17
29 / 100
12 ms1408 KiB

#include "vision.h"

#include <bits/stdc++.h>

using namespace std;
#define rep(n) for (int i=0; i<n; i++)
#define jrep(n) for (int j=0; j<n; j++)
bool valasz[50005];
const int c=202, f=25;
int pos, ua, nua, v[c], px[c], seg[c], seg2[c], sor[c], oszlop[c], nagy[c], kis[c], ans[c], id;
vector<int> sol;
void pb(int a) {
    sol.push_back(a);
}
int add(int a) {
    pos++;

    if (a==1) add_or(sol);
    if (a==2) add_and(sol);
    if (a==3) add_xor(sol);
    if (a==4) add_not(ua);

/*
    cout << sol.size() << " " << a << "\n";
    rep(sol.size()) cout << sol[i] << " ";
    cout << "\n";
*/
    if (a==4) valasz[pos]=!(valasz[ua]);
    else {
        int si=sol.size(), db=0;
        rep(si) db+=valasz[sol[i]];
        if (a==1) valasz[pos]=(db>0);
        if (a==2) valasz[pos]=(db==si);
        if (a==3) valasz[pos]=(db%2);
    }
    sol.clear();
    return pos;
}
void calc(int n) {
    //cout << "ugyanaz\n";
    int ff=min(n, f);
    rep(n) pb(v[i]);
    ua=add(3), nua=add(4);
    //cout << "bazdmeg " << valasz[ua] << "\n";
    //cout << "prefix xor\n";
    rep(n) {
        if (i) pb(px[i-1]);
        pb(v[i]);
        px[i]=add(3);
    }
    //cout << "nagysag\n";
    for (int j=0; j<n; j+=f) {
        rep(n-j) pb(px[i]), pb(px[i+j]), seg[i]=add(2);
        rep(n-j) pb(seg[i]);
        nagy[j/f]=add(1);
        if (j) pb(nagy[j/f-1]), pb(nagy[j/f]), nagy[j/f-1]=add(3);
    }
    //cout << "mod\n";
    rep(ff) {
        for (int j=i; j<n; j+=f) pb(v[j]);
        seg[i]=add(1);
    }
    //cout << "kis\n";
    rep(ff) {
        if (!i) {
            rep(ff) pb(seg[i]);
            kis[0]=add(3), i++;
            if (i==ff) break;
        }
        jrep(ff-i) pb(seg[j]), pb(seg[j+i]), seg2[j]=add(2);
        jrep(ff-i) pb(seg2[j]);
        kis[i]=add(1);
    }
}
void construct_network(int n, int m, int k) {
    pos=n*m-1;
    //cout << "sor\n";
    rep(n) {
        int p=m*i;
        rep(m) pb(p+i);
        v[i]=add(1);
    }
    calc(n);
    //cout << "melyiksor\n";
    rep(n) {
        if (!i) {
            pb(ua);
            sor[i]=add(1), i++;
            if (n==1) break;
        }
        pb(nua), pb(kis[i%f]), pb(nagy[(i-1)/f]);
        sor[i]=add(2);
    }
    //rep(n) cout << "sor " << valasz[sor[i]] << "\n";
    //cout << "oszlop\n";
    rep(m) {
        int p=i;
        rep(n) pb(p+m*i);
        v[i]=add(1);
    }
    calc(m);
    //cout << "melyikoszlop\n";
    rep(m) {
        if (!i) {
            pb(ua);
            oszlop[i]=add(1), i++;
            if (m==1) break;
        }
        pb(nua), pb(kis[i%f]), pb(nagy[(i-1)/f]);
        oszlop[i]=add(2);
    }
    //rep(m) cout << "oszlop " << valasz[oszlop[i]] << "\n";
    //cout << "osszesitve\n";
    rep(n) {
        int j=k-i;
        if (j>=0 && j<m) pb(sor[i]), pb(oszlop[j]), ans[id]=add(2), id++;
        //if (j>=0 && j<m) cout << "lehet " << i << " " << j << " " << valasz[sor[i]] << " " << valasz[oszlop[j]] << "\n";
    }
    rep(id) pb(ans[i]);
    add(1);
    //cout << "vege\n" << pos << " " << valasz[pos] << "\n";
}









/*
int b1, b2, b3, x, y;
int main()
{
    cin >> b1 >> b2 >> b3 >> x >> y;
    valasz[x]=1, valasz[y]=1;
    construct_network(b1, b2, b3);
    //rep(pos+1) cout << i << " " << valasz[i] << endl;
    cout << valasz[pos] << "\n";
    return 0;
}
*/
/*
2 3 2 0 2
*/
// talán jó
#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...