UOJ52【UR #4】元旦激光炮【交互】

时间:2021-06-12
本文章向大家介绍UOJ52【UR #4】元旦激光炮【交互】,主要包括UOJ52【UR #4】元旦激光炮【交互】使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

这是一道交互题

交互库有三个长为 \(n_a,n_b,n_c\) 的不降正整数序列 \(a,b,c\),不超过 \(100\) 次单点查询求 \(k\)-th。

\(n_a,n_b,n_c\le 10^5\)\(a_i,b_i,c_i\le 10^9\)


完全不会,牛逼坏了。

考虑归并排序的过程,必定有至少一个序列扔掉了前 \(\lfloor\frac k3\rfloor\) 个元素,并且询问 \(a,b,c\) 的第 \(\lfloor\frac k3\rfloor\) 个元素,求出最小值就可以找到对应序列,使得 \(k:=k-\lfloor\frac k3\rfloor\)。当 \(k\le 2\) 时暴力 \(6\) 次询问全求出来。

这个跟之前一道 300iq 题很像:\(a+b\ge k\) 可以拆成 \(\log k\)\(a\ge\frac k2\lor b\ge\frac k2\),转化为单点打标记。

#include"kth.h"
#include<bits/stdc++.h>
#define PB emplace_back
using namespace std;
namespace {
int n[3], p[3];
int ask(int o, int x){
	x += p[o]-1;
	if(x >= n[o]) return INT_MAX;
	switch(o){
	case 0: return get_a(x);
	case 1: return get_b(x);
	} return get_c(x);
}}
int query_kth(int na, int nb, int nc, int k){
	n[0] = na; n[1] = nb; n[2] = nc;
	while(k > 2){
		int l = k/3, a[3] = {ask(0, l), ask(1, l), ask(2, l)};
		if(a[0] < a[1] && a[0] < a[2]) p[0] += l;
		else if(a[1] < a[2]) p[1] += l;
		else p[2] += l; 
		k -= l;
	}
	vector<int> tmp;
	for(int i = 0;i < 3;++ i)
		for(int j = 1;j < 3;++ j)
			tmp.PB(ask(i, j));
	nth_element(tmp.begin(), tmp.begin()+k-1, tmp.end());
	return tmp[k-1];
}

原文地址:https://www.cnblogs.com/AThousandMoons/p/14878760.html