Submission #600307

#TimeUsernameProblemLanguageResultExecution timeMemory
600307Sam_a17Vision Program (IOI19_vision)C++14
100 / 100
246 ms10936 KiB
#include <bits/stdc++.h>
using namespace std;

#define sz(x) (int((x).size()))
#define len(x) (int)x.length()
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define dbg(x) cerr << #x << " " << x << endl;

#define pb push_back
#define ld long double
#define ll long long

int add_and(std::vector<int> Ns);
int add_or(std::vector<int> Ns);
int add_xor(std::vector<int> Ns);
int add_not(int N);

void pr(vector<int>& a) {
  cerr << "[ ";
  for(auto i: a) {
    cerr << i << " ";
  }
  cerr << "]" << endl;
}

void pr(deque<int>& a) {
  cerr << "[ ";
  for(auto i: a) {
    cerr << i << " ";
  }
  cerr << "]" << endl;
}

const int N = 205, M = 1e5 + 10;
int a[N][N];

int lxor[M], rxor[M];
int lor[M], ror[M];

vector<int> rows[M], cols[M];

void construct_network(int H, int W, int K) {
  
  int cnt = H * W, qn = 0;
  int n = H, m = W;

  vector<pair<int, int>> diag;


  //
  for(int i = m - 1; i >= 0; i--) {
    int x = 0, y = i;
    while(x < H && y < W) {
      rows[qn].push_back(x * W + y);
      x++, y++;
    }

    add_or(rows[qn]);
    add_xor(rows[qn]); 
    
    ror[qn] = cnt;
    rxor[qn] = cnt + 1;
    
    cnt += 2;
    qn++;
  }
  
  //
  for(int i = 1; i < n; i++) {
    int x = i, y = 0;
    while(x < H && y < W) {
      rows[qn].push_back(x * W + y);
      x++, y++;
    }

    add_or(rows[qn]);
    add_xor(rows[qn]); 
    
    ror[qn] = cnt;
    rxor[qn] = cnt + 1;
    
    cnt += 2;
    qn++;
  }

  dbg(qn)
  //
  qn = 0;
  for(int i = 0; i < m; i++) {
    int x = 0, y = i;
    while(x < n && y >= 0) {
      cols[qn].push_back(x * W + y);
      x++, y--;
    }

    add_or(cols[qn]);
    add_xor(cols[qn]); 
    
    lor[qn] = cnt;
    lxor[qn] = cnt + 1;
    
    cnt += 2;
    qn++;
  }
  
  //
  for(int i = 1; i < n; i++) {
    int x = i, y = m - 1;
    while(x < n && y >= 0) {
      cols[qn].push_back(x * W + y);
      x++, y--;
    }

    add_or(cols[qn]);
    add_xor(cols[qn]); 
    
    lor[qn] = cnt;
    lxor[qn] = cnt + 1;

    cnt += 2;
    qn++;
  }
  dbg(qn)


  auto slidingWindow = [&](int ki)->int {
    vector<int> answ1, answ2;
    for(int i = 0; i + ki < n + m - 1; i++) {
      vector<int> askii, askii2;  
      for(int j = i; j <= i + ki; j++) {
        askii.push_back(ror[j]);
        askii2.push_back(rxor[j]);
      }

      pr(askii);

      add_or(askii);
      add_xor(askii2);
      add_xor({cnt, cnt + 1});
      answ1.push_back(cnt + 2);
      cnt += 3;


      askii.clear(), askii2.clear();
      for(int j = i; j <= i + ki; j++) {
        askii.push_back(lor[j]);
        askii2.push_back(lxor[j]);
      }

      add_or(askii);
      add_xor(askii2);
      add_xor({cnt, cnt + 1});
      answ2.push_back(cnt + 2);
      cnt += 3;
    }

    add_or(answ1);
    cnt++;
    
    add_or(answ2);
    cnt++;

    add_and({cnt - 1, cnt - 2});
    cnt++;
    return cnt - 1;
  };
  
  
  if(K == 1) {
    int s1 = slidingWindow(1);
    int s2 = slidingWindow(1);
    add_and({s1, s2});
  } else {
    add_xor({slidingWindow(K - 1), slidingWindow(K)});
  }

}
#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...