题目

交互题

有\(2n\)个物品,编号为\(1-2n\),存在唯一的两两配对关系,即有\(n\)种物品

有一个盒子,初始为空,盒子上会显示里面存在的物品种类数\(C\)

你每次操作可以将一个物品从盒子里拿出或者放入盒子

$n \le 43000 $,次数限制\(10^6\)

题解

  • 首先依次加入所有物品,考虑C变和不变可以将物品分成两个对应的集合AB

  • 在盒子里保留A的一半,依次改变B的状态,考虑C变和不变可以将B继续分成对应的两个集合

  • 交换AB,一直分治下去,复杂度大约是\(O(3.5N+2NlogN)\)

  • 然而这题最优秀的一点在于后面(图片来自官解):

    我们假设分治部分的次数复杂度为\(f(N) = tN \ logN\) ,设每次分治的两部分之比为p : 1 - p

    (求导)求极值点:

  • 那 p 就一反套路地取0.382好了

    #include "minerals.h"
    #include<bits/stdc++.h>
    #define K 0.38 using namespace std; const int maxN=43010;
    int n,P[maxN],Q[maxN],vis[maxN<<1];
    int pl[maxN],pr[maxN],ql[maxN],qr[maxN]; bool query(int x){
    static int now,lst,re;
    vis[x]^=1;now=Query(x);
    re=(now!=lst);lst=now;
    return re;
    } void Swap(int l1,int r1){
    static int tmp[maxN];
    for(int i=1;i<=l1;++i)tmp[i]=pl[i];
    for(int i=1;i<=r1;++i)pl[i]=pr[i];
    for(int i=1;i<=l1;++i)pr[i]=tmp[i];
    }//直接swap两个指针的话似乎会把指向的数组全部交换 void solve(int*p,int*q,int len){
    if(len==1){
    Answer(p[1],q[1]);
    return;
    }
    int l1,r1,l2,r2;
    l1=r1=l2=r2=0;
    for(int i=1;i<=len;++i){
    if(vis[p[i]])pl[++l1]=p[i];
    else pr[++r1]=p[i];
    }
    if(l1>r1)Swap(l1,r1),swap(l1,r1);
    int base=max(1,(int)(K*len));
    while(l1<base)query(pr[r1]),pl[++l1]=pr[r1--];
    while(l1>base)query(pl[l1]),pr[++r1]=pl[l1--];
    if(vis[pl[1]])Swap(l1,r1),swap(l1,r1);
    for(int i=1;i<=len;++i)if(query(q[i])){
    ql[++l2]=q[i];
    if(l2==l1){for(++i;i<=len;++i)qr[++r2]=q[i];}
    } else{
    qr[++r2]=q[i];
    if(r2==r1){for(++i;i<=len;++i)ql[++l2]=q[i];}
    }
    for(int i=1;i<=l1;++i)p[i]=pl[i];
    for(int i=1;i<=l2;++i)q[i]=ql[i];
    for(int i=1;i<=r1;++i)p[i+l1]=pr[i];
    for(int i=1;i<=r2;++i)q[i+l2]=qr[i];
    solve(q,p,l1);
    solve(q+l1,p+l1,r1);
    } void Solve(int N) {
    n=N;
    int cnt1=0,cnt2=0;
    for(int i=1;i<=2*n;++i){
    if(query(i))P[++cnt1]=i;
    else Q[++cnt2]=i;
    }
    solve(P,Q,n);
    }
    //一道非常有意思的交互题
    //20190622

【JOISC2018|2019】【20190622】minerals的更多相关文章

  1. 【JOISC2018|2019】【20190622】mergers

    题目 一\(n\)个节点的树,节点被分成\(k\)个集合,\(i\)属于\(S_i\), 一条边是可划分的当且仅当左右两边的子树不存在相同集合的点 你一次可以合并两个集合,求最少的操作次数使得所有边都 ...

  2. 【FJWC 2019】 森林

    [FJWC 2019] 森林 样例输入 0 5 1 0 0 2 样例输出 1 2 3 3 我们发现,答案就是直径加上直径上某个点出发,不经过其他直径上的点的最长链.这里的直径可以是任意一条直径. 首先 ...

  3. 【FJWC 2019】min

    [FJWC 2019]min 题目描述 给你一张 \(n\) 个点 \(m\) 条边的无向图,走过每条边都需要花费 \(1\) 秒. 给你一个整数 \(k\) ,请你选择至多 \(k\) 个点,令经过 ...

  4. IT帮2019年2月线下活动【定义工作,解读自我】之站桩练习

    2019年2月IT帮线下活动[定义工作,解读自我] 昨天的活动收获很大,全面的总结周老师会另写一篇来帮助大家回顾.我想说一下其中最打动我的一句话:“只有你能决定你有多优秀!” “工作中把自己当成企业家 ...

  5. 【Linux】【Apatch Tomcat】Linux、CentOS7安装最新版Apartch Tomcat环境

    1.前言 相当嫌弃,博客园搞掉了我快写完的 Tomcat. 请先安装 :[Linux][Java]CentOS7安装最新版Java1.8.191运行开发环境 虽然安装Tomcat没啥技术,但是还是记录 ...

  6. 【Python】【装饰器】

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  7. 【转载】【Pycharm编辑器破解步骤】之idea和Pycharm 等系列产品激活激活方法和激活码(附:Mac系统)

    感谢:雪中皓月的<idea和Pycharm 等系列产品激活激活方法和激活码> 第一种方法:使用现有的注册服务器 优点:快捷,方便,省事 缺点:经常被封杀,可能会面临经常激活的困扰 Lice ...

  8. 【北京/上海/南京】【部门直推】【可查询】【实习&社招】字节跳动数据平台前端内推

    [北京/上海/南京][部门直推][可查询][实习&社招]字节跳动数据平台前端内推 重要信息,写在前面  [投递邮箱]chengxinsong@bytedance.com [微信扫码] 2019 ...

  9. 【Robot Framework 项目实战 04】基于录制,生成RF关键字及 自动化用例

    背景 因为服务的迁移,Jira版本的更新,很多接口文档的维护变少,导致想要编写部分服务的自动化测试变得尤为麻烦,很多服务,尤其是客户端接口需要通过抓包的方式查询参数来编写自动化用例,但是过程中手工重复 ...

随机推荐

  1. C#关键字:static

    一.static关键字 下面我设计了一个房贷利率上浮类(用来计算房贷利率上浮多少): public class InterestRateGoUp { public InterestRateGoUp() ...

  2. MSP---企业上云需要考虑的问题

    一.评估 1.应用是否可以上云: 2.时间:规划时间,迁移时间 2.成本:人力成本,资源成本 二.上云 1.如何上云:选择云厂商,选择MSP 2.云选择:公有云,私有云,混合云,多云(不要最贵的,也不 ...

  3. crunch制作字典

    安装 安装crunch sudo apt-get install crunch 语法 crunch <min> max<max> <characterset> -t ...

  4. python day 14: 作业:开发一个能够多用户上传文件的FTP脚本

    目录 python day 14 1. 要求 2. 自己写的程序目录 3. models模块 4. settings模块 5. tcp_server模块 6. client模块 7. 后记 pytho ...

  5. 正则表达式修饰符 i、g、m、s、U、x、a、D、e 等。

    正则表达式中常用的模式修正符有i.g.m.s.U.x.a.D.e 等. 它们之间可以组合搭配使用. i 不区分(ignore)大小写: 例如: /abc/i 可以匹配 abc.aBC.Abc g 全局 ...

  6. Android-----Intent通过startActivityForResult(Intent intent , int 标志符)启动新的Activity

    我们都了解使用 startActivity(intent) 新的activity只能传递数据,却无法返回数据,返回新activity返回的数据我们可以替换startActivityForResult( ...

  7. Java 相等判断

    ==的判断机制是:根据两边的内存地址是否相同来判断. equals()是Object类的一个实例方法,判断机制和 == 完全一样. String类重写了equals()方法,是根据数据值来判断的. 总 ...

  8. How to set up "lldb_codesign" certificate!

    To use the in-tree debug server on macOS, lldb needs to be code signed. TheDebug, DebugClang and Rel ...

  9. Mac版StarUML破解方法

    StarUML是用nodejs写的.确切的说是用Electron前端框架写的.新版本中所有的starUML源代码是通过asar工具打包而成.确切的代码位置在“%LOCALAPPDATA%\Progra ...

  10. 1行Python代码制作动态二维码

    原文地址 https://blog.csdn.net/m0_38106923/article/details/100603516 GitHub网站参见:https://github.com/sylns ...