【JOISC2018|2019】【20190622】minerals
题目
交互题
有\(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的更多相关文章
- 【JOISC2018|2019】【20190622】mergers
题目 一\(n\)个节点的树,节点被分成\(k\)个集合,\(i\)属于\(S_i\), 一条边是可划分的当且仅当左右两边的子树不存在相同集合的点 你一次可以合并两个集合,求最少的操作次数使得所有边都 ...
- 【FJWC 2019】 森林
[FJWC 2019] 森林 样例输入 0 5 1 0 0 2 样例输出 1 2 3 3 我们发现,答案就是直径加上直径上某个点出发,不经过其他直径上的点的最长链.这里的直径可以是任意一条直径. 首先 ...
- 【FJWC 2019】min
[FJWC 2019]min 题目描述 给你一张 \(n\) 个点 \(m\) 条边的无向图,走过每条边都需要花费 \(1\) 秒. 给你一个整数 \(k\) ,请你选择至多 \(k\) 个点,令经过 ...
- IT帮2019年2月线下活动【定义工作,解读自我】之站桩练习
2019年2月IT帮线下活动[定义工作,解读自我] 昨天的活动收获很大,全面的总结周老师会另写一篇来帮助大家回顾.我想说一下其中最打动我的一句话:“只有你能决定你有多优秀!” “工作中把自己当成企业家 ...
- 【Linux】【Apatch Tomcat】Linux、CentOS7安装最新版Apartch Tomcat环境
1.前言 相当嫌弃,博客园搞掉了我快写完的 Tomcat. 请先安装 :[Linux][Java]CentOS7安装最新版Java1.8.191运行开发环境 虽然安装Tomcat没啥技术,但是还是记录 ...
- 【Python】【装饰器】
Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...
- 【转载】【Pycharm编辑器破解步骤】之idea和Pycharm 等系列产品激活激活方法和激活码(附:Mac系统)
感谢:雪中皓月的<idea和Pycharm 等系列产品激活激活方法和激活码> 第一种方法:使用现有的注册服务器 优点:快捷,方便,省事 缺点:经常被封杀,可能会面临经常激活的困扰 Lice ...
- 【北京/上海/南京】【部门直推】【可查询】【实习&社招】字节跳动数据平台前端内推
[北京/上海/南京][部门直推][可查询][实习&社招]字节跳动数据平台前端内推 重要信息,写在前面 [投递邮箱]chengxinsong@bytedance.com [微信扫码] 2019 ...
- 【Robot Framework 项目实战 04】基于录制,生成RF关键字及 自动化用例
背景 因为服务的迁移,Jira版本的更新,很多接口文档的维护变少,导致想要编写部分服务的自动化测试变得尤为麻烦,很多服务,尤其是客户端接口需要通过抓包的方式查询参数来编写自动化用例,但是过程中手工重复 ...
随机推荐
- Java数据结构-ArrayList最细致的解析笔记
ArrayList是一个类,这个类有一个数组参数elementData,ArrayList集合中的元素正是保存在这个数组中,它继承了数组查询的高性能,参考第3篇.ArrayList还封装了很多方法,便 ...
- Java核心技术梳理-IO
一.引言 IO(输入/输出),输入是指允许程序读取外部数据(包括来自磁盘.光盘等存储设备的数据).用户输入数据.输出是指允许程序记录运行状态,将程序数据输出到磁盘.光盘等存储设备中. IO的主要内容包 ...
- 两个div并排显示,当浏览器界面缩小时会出现换行
解决:规定两个子div的父div的宽 <div id="showDataDiv" style="width: 1000px"> <div st ...
- Nginx fastcgi_cache权威指南
一.简介 Nginx版本从0.7.48开始,支持了类似Squid的缓存功能.这个缓存是把URL及相关组合当做Key,用Md5算法对Key进行哈希,得到硬盘上对应的哈希目录路径,从而将缓存内容保存在该目 ...
- head 与 tail
head head [-n] 数字『文件』 显示前面n行 例如 head -n 3 test 显示 test 文件的前 3 行,也可以写作 head -3 test 比较有趣的是 -n 后面的数字,可 ...
- HttpClient使用详解与实战一:普通的GET和POST请求
简介 HttpClient是Apache Jakarta Common下的子项目,用来提供高效的.最新的.功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议. Htt ...
- dom4j 解析字符串成树形结构
引入maven依赖: <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artif ...
- 《深入理解 Java 虚拟机》读书笔记:Java 内存区域与内存溢出异常
前言 最近开始看这本书,记得前段时间拿起这本书的时候,心情是相当沉重的!当时的剧本是这样的-- 内景.家里 - 下午 我(画外):唉,有点无聊啊!(偶然撇过书架)这么多书得看到什么时候啊,要不要拿一本 ...
- Linux命令——chattr、lsattr
简介 chattr用于设置文件隐藏属性,lsattr用于查看文件隐藏属性.隐藏属性对系统很有用,尤其是系统安全这一块.但是这两个命令只能在Ext2/Ext3上面有用,其他文件系统可能不支持. chat ...
- Java中的乐观锁
1.前言 之前好几次看到有人在面经中提到了乐观锁与悲观锁,但是一本<Java Concurrency In Practice>快看完了都没有见到过这两种锁,今天终于在第15章发现了它们的踪 ...