Submission #300987

#TimeUsernameProblemLanguageResultExecution timeMemory
300987MickyOrVision Program (IOI19_vision)C++17
26 / 100
63 ms6004 KiB
#include "vision.h"
#include <bits/stdc++.h>
#define fore(i, b, e) for (int i = b; i < (int)e; ++i)
#define pb push_back

using namespace std;

typedef vector<int> vi;

vi diagL[410], diagR[410];

int solve(int H, int W, int k) {
	vi resR, resL;
	vi v, pref;
	fore(i, 0, H+W-1) {
		v.pb(add_or(diagL[i]));
		pref.pb(add_or(v));
		if (i > 0) {
			if (i >= k) {
				int tmp = add_xor({pref[i-1], pref[i-k]});
				resL.pb( add_and({v.back(), tmp}) );
			}
			else {
				resL.pb( add_and({v.back(), pref[i-1]}) );
			}
		}
	}
	v.clear();
	pref.clear();
	fore(i, 0, H+W-1) {
		v.pb(add_or(diagR[i]));
		pref.pb(add_or(v));
		if (i > 0) {
			if (i >= k) {
				int tmp = add_xor({pref[i-1], pref[i-k]});
				resR.pb( add_and({v.back(), tmp}) );
			}
			else {
				resR.pb( add_and({v.back(), pref[i-1]}) );
			}
		}
	}
	int rL = add_or(resL);
	int rR = add_or(resR);
	return add_and({rL, rR});
}

void construct_network(int H, int W, int K) {
	fore(i, 0, H) {
		fore(j, 0, W) {
			diagL[i+j].pb(i*W + j);
			diagR[i-j+W-1].pb(i*W + j);
		}
	}
	add_xor({solve(H, W, K), solve(H, W, K+1)});
}
#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...