제출 #838497

#제출 시각아이디문제언어결과실행 시간메모리
838497fatemetmhrVision Program (IOI19_vision)C++17
100 / 100
13 ms1864 KiB
//  ~ Be Name Khoda ~  //

#include "vision.h"
#include <bits/stdc++.h>
//#pragma GCC optimize ("O3")
//#pragma GCC target("avx2")
//#pragma GCC optimize("unroll-loops,Ofast")

using namespace std;

typedef long long ll;

#define pb       push_back
#define mp       make_pair
#define all(x)   x.begin(), x.end()
#define fi       first
#define se       second
#define debug(x) cerr << "(" << (#x) << "): " << (x) << endl;

const int maxn  =  1e6   + 10;
const int maxn5 =  5e5   + 10;
const int maxnt =  1.2e6 + 10;
const int maxn3 =  1e3   + 10;
const int mod   =  1e9   + 7;
const ll  inf   =  1e18;

int bt0, bt1;
vector <int> have;

vector <int> full_adder(vector <int> a, vector <int> b){
	int sz = int(max(a.size(), b.size())) + 1;
	while(int(a.size()) < sz)
		a.pb(bt0);
	while(int(b.size()) < sz)
		b.pb(bt0);
	vector <int> ret, c;
	c.pb(bt0);
	for(int i = 0; i < sz; i++){
		int cur = add_xor(vector <int> ({a[i], b[i], c[i]}));
		ret.pb(cur);
		cur = add_not(cur);
		int an = add_and(vector <int> ({a[i], b[i], c[i]}));
		int oR = add_or(vector <int> ({a[i], b[i], c[i]}));
		oR = add_and(vector <int> ({cur, oR}));
		c.pb(add_or(vector <int> ({an, oR})));
	}
	return ret;
	debug("Adding ");
	for(auto u : a)
		cerr << u + 1 << ' ' ;
	cerr << endl;
	for(auto u : b)
		cerr << u + 1 << ' ';
	cerr << endl;
	for(auto u : ret)
		cerr << u + 1 << ' ';
	cerr << endl;
}

vector <int> build(int l, int r){
	if(r - l == 1)
		return {have[l]};
	int mid = (l + r) >> 1;
	vector <int> r1 = build(l, mid);
	vector <int> r2 = build(mid, r);
	return full_adder(r1, r2);
}


void construct_network(int n, int m, int k) {
	vector<int> av;

	bt0 = add_xor(vector <int> ({0, 0}));
	bt1 = add_not(bt0);

	int cur = -1;
	for(int i = 0; i < n; i++){
		av.clear();
		for(int j = 0; j < m; j++)
			av.pb(i * m + j);
		int a = add_xor(av);
		if(i)
			cur = add_xor(vector <int> ({cur, a}));
		else
			cur = a;
		have.pb(cur);
	}
	for(int j = 0; j < m; j++){
		av.clear();
		for(int i = 0; i < n; i++)
			av.pb(i * m + j);
		int a = add_xor(av);
		if(j)
			cur = add_xor(vector <int> ({cur, a}));
		else
			cur = a;
		have.pb(cur);
	}
	vector <int> ans = build(0, have.size());
	vector <int> ch;
	for(int i = 0; i < int(ans.size()); i++){
		if((k >> i)&1)
			ch.pb(add_and(vector <int> ({bt1, ans[i]})));
		else
			ch.pb(add_xor(vector <int> ({bt1, ans[i]})));
	}
	add_and(ch);
}

















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