제출 #955135

#제출 시각아이디문제언어결과실행 시간메모리
955135waldiVision Program (IOI19_vision)C++17
66 / 100
7 ms1128 KiB
	#include "vision.h"
	#include <bits/stdc++.h>
	#define FOR(i,p,k) for(int i=(p);i<=(k);++i)
	#define REP(i,n) FOR(i,0,(n)-1)
	#define ssize(x) (int((x).size()))
	#define all(x) (x).begin(),(x).end()
	using namespace std;

	void construct_network(int h, int w, int k){
		if(min(h, w) == 1){
			vector<int> vec;
			REP(i, h) REP(j, w) REP(x, h) REP(y, w){
				if(abs(i-x)+abs(j-y) == k){
					int t = add_and({i*w+j, x*w+y});
					vec.emplace_back(t);
				}
			}
			add_or(vec);
			return;
		}
		
		if(max(w, h) <= 30 || k == 1){
			vector<int> poziomo(h);
			REP(i, h){
				vector<int> vec;
				REP(j, w) vec.emplace_back(i*w+j);
				poziomo[i] = add_xor(vec);
			}
			
			vector<int> pionowo(w);
			REP(j, w){
				vector<int> vec;
				REP(i, h) vec.emplace_back(i*w+j);
				pionowo[j] = add_xor(vec);
			}
			
			auto roznica = [&](vector<int> vec, int delta){
				if(!delta) return add_not(add_or(vec));
				vector<int> ret;
				REP(i, ssize(vec)-delta) ret.emplace_back(add_and({vec[i], vec[i+delta]}));
				return add_or(ret);
			};
			
			vector<int> vec;
			FOR(i, 0, k) if(i<h && k-i<w) vec.emplace_back(add_and({roznica(poziomo, i), roznica(pionowo, k-i)}));
			add_or(vec);
			return;
		}
		
		vector<int> vec;
		REP(x, h) REP(y, w){
			if(x+y == k){
				int t = add_and({0, x*w+y});
				vec.emplace_back(t);
			}
		}
		add_or(vec);
	}
#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...