답안 #548528

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
548528 2022-04-13T17:47:21 Z NachoLibre Fish (IOI08_fish) C++17
83 / 100
746 ms 65536 KB
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
using namespace std;

const int F = 500005, K = F;
int f, k, mo, z, c[K];
array<int, 2> a[F];
set<int> s[K];
struct oo {
	oo() {
		l = r = 0;
		x = 1;
	}
	oo *l, *r;
	int x;

	void P() {
		int lx = (!l ? 1 : l->x);
		int rx = (!r ? 1 : r->x);
		x = lx * rx % mo;
	}
} *root;

void upd(int i, int x, int l = 1, int r = k, oo *&t = root) {
	if(!t) t = new oo();
	if(l == r) {
		t->x = x;
		return;
	}
	int m = l + r >> 1;
	if(m >= i) upd(i, x, l, m, t->l);
	else upd(i, x, m + 1, r, t->r);
	t->P();
}

void updc(int g) {
	upd(g, c[g] + 1);
}

int x(int sl, int sr, int l = 1, int r = k, oo *&t = root) {
	if(l > sr || r < sl || !t) return 1;
	if(l >= sl && r <= sr) return t->x;
	int m = l + r >> 1;
	return x(sl, sr, l, m, t->l) * x(sl, sr, m + 1, r, t->r) % mo;
}

void moz(int i) {
	while(a[z][0] * 2 > a[i][0]) {
		c[a[z][1]] -= 1;
		updc(a[z][1]);
		z -= 1;
	}
	while(a[z + 1][0] * 2 <= a[i][0]) {
		z += 1;
		c[a[z][1]] += 1;
		updc(a[z][1]);
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	#ifdef x
	freopen("x.txt", "r", stdin);
	#endif
	cin >> f >> k >> mo;
	for(int i = 1; i <= f; ++i) {
		cin >> a[i][0] >> a[i][1];
	}
	a[f + 1][0] = 2e9;
	a[f + 1][1] = k + 1;
	sort(a + 1, a + f + 1);
	vector<int> smxf(f + 2, 0);
	smxf[f + 1] = k + 1;
	{
		vector<int> fg(k + 1, 0);
		int kg = k;
		for(int i = f; i >= 1; --i) {
			if(!fg[a[i][1]]) {
				fg[a[i][1]] = kg;
				kg -= 1;
			}
		}
		for(int i = 1; i <= f; ++i) {
			a[i][1] = fg[a[i][1]];
			s[a[i][1]].insert(i);
		}
		vector<bool> fasd(f + 1, 0);
		for(int i = f; i >= 1; --i) {
			smxf[i] = smxf[i + 1];
			if(!fasd[a[i][1]]) {
				fasd[a[i][1]] = 1;
				smxf[i] = a[i][1];
			}
		}
	}
	moz(f);
	int fp = x(1, k);
	vector<bool> xm(k + 1);
	xm[k] = 1;
	for(int i = f - 1; i >= 1; --i) {
		if(!xm[a[i][1]]) {
			xm[a[i][1]] = 1;
			moz(i);
			upd(a[i][1], c[a[i][1]]);
			(fp += x(1, a[i][1])) %= mo;
			updc(a[i][1]);
			int y = *s[a[i][1]].upper_bound(z);
			int l = y + 1, r = f + 1;
			while(l < r) {
				int m = l + r >> 1;
				if(a[y][0] * 2 <= a[m][0]) r = m;
				else l = m + 1;
			}
			int ff = smxf[l];
			fp += x(1, a[i][1] - 1) * x(a[i][1] + 1, ff - 1) % mo;
			// cout << x(1, a[i][1] - 1) << endl;
			// cout << x(a[i][1] + 1, ff - 1) << endl;
			fp %= mo;
		}
	}
	cout << fp << endl;
	return 0;
}

Compilation message

fish.cpp: In function 'void upd(int, int, int, int, oo*&)':
fish.cpp:33:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   33 |  int m = l + r >> 1;
      |          ~~^~~
fish.cpp: In function 'int x(int, int, int, int, oo*&)':
fish.cpp:46:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   46 |  int m = l + r >> 1;
      |          ~~^~~
fish.cpp: In function 'int main()':
fish.cpp:114:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  114 |     int m = l + r >> 1;
      |             ~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 23816 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 23712 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 23764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 23772 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 23764 KB Output is correct
2 Correct 13 ms 23836 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 23824 KB Output is correct
2 Correct 324 ms 53468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 23892 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 24032 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 147 ms 35764 KB Output is correct
2 Correct 179 ms 38720 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 24064 KB Output is correct
2 Correct 16 ms 24276 KB Output is correct
3 Correct 17 ms 24128 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 237 ms 41780 KB Output is correct
2 Incorrect 373 ms 53476 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 323 ms 53580 KB Output is correct
2 Correct 407 ms 53792 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 174 ms 41936 KB Output is correct
2 Correct 421 ms 53856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 455 ms 51308 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 514 ms 54616 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 237 ms 50872 KB Output is correct
2 Correct 506 ms 61308 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 746 ms 62260 KB Output is correct
2 Correct 504 ms 51788 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 624 ms 60468 KB Output is correct
2 Correct 712 ms 62196 KB Output is correct
3 Runtime error 350 ms 65536 KB Execution killed with signal 9
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 410 ms 65536 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -