前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UOJ#52. 【UR #4】元旦激光炮(交互)

UOJ#52. 【UR #4】元旦激光炮(交互)

作者头像
attack
发布2018-08-01 11:22:29
3190
发布2018-08-01 11:22:29
举报

题意

给出三个已经排好序的数组$a, b, c$

在$100$次询问内找出第$k$小的元素

Sol

一种很显然的$log^2n$的做法:首先在$a$中二分,然后再$b,c$中二分。这样可以得到$60$分的好成绩。

然而这算法就没什么优化的空间了。。。

考虑另一种做法。

我们每次对三个数组询问第$\frac{3}{k}$个数。

然后我们可以直接把最小对应的那一段抛弃。正确性显然吧。或者你可以考虑一下最坏情况

那么$k$就缩小了$\frac{1}{3}$

算一下,查询次数不会超过$99$。

具体可以这么算

边界好难调啊,还是Orz std吧

代码语言:javascript
复制
#include "kth.h"
#include <stdio.h>
#include <assert.h>
#include<algorithm>
using namespace std;
int query_kth(int n_a, int n_b, int n_c, int k) {
    int nowa = 0, nowb = 0, nowc = 0, mi;
    while(k) {
        int cur = (k - 2) / 3;
        int vala = get_a(nowa + cur),
            valb = get_b(nowb + cur), 
            valc = get_c(nowc + cur);
        mi = min(vala, min(valb, valc));
        cur++;
        if(mi == vala) nowa += cur;
        else if(mi == valb) nowb += cur;
        else nowc += cur;
        k -= cur;
    }
    return mi;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-07-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意
  • Sol
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档