Submission #1198578

#TimeUsernameProblemLanguageResultExecution timeMemory
1198578HappyCapybaraVision Program (IOI19_vision)C++17
59 / 100
7 ms1476 KiB
#include "vision.h"
#include<bits/stdc++.h>
using namespace std;

vector<int> pp;

void genpp(){
	pp.push_back(1);
	for (int i=2; i<=200; i++){
        bool p = true;
        for (int j=2; j<min(i, 15); j++){
            if (i % j == 0) p = false;
        }
        if (p){
            int cur = i;
            while (cur <= 200){
                pp.push_back(cur);
                cur *= i;
            }
        }
    }
	sort(pp.begin(), pp.end());
}

void construct_network(int H, int W, int K) {
	genpp();
	for (int i=0; i<H; i++){
		vector<int> v;
		for (int j=0; j<W; j++) v.push_back(i*W+j);
		add_or(v);
	}
	for (int j=0; j<W; j++){
		vector<int> v;
		for (int i=0; i<H; i++) v.push_back(i*W+j);
		add_or(v);
	}
	int cur = H*W+H+W;
	map<int,int> rip, cip;
	for (int p : pp){
		if (p > H) break;
		int start = cur;
		for (int i=0; i<p; i++){
			vector<int> v;
			for (int x=i; x<H; x+=p) v.push_back(H*W+x);
			add_xor(v);
			cur++;
		}
		vector<int> v;
		for (int x=start; x<cur; x++) v.push_back(x);
		add_or(v);
		add_not(cur);
		cur += 2;
		rip[p] = cur-1;
	}
	for (int p : pp){
		if (p > W) break;
		int start = cur;
		for (int i=0; i<p; i++){
			vector<int> v;
			for (int x=i; x<W; x+=p) v.push_back(H*W+H+x);
			add_xor(v);
			cur++;
		}
		vector<int> v;
		for (int x=start; x<cur; x++) v.push_back(x);
		add_or(v);
		add_not(cur);
		cur += 2;
		cip[p] = cur-1;
	}
	vector<int> res;
	for (int i=1; i<K; i++){
		if (i > H-1) break;
		if (K-i > W-1) continue;
		vector<int> d, nd;
		for (int p : pp){
			if (p > H) break;
			if (i % p == 0) d.push_back(rip[p]);
			else nd.push_back(rip[p]);
		}
		add_and(d);
		add_or(nd);
		add_not(cur+1);
		add_and({cur, cur+2});
		d.clear(); nd.clear();
		for (int p : pp){
			if (p > W) break;
			if ((K-i) % p == 0) d.push_back(cip[p]);
			else nd.push_back(cip[p]);
		}
		add_and(d);
		add_or(nd);
		add_not(cur+5);
		add_and({cur+4, cur+6});
		add_and({cur+3, cur+7});
		res.push_back(cur+8);
		cur += 9;
	}
	if (K < W){
		int x = K;
		vector<int> d, nd;
		for (int p : pp){
			if (p > W) break;
			if (x % p == 0) d.push_back(cip[p]);
			else nd.push_back(cip[p]);
		}
		add_and(d);
		add_or(nd);
		add_not(cur+1);
		add_and({cur, cur+2});
		vector<int> v;
		for (int i=0; i<H; i++) v.push_back(H*W+i);
		add_xor(v);
		add_and({cur+3, cur+4});
		res.push_back(cur+5);
		cur += 6;
	}
	if (K < H){
		int x = K;
		vector<int> d, nd;
		for (int p : pp){
			if (p > H) break;
			if (x % p == 0) d.push_back(rip[p]);
			else nd.push_back(rip[p]);
		}
		add_and(d);
		add_or(nd);
		add_not(cur+1);
		add_and({cur, cur+2});
		vector<int> v;
		for (int i=0; i<W; i++) v.push_back(H*W+H+i);
		add_xor(v);
		add_and({cur+3, cur+4});
		res.push_back(cur+5);
		cur += 6;
	}
	add_or(res);
}
#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...