제출 #1308243

#제출 시각아이디문제언어결과실행 시간메모리
1308243vako_pMinerals (JOI19_minerals)C++20
0 / 100
19 ms604 KiB
#include "minerals.h"	
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define ff first
#define sd second
	
const int mxN = 1e5 + 5;
static ll n,last = 0;
bool vis[mxN],vis1[mxN];

ll query(ll i){
	ll res = Query(i);
	vis[i] = 1 - vis[i];
	return res;
}

void Solve(int N){
	n = N;	
	vector<ll> v[2],l(2 * n + 5),r(2 * n + 5);
  vector<ll> vv(2 * n);
  iota(vv.begin(), vv.end(), 1);
  random_device rd;
  mt19937_64 gen(rd());
  uniform_int_distribution<ll> dis(0, 2 * n - 1);
  for(int i = 0; i < 2 * n; i++) swap(vv[i], vv[dis(gen)]);
	for(auto i : vv){
		ll res = query(i);
		if(res == last){
      v[1].pb(i);
      l[i] = -1;
      ll sz = v[0].size();
      r[i] = sz - 1;
    } 
		else v[0].pb(i);
		last = res;
	}
	vector<vector<ll>> q(n + 5);
	for(auto i : v[1]){
		ll mid = l[i] + (r[i] - l[i]) / 2;
		if(r[i] > l[i] + 1) q[mid].pb(i);
    else vis1[r[i]] = true;
	}
	ll op = 0,cnt = n;
	while(cnt){
		if(op){
			for(int j = 0; j < n; j++){
				if(!vis1[j]) last = query(v[0][j]);
				for(auto i : q[j]){
					ll res = query(i);
					if(res == last) r[i] = j;
					else l[i] = j;
					last = res;
          if(r[i] <= l[i] + 1){
            vis1[r[i]] = true;
            continue;
          } 
          while(vis1[r[i]]) r[i]--;
          while(vis1[l[i]]) l[i]++;
				  ll mid = l[i] + (r[i] - l[i]) / 2;
				  if(r[i] > l[i] + 1){
            while(vis1[mid]) mid++;
            q[mid].pb(i);
          } 
          else vis1[r[i]] = true;
				}
				q[j].clear();
			}
		}
		else{
			for(int j = n - 1; j >= 0; j--){
				for(auto i : q[j]){
					ll res = query(i);
					if(res == last) r[i] = j;
					else l[i] = j;
					last = res;
          if(r[i] <= l[i] + 1){
            vis1[r[i]] = true;
            continue;
          } 
          while(vis1[r[i]]) r[i]--;
          while(vis1[l[i]]) l[i]++;
				  ll mid = l[i] + (r[i] - l[i]) / 2;
				  if(r[i] > l[i] + 1){
            while(vis1[mid]) mid--;
            q[mid].pb(i);
          } 
				}
				q[j].clear();
				if(!vis1[j]) last = query(v[0][j]);
			}
		}
    op = 1 - op;
		cnt = 0;
		for(auto i : v[1]){
      // cout << i << ' ' << l[i] << ' ' << r[i] << '\n';
			if(r[i] > l[i] + 1){
				cnt++;
			}
		}
	}
	for(auto i : v[1]) Answer(i, v[0][r[i]]);
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...