제출 #1321594

#제출 시각아이디문제언어결과실행 시간메모리
1321594nagorn_ph말 (IOI15_horses)C++20
17 / 100
863 ms60872 KiB
#include <bits/stdc++.h>
#include "horses.h"
#define int long long

using namespace std;

const int mod = 1e9 + 7;
const int N = 5e5 + 5;

int n;
int x[N], y[N];
bool inside[N];

struct segtree {
	struct node {
		int val;
		bool exceed;
		node() : val(0), exceed(0) {}
	};
	node seg[4 * N];
	node create(){
		node newnode;
		newnode.val = 1;
		newnode.exceed = 0;
		return newnode;
	}
	node merge(node l, node r){
		node newnode = create();
		newnode.exceed = (l.exceed || r.exceed);
		newnode.val = (l.val * r.val) % mod;
		if ((l.val * r.val) >= mod) newnode.exceed = true;
		return newnode;
	}
	void build(int l, int r, int i){
		if (l == r) return seg[i].val = x[l], void();
		int mid = (l + r) / 2;
		build(l, mid, 2 * i), build(mid + 1, r, 2 * i + 1);
		seg[i] = merge(seg[2 * i], seg[2 * i + 1]);
	}
	void update(int l, int r, int i, int idx, int val){
		if (l == r) return seg[i].val = val, void();
		int mid = (l + r) / 2;
		if (idx <= mid) update(l, mid, 2 * i, idx, val);
		else update(mid + 1, r, 2 * i + 1, idx, val);
		seg[i] = merge(seg[2 * i], seg[2 * i + 1]);
	}
	node query(int l, int r, int i, int ll, int rr){
		if (l >= ll && r <= rr) return seg[i];
		if (r < ll || l > rr) return create();
		int mid = (l + r) / 2;
		return merge(query(l, mid, 2 * i, ll, rr), query(mid + 1, r, 2 * i + 1, ll, rr));
	}
} seg;

struct indexmaintain {
	int seg[4 * N];
	void build(int l, int r, int i){
		if (l == r) return seg[i] = (x[l] > 1), void();
		int mid = (l + r) / 2;
		build(l, mid, 2 * i), build(mid + 1, r, 2 * i + 1);
		seg[i] = seg[2 * i] + seg[2 * i + 1];
	}
	void update(int l, int r, int i, int idx, int val){
		if (l == r) return seg[i] = (val > 1), void();
		int mid = (l + r) / 2;
		if (idx <= mid) update(l, mid, 2 * i, idx, val);
		else update(mid + 1, r, 2 * i + 1, idx, val);
		seg[i] = seg[2 * i] + seg[2 * i + 1];
	}
	int query(int l, int r, int i, int k){
		if (l == r) return l;
		int mid = (l + r) / 2;
		if (seg[2 * i + 1] >= k) return query(mid + 1, r, 2 * i + 1, k);
		else return query(l, mid, 2 * i, k - seg[2 * i + 1]);
	}
} indices;

struct mxseg{
	int seg[4 * N];
	void build(int l, int r, int i){
		if (l == r) return seg[i] = y[l], void();
		int mid = (l + r) / 2;
		build(l, mid, 2 * i), build(mid + 1, r, 2 * i + 1);
		seg[i] = max(seg[2 * i], seg[2 * i + 1]);
	}
	void update(int l, int r, int i, int idx, int val){
		if (l == r) return seg[i] = val, void();
		int mid = (l + r) / 2;
		if (idx <= mid) update(l, mid, 2 * i, idx, val);
		else update(mid + 1, r, 2 * i + 1, idx, val);
		seg[i] = max(seg[2 * i], seg[2 * i + 1]);
	}
	int query(int l, int r, int i, int ll, int rr){
		if (l >= ll && r <= rr) return seg[i];
		if (r < ll || l > rr) return 0;
		int mid = (l + r) / 2;
		return max(query(l, mid, 2 * i, ll, rr), query(mid + 1, r, 2 * i + 1, ll, rr));
	}
} mxx;

int query(){
	int st = 1, exact = indices.seg[1];
	for (int i = 1; i <= indices.seg[1]; i++) {
		int idx = indices.query(1, n, 1, i);
		// cout << i << ": " << idx << ": " << seg.query(1, n, 1, idx, n).exceed << "\n";
		if (seg.query(1, n, 1, idx, n).exceed) {
			st = idx + 1;
			exact = i - 1;
			break;
		}
	}
	int mx = 0;
	int prev = n + 1;
	for (int i = 1; i <= exact; i++) {
		int idx = indices.query(1, n, 1, i);
		mx = max(mx, seg.query(1, n, 1, st, idx).val * mxx.query(1, n, 1, idx, prev - 1));
		prev = idx;
	}
	mx = max(mx, mxx.query(1, n, 1, st, prev - 1));
	return ((seg.query(1, n, 1, 1, st - 1).val * (mx % mod)) % mod);
}

int32_t init(int32_t N, int32_t X[], int32_t Y[]) {
	n = N;
	for (int i = 0; i < n; i++) x[i + 1] = X[i];
	for (int i = 0; i < n; i++) y[i + 1] = Y[i];
	y[0] = 1;
	seg.build(1, n, 1);
	indices.build(1, n, 1);
	mxx.build(1, n, 1);
	return query();
}

int32_t updateX(int32_t pos, int32_t val) {	
	++pos;
	seg.update(1, n, 1, pos, val);
	indices.update(1, n, 1, pos, val);
	return query();
}

int32_t updateY(int32_t pos, int32_t val) {
	++pos;
	y[pos] = val;
	mxx.update(1, n, 1, pos, val);
	return query();
}

// int32_t main(){
// 	int32_t n; cin >> n;
// 	int32_t x[n], y[n];
// 	for (int i = 0; i < n; i++) cin >> x[i];
// 	for (int i = 0; i < n; i++) cin >> y[i];
// 	cout << init(n, x, y) << "\n";
// 	int32_t m; cin >> m;
// 	while (m--) {
// 		int t; cin >> t;
// 		int pos, val; cin >> pos >> val;
// 		if (t == 1) cout << updateX(pos, val) << "\n";
// 		else cout << updateY(pos, val) << "\n";
// 	}
// }

#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...