답안 #619990

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
619990 2022-08-02T18:17:05 Z errorgorn Minerals (JOI19_minerals) C++17
100 / 100
358 ms 19540 KB
#include "minerals.h"
 
#include <bits/stdc++.h>
using namespace std;
 
#define int long long
#define ii pair<int,int>
#define fi first
#define se second
 
#define puf push_front
#define pof pop_front
#define pub push_back
#define pob pop_back
#define lb lower_bound
#define ub upper_bound
 
#define rep(x,s,e) for (int x=(s)-((s)>(e));x!=(e)-((s)>(e));((s)<(e))?x++:x--)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int) (x).size()
 
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
 
int num[50005];
int best[50005];
 
int CURR=0;
bool same(int x){
	int temp=Query(x);
	int res=CURR==temp;
	CURR=temp;
	return res;
}
 
int n;

vector<int> v; //singles
vector<ii> v2; //pairs
int B;

map<int,int> pos;

struct node{
	int len;
	vector<int> l; //indices
	node *L=nullptr,*R=nullptr;
	
	node (int _len){
		len=_len;
		
		if (len==1){
			l={v.back()}; v.pob();
		}
		else if (len==2 && !v2.empty()){
			l={v2.back().fi,v2.back().se}; v2.pob();
		}
		else{
			L=new node(best[len]);
			R=new node(len-best[len]);
			
			for (auto it:L->l) l.pub(it);
			for (auto it:R->l) l.pub(it);
		}
	}
	
	void solve(vector<int> r,bool in){
		if (L==nullptr){
			if (sz(r)==2){
				if (pos[r[0]]<B){
					Answer(l[0],r[0]);
					Answer(l[1],r[1]);
					return;
				}
				else{
					v=l;
					L=new node(1);
					R=new node(1);
				}
			}
			else{
				Answer(l[0],r[0]);
				return;
			}
		}
		
		for (auto it:L->l) same(it);
		
		vector<int> r1,r2;
		for (auto it:r){
			if (sz(L->l)==sz(r1)) r2.pub(it);
			else if (sz(R->l)==sz(r2)) r1.pub(it);
			else if (same(it) != in) r1.pub(it);
			else r2.pub(it);
		}
		
		L->solve(r1,!in);
		R->solve(r2,in);
	}
} *root;

vector<int> get(vector<int> inp){
	vector<int> temp,r;
	rep(x,0,sz(inp)){
		if (same(inp[x])) r.pub(inp[x]);
		else temp.pub(inp[x]);
	}
	
	vector<int> l,oth;
	for (auto it:temp){
		if (same(it)) l.pub(it);
		else oth.pub(it);
	}
	
	B=max(0LL,sz(l)/4-50);
	
	
	rep(x,0,B) v2.pub({l[x],l[sz(l)-1-x]});
	rep(x,B,sz(l)-B) v.pub(l[x]);
	root=new node(sz(l));
	
	rep(x,0,sz(r)) pos[r[x]]=x;
	root->solve(r,false);
	
	return oth;
}
 
void Solve(signed N) {
	num[1]=0;
	rep(x,2,50005){
		num[x]=1e9;
		int l=max(1LL,(int)(x*0.25)),r=min(x,(int)(x*0.4)+2);
		
		rep(y,l,r) if (num[x]>num[y]+num[x-y]+x+y){
			num[x]=num[y]+num[x-y]+x+y;
			best[x]=y;
		}
	}
	
	n=N;
	
	vector<int> idx;
	rep(x,1,2*n+1) idx.pub(x);
	shuffle(all(idx),rng);
	
	vector<int> l,r;
	rep(x,0,n) l.pub(idx[x]);
	rep(x,n,2*n) r.pub(idx[x]);
	
	l=get(l),r=get(r);
	if (sz(l)==0) return;
	v=l;
	root=new node(sz(l));
	root->solve(r,false);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 260 ms 992 KB Output is correct
2 Correct 279 ms 992 KB Output is correct
3 Correct 275 ms 1064 KB Output is correct
4 Correct 260 ms 1180 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 277 ms 1348 KB Output is correct
2 Correct 270 ms 1828 KB Output is correct
3 Correct 272 ms 2580 KB Output is correct
4 Correct 284 ms 4304 KB Output is correct
5 Correct 282 ms 7220 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 260 ms 992 KB Output is correct
2 Correct 279 ms 992 KB Output is correct
3 Correct 275 ms 1064 KB Output is correct
4 Correct 260 ms 1180 KB Output is correct
5 Correct 277 ms 1348 KB Output is correct
6 Correct 270 ms 1828 KB Output is correct
7 Correct 272 ms 2580 KB Output is correct
8 Correct 284 ms 4304 KB Output is correct
9 Correct 282 ms 7220 KB Output is correct
10 Correct 271 ms 1428 KB Output is correct
11 Correct 295 ms 5336 KB Output is correct
12 Correct 278 ms 7324 KB Output is correct
13 Correct 287 ms 7260 KB Output is correct
14 Correct 282 ms 7264 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 260 ms 992 KB Output is correct
2 Correct 279 ms 992 KB Output is correct
3 Correct 275 ms 1064 KB Output is correct
4 Correct 260 ms 1180 KB Output is correct
5 Correct 277 ms 1348 KB Output is correct
6 Correct 270 ms 1828 KB Output is correct
7 Correct 272 ms 2580 KB Output is correct
8 Correct 284 ms 4304 KB Output is correct
9 Correct 282 ms 7220 KB Output is correct
10 Correct 271 ms 1428 KB Output is correct
11 Correct 295 ms 5336 KB Output is correct
12 Correct 278 ms 7324 KB Output is correct
13 Correct 287 ms 7260 KB Output is correct
14 Correct 282 ms 7264 KB Output is correct
15 Correct 348 ms 17268 KB Output is correct
16 Correct 314 ms 17232 KB Output is correct
17 Correct 331 ms 17212 KB Output is correct
18 Correct 319 ms 17044 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 260 ms 992 KB Output is correct
2 Correct 279 ms 992 KB Output is correct
3 Correct 275 ms 1064 KB Output is correct
4 Correct 260 ms 1180 KB Output is correct
5 Correct 277 ms 1348 KB Output is correct
6 Correct 270 ms 1828 KB Output is correct
7 Correct 272 ms 2580 KB Output is correct
8 Correct 284 ms 4304 KB Output is correct
9 Correct 282 ms 7220 KB Output is correct
10 Correct 271 ms 1428 KB Output is correct
11 Correct 295 ms 5336 KB Output is correct
12 Correct 278 ms 7324 KB Output is correct
13 Correct 287 ms 7260 KB Output is correct
14 Correct 282 ms 7264 KB Output is correct
15 Correct 348 ms 17268 KB Output is correct
16 Correct 314 ms 17232 KB Output is correct
17 Correct 331 ms 17212 KB Output is correct
18 Correct 319 ms 17044 KB Output is correct
19 Correct 322 ms 17640 KB Output is correct
20 Correct 335 ms 17684 KB Output is correct
21 Correct 322 ms 17820 KB Output is correct
22 Correct 335 ms 17580 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 260 ms 992 KB Output is correct
2 Correct 279 ms 992 KB Output is correct
3 Correct 275 ms 1064 KB Output is correct
4 Correct 260 ms 1180 KB Output is correct
5 Correct 277 ms 1348 KB Output is correct
6 Correct 270 ms 1828 KB Output is correct
7 Correct 272 ms 2580 KB Output is correct
8 Correct 284 ms 4304 KB Output is correct
9 Correct 282 ms 7220 KB Output is correct
10 Correct 271 ms 1428 KB Output is correct
11 Correct 295 ms 5336 KB Output is correct
12 Correct 278 ms 7324 KB Output is correct
13 Correct 287 ms 7260 KB Output is correct
14 Correct 282 ms 7264 KB Output is correct
15 Correct 348 ms 17268 KB Output is correct
16 Correct 314 ms 17232 KB Output is correct
17 Correct 331 ms 17212 KB Output is correct
18 Correct 319 ms 17044 KB Output is correct
19 Correct 322 ms 17640 KB Output is correct
20 Correct 335 ms 17684 KB Output is correct
21 Correct 322 ms 17820 KB Output is correct
22 Correct 335 ms 17580 KB Output is correct
23 Correct 337 ms 18148 KB Output is correct
24 Correct 335 ms 18156 KB Output is correct
25 Correct 319 ms 18096 KB Output is correct
26 Correct 333 ms 17996 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 260 ms 992 KB Output is correct
2 Correct 279 ms 992 KB Output is correct
3 Correct 275 ms 1064 KB Output is correct
4 Correct 260 ms 1180 KB Output is correct
5 Correct 277 ms 1348 KB Output is correct
6 Correct 270 ms 1828 KB Output is correct
7 Correct 272 ms 2580 KB Output is correct
8 Correct 284 ms 4304 KB Output is correct
9 Correct 282 ms 7220 KB Output is correct
10 Correct 271 ms 1428 KB Output is correct
11 Correct 295 ms 5336 KB Output is correct
12 Correct 278 ms 7324 KB Output is correct
13 Correct 287 ms 7260 KB Output is correct
14 Correct 282 ms 7264 KB Output is correct
15 Correct 348 ms 17268 KB Output is correct
16 Correct 314 ms 17232 KB Output is correct
17 Correct 331 ms 17212 KB Output is correct
18 Correct 319 ms 17044 KB Output is correct
19 Correct 322 ms 17640 KB Output is correct
20 Correct 335 ms 17684 KB Output is correct
21 Correct 322 ms 17820 KB Output is correct
22 Correct 335 ms 17580 KB Output is correct
23 Correct 337 ms 18148 KB Output is correct
24 Correct 335 ms 18156 KB Output is correct
25 Correct 319 ms 18096 KB Output is correct
26 Correct 333 ms 17996 KB Output is correct
27 Correct 358 ms 18528 KB Output is correct
28 Correct 321 ms 18500 KB Output is correct
29 Correct 330 ms 18624 KB Output is correct
30 Correct 327 ms 18384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 260 ms 992 KB Output is correct
2 Correct 279 ms 992 KB Output is correct
3 Correct 275 ms 1064 KB Output is correct
4 Correct 260 ms 1180 KB Output is correct
5 Correct 277 ms 1348 KB Output is correct
6 Correct 270 ms 1828 KB Output is correct
7 Correct 272 ms 2580 KB Output is correct
8 Correct 284 ms 4304 KB Output is correct
9 Correct 282 ms 7220 KB Output is correct
10 Correct 271 ms 1428 KB Output is correct
11 Correct 295 ms 5336 KB Output is correct
12 Correct 278 ms 7324 KB Output is correct
13 Correct 287 ms 7260 KB Output is correct
14 Correct 282 ms 7264 KB Output is correct
15 Correct 348 ms 17268 KB Output is correct
16 Correct 314 ms 17232 KB Output is correct
17 Correct 331 ms 17212 KB Output is correct
18 Correct 319 ms 17044 KB Output is correct
19 Correct 322 ms 17640 KB Output is correct
20 Correct 335 ms 17684 KB Output is correct
21 Correct 322 ms 17820 KB Output is correct
22 Correct 335 ms 17580 KB Output is correct
23 Correct 337 ms 18148 KB Output is correct
24 Correct 335 ms 18156 KB Output is correct
25 Correct 319 ms 18096 KB Output is correct
26 Correct 333 ms 17996 KB Output is correct
27 Correct 358 ms 18528 KB Output is correct
28 Correct 321 ms 18500 KB Output is correct
29 Correct 330 ms 18624 KB Output is correct
30 Correct 327 ms 18384 KB Output is correct
31 Correct 356 ms 18988 KB Output is correct
32 Correct 328 ms 18980 KB Output is correct
33 Correct 323 ms 19024 KB Output is correct
34 Correct 332 ms 18808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 260 ms 992 KB Output is correct
2 Correct 279 ms 992 KB Output is correct
3 Correct 275 ms 1064 KB Output is correct
4 Correct 260 ms 1180 KB Output is correct
5 Correct 277 ms 1348 KB Output is correct
6 Correct 270 ms 1828 KB Output is correct
7 Correct 272 ms 2580 KB Output is correct
8 Correct 284 ms 4304 KB Output is correct
9 Correct 282 ms 7220 KB Output is correct
10 Correct 271 ms 1428 KB Output is correct
11 Correct 295 ms 5336 KB Output is correct
12 Correct 278 ms 7324 KB Output is correct
13 Correct 287 ms 7260 KB Output is correct
14 Correct 282 ms 7264 KB Output is correct
15 Correct 348 ms 17268 KB Output is correct
16 Correct 314 ms 17232 KB Output is correct
17 Correct 331 ms 17212 KB Output is correct
18 Correct 319 ms 17044 KB Output is correct
19 Correct 322 ms 17640 KB Output is correct
20 Correct 335 ms 17684 KB Output is correct
21 Correct 322 ms 17820 KB Output is correct
22 Correct 335 ms 17580 KB Output is correct
23 Correct 337 ms 18148 KB Output is correct
24 Correct 335 ms 18156 KB Output is correct
25 Correct 319 ms 18096 KB Output is correct
26 Correct 333 ms 17996 KB Output is correct
27 Correct 358 ms 18528 KB Output is correct
28 Correct 321 ms 18500 KB Output is correct
29 Correct 330 ms 18624 KB Output is correct
30 Correct 327 ms 18384 KB Output is correct
31 Correct 356 ms 18988 KB Output is correct
32 Correct 328 ms 18980 KB Output is correct
33 Correct 323 ms 19024 KB Output is correct
34 Correct 332 ms 18808 KB Output is correct
35 Correct 334 ms 19392 KB Output is correct
36 Correct 334 ms 19400 KB Output is correct
37 Correct 330 ms 19540 KB Output is correct
38 Correct 338 ms 19192 KB Output is correct