답안 #93870

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
93870 2019-01-12T15:48:38 Z szawinis Sunčanje (COCI18_suncanje) C++17
104 / 130
3387 ms 263168 KB
/**
 * code generated by JHelper
 * More info: https://github.com/AlexeyDmitriev/JHelper
 * @author
 */

#include <bits/stdc++.h>
using namespace std;
#define long long long
const long MOD = 1e9+7, LINF = 1e18 + 1e16;
const int INF = 1e9+1;
const double EPS = 1e-10;
const int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};

struct Fenwick {
	vector<int> f;
	Fenwick() {}
	Fenwick(int n) {
		f.resize(n + 10);
	}
	void update(int i, int v) {
		++i;
		while(i < f.size()) f[i] += v, i += i & -i;
	}
	int query(int i) {
		++i;
		int ret = 0;
		while(i > 0) ret += f[i], i -= i & -i;
		return ret;
	}
};

struct MST {
	int n;
	vector<vector<int> > ls;
	vector<Fenwick> t;
	MST() {}
	MST(int n): n(n) {
		ls.resize(4*n);
		t.resize(4*n);
	}
	void clear() {
		t.clear();
		t = vector<Fenwick>(4*n);
	}
	void add_value(int x, int y) {
		for(x += n; x >= 1; x >>= 1) ls[x].push_back(y);
	}
//	void build(int i, int l, int r) {
//		cout << i << ' ' << l << ' ' << r << ' ' << ls[i].size() << ' ' << 2*n << endl;
//		sort(ls[i].begin(), ls[i].end());
//		ls[i].resize(unique(ls[i].begin(), ls[i].end()) - ls[i].begin());
//		t[i] = Fenwick(ls[i].size());
//		if(l == r) return;
//		int mid = l+r >> 1;
//		build(i << 1, l, mid);
//		build(i << 1 | 1, mid+1, r);
//	}
	void build() {
		for(int i = 2*n-1; i >= 1; i--) {
			sort(ls[i].begin(), ls[i].end());
			ls[i].resize(unique(ls[i].begin(), ls[i].end()) - ls[i].begin());
			t[i] = Fenwick(ls[i].size());
		}
	}
	void update(int x, int y) {
		for(x += n; x >= 1; x >>= 1) {
			auto it = lower_bound(ls[x].begin(), ls[x].end(), y);
			assert(it != ls[x].end());
			t[x].update(it - ls[x].begin(), 1);
		}
	}
	int query(int x1, int y1, int x2, int y2) {
		int ret = 0;
		for(x1 += n, x2 += n+1; x1 < x2; x1 >>= 1, x2 >>= 1) {
			if(x1 & 1) {
				auto ity1 = lower_bound(ls[x1].begin(), ls[x1].end(), y1);
				auto ity2 = upper_bound(ls[x1].begin(), ls[x1].end(), y2);
//				cout << ity2 - ity1 << ' ' << y1 << ' ' << y2 << ' ' << t[x1].query(t[x1].f.size() - 2) << endl;
				if(!ls[x1].empty() && ity1 != ls[x1].end() && ity2 != ls[x1].begin()) {
					--ity2;
					--ity1;
					assert(!t[x1].f.empty());
					ret += t[x1].query(ity2 - ls[x1].begin()) - t[x1].query(ity1 - ls[x1].begin());
				}
				++x1;
			}
			if(x2 & 1) {
				--x2;
				auto ity1 = lower_bound(ls[x2].begin(), ls[x2].end(), y1);
				auto ity2 = upper_bound(ls[x2].begin(), ls[x2].end(), y2);
//				cout << ity2 - ity1 << ' ' << y1 << ' ' << y2 << ' ' << t[x2].query(t[x2].f.size() - 2) << endl;
				if(!ls[x2].empty() && ity1 != ls[x2].end() && ity2 != ls[x2].begin()) {
					--ity2;
					--ity1;
					assert(!t[x2].f.empty());
					ret += t[x2].query(ity2 - ls[x2].begin()) - t[x2].query(ity1 - ls[x2].begin());
				}
			}
		}
		return ret;
	}
};

class Suncanje {

	int n;
	vector<tuple<int,int,int,int> > a;
	vector<int> res;
	vector<string> ans;
	MST mst[4];
	Fenwick fen[4];

	vector<int> xs, ys;
	void compress() {
		for(int i = 0, x1, y1, x2, y2; i < n; i++) {
			tie(x1, y1, x2, y2) = a[i];
			xs.push_back(x1);
			xs.push_back(x2);
			ys.push_back(y1);
			ys.push_back(y2);
		}
		sort(xs.begin(), xs.end());
		xs.resize(unique(xs.begin(), xs.end()) - xs.begin());
		sort(ys.begin(), ys.end());
		ys.resize(unique(ys.begin(), ys.end()) - ys.begin());
//		for(int x: xs) cout << x << ' ';
//		cout << endl;
//		for(int y: ys) cout << y << ' ';
//		cout << endl;
		for(auto &tt: a) {
			int x1, y1, x2, y2;
			tie(x1, y1, x2, y2) = tt;
			auto it = lower_bound(xs.begin(), xs.end(), x1);
			get<0>(tt) = it - xs.begin();
			it = lower_bound(xs.begin(), xs.end(), x2);
			get<2>(tt) = it - xs.begin();
			it = lower_bound(ys.begin(), ys.end(), y1);
			get<1>(tt) = it - ys.begin();
			it = lower_bound(ys.begin(), ys.end(), y2);
			get<3>(tt) = it - ys.begin();
//			cout << x1 << ' ' << y1 << ' ' <<x2 << ' ' << y2 << endl;
		}
//		for(auto &tt: a) {
//			int x1, y1, x2, y2;
//			tie(x1, y1, x2, y2) = tt;
//			cout << x1 << ' ' << y1 << ' ' <<x2 << ' ' << y2 << endl;
//		}
	}

public:
	void solve(istream &cin, ostream &cout) {
		cin >> n;
		for(int i = 0, x1, y1, A, B; i < n; i++) {
			cin >> x1 >> y1 >> A >> B;
			a.emplace_back(x1, y1, x1 + A, y1 + B);
		}
		res.resize(n);
		compress();
		reverse(a.begin(), a.end());
		int sz = max(xs.size(), ys.size());
		for(int i = 0; i < 4; i++) {
			mst[i] = MST(sz);
			fen[i] = Fenwick(sz);
		}
		for(auto tt: a) {
			int x1, y1, x2, y2;
			tie(x1, y1, x2, y2) = tt;
			mst[0].add_value(x1, y1);
			mst[1].add_value(x1, y2);
			mst[2].add_value(x2, y1);
			mst[3].add_value(x2, y2);
		}
		for(int i = 0; i < 4; i++) mst[i].build();

		for(int i = 0; i < n; i++) {
			int x1, y1, x2, y2;
			tie(x1, y1, x2, y2) = a[i];
//			cout << x1 << ' ' << y1 << ' ' << x2 << ' ' << y2 << endl;

			int pos = 0, neg = 0;
			pos += fen[2].query(x1) + i - fen[0].query(x2 - 1);
			pos += fen[3].query(y1) + i - fen[1].query(y2 - 1);

			neg += mst[0].query(x2, y2, sz - 1, sz - 1);
			neg += mst[1].query(x2, 0, sz - 1, y1);
			neg += mst[2].query(0, y2, x1, sz - 1);
			neg += mst[3].query(0, 0, x1, y1);

			res[i] = pos - neg;
//			cout << n-i << ' ' << pos << ' ' << neg << ' ' << res[i] << endl;
//			cout << fen[2].query(x1) << ' ' << fen[0].query(x2 - 1) << endl;
//			cout << fen[3].query(y1) << ' ' << fen[1].query(y2 - 1) << endl;

			fen[0].update(x1, 1);
			fen[1].update(y1, 1);
			fen[2].update(x2, 1);
			fen[3].update(y2, 1);

			mst[0].update(x1, y1);
			mst[1].update(x1, y2);
			mst[2].update(x2, y1);
			mst[3].update(x2, y2);

			ans.push_back((res[i] == i ? "DA" : "NE"));
		}

		reverse(ans.begin(), ans.end());
		for(string s: ans) cout << s << '\n';

	}
};

class Solver {
public:
	void solve(std::istream& in, std::ostream& out) {
	    Suncanje *obj = new Suncanje();
		obj->solve(in, out);
		delete obj;
	}
};

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	Solver solver;
	std::istream& in(std::cin);
	std::ostream& out(std::cout);
	solver.solve(in, out);
	return 0;
}

Compilation message

suncanje.cpp: In member function 'void Fenwick::update(int, int)':
suncanje.cpp:23:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(i < f.size()) f[i] += v, i += i & -i;
         ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 106 ms 17144 KB Output is correct
2 Correct 186 ms 23656 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 385 ms 41856 KB Output is correct
2 Correct 2164 ms 153064 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 826 ms 75548 KB Output is correct
2 Correct 2381 ms 188272 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1128 ms 105872 KB Output is correct
2 Correct 1883 ms 157856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2048 ms 166316 KB Output is correct
2 Correct 2584 ms 202060 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2173 ms 171948 KB Output is correct
2 Correct 2684 ms 188780 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2527 ms 170436 KB Output is correct
2 Correct 3277 ms 221352 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3387 ms 251128 KB Output is correct
2 Correct 2378 ms 178044 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1132 ms 263168 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1261 ms 263168 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -