// Solution to 3CIE
// Author: Michal Czuczman <michal.czuczman@gmail.com>
// created on Thu Nov 24 17:12:14 CET 2016
#include <iostream>
#include <vector>
#include <queue>
#include "cielib.h"
using namespace std;
struct Range {
	int min;
	int max;
	Range(int min_, int max_) : min(min_), max(max_) {}
	int size() const { return max - min; }
	int mid() const { return (min + max) >> 1; }
};
struct RangeComparison {
	const vector<Range>& ranges;
	RangeComparison(const vector<Range>& ranges_)
		: ranges(ranges_) {}
	bool operator() (const int& lhs, const int& rhs) const {
		return ranges[lhs].size() < ranges[rhs].size();
	}
};
class CieSolver {
	public:
		CieSolver(int num_dimensions, int r)
			: dims(num_dimensions, Range(0, r)),
				q(RangeComparison(dims)),
				p(num_dimensions, dims[0].mid())
		{
			for(int i = 0; i < (int)dims.size(); ++i) {
				q.push(i);
			}
		}
		void query(int i) {
			p[i] = dims[i].min;
			czyCieplo(&p[0]);
			p[i] = dims[i].max;
			if(czyCieplo(&p[0])) {
				dims[i].min = dims[i].mid() + 1;
			} else if(dims[i].size() & 1) {
				dims[i].max = dims[i].mid() + 1;
			} else {
				dims[i].max = dims[i].mid();
			}
			p[i] = dims[i].mid();
		}
		void solve() {
			while(q.size()) {
				int i = q.top();
				q.pop();
				//printf("Analyzing dimension %d of size %d [%d..%d]: ", i, dims[i].size(),
				//		dims[i].min, dims[i].max);
				if(dims[i].size() > 1) {
					query(i);
					if(dims[i].size() > 0) {
						q.push(i);
					}
				} else {
					if(dims[i].min > 0) {
						int lowered_min = --dims[i].min;
						query(i);
						if(dims[i].min == lowered_min) {
							++dims[i].min;
						}
					} else {
						p[i] = dims[i].max + 1;
						czyCieplo(&p[0]);
						p[i] = dims[i].min;
						if(czyCieplo(&p[0])) {
							dims[i].max = dims[i].min;
						} else {
							dims[i].min = dims[i].max;
						}
					}
					p[i] = dims[i].min;
				}
				//printf(" changed to [%d..%d]\n", dims[i].min, dims[i].max);
			}
			znalazlem(&p[0]);
		}
	private:
		vector<Range> dims;
		priority_queue<int, vector<int>, RangeComparison> q;
		vector<int> p;
};
int main()
{
	CieSolver cs(podajD(), podajR());
	cs.solve();
}
        | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | // Solution to 3CIE // Author: Michal Czuczman <michal.czuczman@gmail.com> // created on Thu Nov 24 17:12:14 CET 2016 #include <iostream> #include <vector> #include <queue> #include "cielib.h" using namespace std; struct Range { int min; int max; Range(int min_, int max_) : min(min_), max(max_) {} int size() const { return max - min; } int mid() const { return (min + max) >> 1; } }; struct RangeComparison { const vector<Range>& ranges; RangeComparison(const vector<Range>& ranges_) : ranges(ranges_) {} bool operator() (const int& lhs, const int& rhs) const { return ranges[lhs].size() < ranges[rhs].size(); } }; class CieSolver { public: CieSolver(int num_dimensions, int r) : dims(num_dimensions, Range(0, r)), q(RangeComparison(dims)), p(num_dimensions, dims[0].mid()) { for(int i = 0; i < (int)dims.size(); ++i) { q.push(i); } } void query(int i) { p[i] = dims[i].min; czyCieplo(&p[0]); p[i] = dims[i].max; if(czyCieplo(&p[0])) { dims[i].min = dims[i].mid() + 1; } else if(dims[i].size() & 1) { dims[i].max = dims[i].mid() + 1; } else { dims[i].max = dims[i].mid(); } p[i] = dims[i].mid(); } void solve() { while(q.size()) { int i = q.top(); q.pop(); //printf("Analyzing dimension %d of size %d [%d..%d]: ", i, dims[i].size(), // dims[i].min, dims[i].max); if(dims[i].size() > 1) { query(i); if(dims[i].size() > 0) { q.push(i); } } else { if(dims[i].min > 0) { int lowered_min = --dims[i].min; query(i); if(dims[i].min == lowered_min) { ++dims[i].min; } } else { p[i] = dims[i].max + 1; czyCieplo(&p[0]); p[i] = dims[i].min; if(czyCieplo(&p[0])) { dims[i].max = dims[i].min; } else { dims[i].min = dims[i].max; } } p[i] = dims[i].min; } //printf(" changed to [%d..%d]\n", dims[i].min, dims[i].max); } znalazlem(&p[0]); } private: vector<Range> dims; priority_queue<int, vector<int>, RangeComparison> q; vector<int> p; }; int main() { CieSolver cs(podajD(), podajR()); cs.solve(); } | 
 
            
         English
                    English