답안 #314294

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
314294 2020-10-19T14:05:22 Z MetB Dragon 2 (JOI17_dragon2) C++14
60 / 100
4000 ms 78696 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
 
using namespace __gnu_pbds;
 
#define N 200001
 
using namespace std;
 
 
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
 
const ll INF = 1e18, MOD = 1e9 + 7, MOD2 = 1e6 + 3;

struct Pt {
	ll x, y;

	Pt (int x, int y) : x (x), y (y) {}
	Pt () : x (0), y (0) {}

	ll cross (const Pt& b) const { return x * b.y - b.x * y; }
	bool up () const { return y > 0 or (y == 0 and x >= 0); }
	bool operator < (const Pt& b) const { return up() == b.up() ? cross (b) < 0 : up() > b.up(); }
	Pt operator - (const Pt& b) const { return Pt (x - b.x, y - b.y); }
	Pt operator - () const { return Pt (-x, -y); }
} s, e;

vector <int> vs[N], ve[N], v[N];
Pt p[N], pe[N], ps[N];
vector <int> to[N];

vector < pair <Pt, int> > ord;

ll ans[N], gr[N];

gp_hash_table <int, int> qu[N];

int n, m, q, srt[N];

struct BIT {
	int t[N];

	void update (int x, int d) {
		for (; x < N; x = (x | (x + 1)))
			t[x] += d;
	}

	int get (int r) {
		int sum = 0;

		for (; r >= 0; r = (r & (r + 1)) - 1)
			sum += t[r];

		return sum;
	}

	int get (int l, int r) { return get (r) - get (l - 1); }
} t;

int find (Pt x) {
	return lower_bound (ord.begin(), ord.end(), make_pair (x,-1)) - ord.begin ();
}

int fight (int j) {

	ll sum = 0, len = 0;

	auto l = vs[j].begin (), r = vs[j].begin ();

	vector < pair <Pt, int> > vp;

	for (int i : to[j]) {
		for (int x : v[i]) {
			if (ps[x].cross (e - s) > 0) vp.push_back ({-ps[x], x});
			else vp.push_back ({ps[x], x});
		}
	}

	sort (vp.begin(), vp.end());

	auto prev = vp[0].first;

	for (auto [p, x] : vp) {

		int limit = vs[j].size ();

		if (-p < prev) {
			while (r != vs[j].end ()) {
				int x = srt[*r];
				t.update (x, 1);
				r++, len++;
			}
			r = vs[j].begin ();
			limit += vs[j].size ();
		}
		prev = -p;

		while (r != vs[j].end () && len != limit && ps[*r] < -p) {
			int x = srt[*r];
			t.update (x, 1);
			r++, len++;
		}

		while (l != vs[j].end () && len && ps[*l] < p) {
			int x = srt[*l];
			t.update (x, -1);
			l++, len--;
		}

		int l1 = find (pe[x]), r1 = find (-pe[x]);

		if (pe[x].cross (s - e) > 0) swap (l1, r1);

		if (l1 <= r1) ans[qu[gr[x]][j]] += (ll) t.get (l1, r1);
		else ans[qu[gr[x]][j]] += (ll) len - t.get (r1, l1);
	}

	if (l == vs[j].end ()) l = vs[j].begin ();

	while (len) {
		int x = srt[*l];
		t.update (x, -1);
		l++, len--;
		if (l == vs[j].end ()) l = vs[j].begin ();
	}

	return sum;
}

int main () {
	ios::sync_with_stdio(0);
	cin.tie (0);
	cin >> n >> m;

	for (int i = 0; i < n; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		p[i] = Pt (a, b);
		gr[i] = c - 1;
		v[c-1].push_back (i);
	}

	int x, y;

	cin >> x >> y;
	s = Pt (x, y);

	cin >> x >> y;
	e = Pt (x, y);

	for (int i = 0; i < n; i++) {
		ps[i] = p[i] - s;
		pe[i] = p[i] - e;
		ord.push_back ({pe[i], i});
		ord.push_back ({-pe[i], i});
	}

	sort (ord.begin(), ord.end());

	for (int i = 0; i < n; i++) {
		srt[i] = find (pe[i]);
	}

	for (int i = 0; i < m; i++) {
		vs[i] = v[i];
		ve[i] = v[i];

		sort (vs[i].begin(), vs[i].end(), [&](int a, int b) { return ps[a] < ps[b]; });
		sort (ve[i].begin(), ve[i].end(), [&](int a, int b) { return pe[a] < pe[b]; });
	}

	cin >> q;

	for (int i = 0; i < q; i++) {
		int a, b;
		cin >> a >> b;
		a--, b--;
		to[b].push_back (a);
		qu[a][b] = i;
	}

	for (int i = 0; i < m; i++) {
		fight (i);
	}

	for (int i = 0; i < q; i++) {
		cout << ans[i] << '\n';
	}
}	

Compilation message

dragon2.cpp: In function 'int fight(int)':
dragon2.cpp:85:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   85 |  for (auto [p, x] : vp) {
      |            ^
# 결과 실행 시간 메모리 Grader output
1 Correct 70 ms 71356 KB Output is correct
2 Correct 76 ms 71228 KB Output is correct
3 Correct 142 ms 71516 KB Output is correct
4 Correct 257 ms 76088 KB Output is correct
5 Correct 173 ms 76972 KB Output is correct
6 Correct 69 ms 71352 KB Output is correct
7 Correct 68 ms 71356 KB Output is correct
8 Correct 71 ms 71224 KB Output is correct
9 Correct 71 ms 71232 KB Output is correct
10 Correct 70 ms 71160 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 121 ms 73884 KB Output is correct
2 Correct 197 ms 74540 KB Output is correct
3 Correct 119 ms 73324 KB Output is correct
4 Correct 102 ms 73324 KB Output is correct
5 Correct 99 ms 74476 KB Output is correct
6 Correct 110 ms 73800 KB Output is correct
7 Correct 107 ms 73756 KB Output is correct
8 Correct 113 ms 73752 KB Output is correct
9 Correct 97 ms 73756 KB Output is correct
10 Correct 101 ms 73772 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 70 ms 71356 KB Output is correct
2 Correct 76 ms 71228 KB Output is correct
3 Correct 142 ms 71516 KB Output is correct
4 Correct 257 ms 76088 KB Output is correct
5 Correct 173 ms 76972 KB Output is correct
6 Correct 69 ms 71352 KB Output is correct
7 Correct 68 ms 71356 KB Output is correct
8 Correct 71 ms 71224 KB Output is correct
9 Correct 71 ms 71232 KB Output is correct
10 Correct 70 ms 71160 KB Output is correct
11 Correct 121 ms 73884 KB Output is correct
12 Correct 197 ms 74540 KB Output is correct
13 Correct 119 ms 73324 KB Output is correct
14 Correct 102 ms 73324 KB Output is correct
15 Correct 99 ms 74476 KB Output is correct
16 Correct 110 ms 73800 KB Output is correct
17 Correct 107 ms 73756 KB Output is correct
18 Correct 113 ms 73752 KB Output is correct
19 Correct 97 ms 73756 KB Output is correct
20 Correct 101 ms 73772 KB Output is correct
21 Correct 112 ms 73972 KB Output is correct
22 Correct 203 ms 74592 KB Output is correct
23 Correct 1087 ms 74904 KB Output is correct
24 Correct 2184 ms 78608 KB Output is correct
25 Correct 430 ms 78696 KB Output is correct
26 Correct 294 ms 78568 KB Output is correct
27 Correct 112 ms 76180 KB Output is correct
28 Correct 114 ms 76140 KB Output is correct
29 Execution timed out 4054 ms 78692 KB Time limit exceeded
30 Halted 0 ms 0 KB -