답안 #919925

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
919925 2024-02-01T20:54:10 Z Lobo 코끼리 (Dancing Elephants) (IOI11_elephants) C++17
10 / 100
2 ms 8792 KB
#include "elephants.h"
#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define fr first
#define sc second
const int maxn = 7e4+10;
const int lg = 20;
const int B = 187;
#define int long long
int n,s;
set<int> espx;
set<pair<pair<int,int>,int>> pts;
vector<int> x;
int d[maxn][lg+1];

void init(int32_t N, int32_t L, int32_t X[])
{
    n = N;
    s = L;
    for(int i = 0; i < n; i++) {
    	pts.insert(mp(mp(X[i],i),0));
    	x.pb(X[i]);
    }
}
int cntq = 0;
int32_t update(int32_t iq, int32_t xq)
{
	if(cntq == 0) {
		vector<pair<pair<int,int>,int>> rem,add;
		for(auto X : pts) {
			if(X.sc == 1) {
				rem.pb(X);
				add.pb(mp(X.fr,0));
			}
		}
		espx.clear();
		for(auto X : rem) pts.erase(X);
		for(auto X : add) pts.insert(X);

		for(int i = 0; i < n; i++) {
			d[i][0] = x[i]+s;
		}

		for(int b = 1; b <= lg; b++) {
			for(int i = 0; i < n; i++) {
				if(d[i][b-1] == -1) {
					d[i][b] = -1;
					continue;
				}
				auto it = pts.upper_bound(mp(mp(d[i][b-1],n+1),n+1));
				if(it == pts.end()) {
					d[i][b] = -1;
				}
				else {
					d[i][b] = d[it->fr.sc][b-1];
				}
			}
		}
	}

	pts.erase(mp(mp(x[iq],iq),0));
	pts.erase(mp(mp(x[iq],iq),1));
	espx.insert(x[iq]);
	// pts.insert(mp(mp(x[iq],iq),-1));
	x[iq] = xq;
	pts.insert(mp(mp(x[iq],iq),1));
	espx.insert(x[iq]);

	int pos = -1;
	int32_t ans = 0;
	while(true) {
		auto it = pts.upper_bound(mp(mp(pos,n+1),n+1));
		if(it == pts.end()) break;
		int i = it->fr.sc;
		pos = x[i];
		auto itfds = espx.lower_bound(pos);
		int nxt;
		if(itfds == espx.end()) nxt = 1e9+10;
		else nxt = *itfds;

		// cout << i << " " << pos << " " << nxt << endl;

		if(it->sc == 0) {
			for(int b = lg; b >= 1; b--) {
				if(d[i][b] == -1) continue;
				it = pts.upper_bound(mp(mp(d[i][b],n+1),n+1));
				if(it != pts.end() && it->fr.fr < nxt && it->sc == 0) {
					pos = d[i][b];
					ans+= (1<<b);
					// i = -1;
					// break;
					// it = pts.upper_bound(mp(mp(pos,n+1),n+1));
					// if(it == pts.end() or it->fr.fr >= nxt) {
					// 	i = -1;
					// 	break;
					// }
					i = it->fr.sc;
				}
			}
		}

		if(i != -1) {
			pos = pos+s;
			ans+= 1;
		}
	}
	cntq = (cntq+1)%B;
  	return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 8536 KB Output is correct
2 Correct 2 ms 8792 KB Output is correct
3 Correct 2 ms 8792 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 8536 KB Output is correct
2 Correct 2 ms 8792 KB Output is correct
3 Correct 2 ms 8792 KB Output is correct
4 Incorrect 2 ms 8536 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 8536 KB Output is correct
2 Correct 2 ms 8792 KB Output is correct
3 Correct 2 ms 8792 KB Output is correct
4 Incorrect 2 ms 8536 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 8536 KB Output is correct
2 Correct 2 ms 8792 KB Output is correct
3 Correct 2 ms 8792 KB Output is correct
4 Incorrect 2 ms 8536 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 8536 KB Output is correct
2 Correct 2 ms 8792 KB Output is correct
3 Correct 2 ms 8792 KB Output is correct
4 Incorrect 2 ms 8536 KB Output isn't correct
5 Halted 0 ms 0 KB -