交互题

一个 01 序列,告诉你其中 1 有奇数个还是偶数个,每次可以给定两个集合 $A$,$B$,系统会告诉你 $A \leq B$ 或者 $B \leq A$

求序列

交互次数要求 $5n + O(log_2 n)$

有一个 subtask 满足原序列是一条从不上升或者不下降的链,要求 $O(log_2n)$

sol:

首先有一个交互次数 $2n + 5n$ 的做法:首先 $2n$ 次找出最大值,最大的那个肯定是 $1$,之后每次问两个还不确定的($a,b$),$a+b$ 是否大于等于 $1$

如果大于等于,那么 $a,b$ 中较大的是 $1$,否则 $a,b$ 中较小的是 $0$。最后特判一下奇偶性不符的情况即可

然后对于一条链的情况,首先,两个端点一定有一个 1,二分找出一个位置最小的 $x$ 使得 $p[x] + p[x+1] \geq 1$ 即可

分界线那里用奇偶性特判一下 $O(log_2n)$

正解

发现 5n 的部分不太好优化,考虑一边 5n 一边确定一个递增的关系,然后用 logn 次确定那条链

具体地,可以从三个数 $(x,y,z)$ 开始,先比较 $x,y$,不妨设大的那个是 $y$

如果 $x+y \leq z$,则 $x=0$,再找一个 $x$

否则 $y \geq z$,把 $y$ 放到 $z$ 的位置,再找一个 $y$

这样会确定若干个 $0$ ,剩一个比不出去的,和一条递增的链

容易知道比不出去的和链最大值中较大的那个是 $1$,可以直接上二分

二分之后还有一个不确定的分界线和一个比不出去的,$O(1)$ 讨论一下即可

  1. #include <bits/stdc++.h>
  2. #include "shop.h"
  3. #define LL long long
  4. #define rep(i, s, t) for (register int i = s, i##end = t; i <= i##end; ++i)
  5. #define dwn(i, s, t) for (register int i = s, i##end = t; i >= i##end; --i)
  6. using namespace std;
  7. int arr[], brr[];
  8. int ans[], que[], chain[];
  9. int ask(int x, int y) {
  10. arr[] = x, brr[] = y;
  11. return query(arr, , brr, );
  12. }
  13. int ask2(int x, int fst, int scd) {
  14. arr[] = x, brr[] = fst, brr[] = scd;
  15. return query(arr, , brr, );
  16. }
  17. void find_price(int task_id, int N, int K, int ans[]) {
  18. auto solvechain = [&](int N, int K) {
  19. int l = , r = N - , res = N - ;
  20. while (l <= r) {
  21. int mid = (l + r) >> ;
  22. if (ask2(que[N - ], que[mid], que[mid + ]))
  23. res = mid, r = mid - ;
  24. else
  25. l = mid + ;
  26. }
  27. int val = res;
  28. if (K != ((N - res) & ))
  29. res++;
  30. rep(i, , res - ) ans[que[i]] = ;
  31. rep(i, res, N - ) ans[que[i]] = ;
  32. return val;
  33. };
  34. for (int i = ; i < N; ++i) ans[i] = ;
  35. if (task_id == ) {
  36. for (int i = ; i < N; ++i) que[i] = i;
  37. if (ask(N - , ))
  38. reverse(que, que + N);
  39. solvechain(N, K);
  40. } else if (task_id == ) {
  41. if (N == )
  42. ans[] = ;
  43. else if (N == ) {
  44. int mx = ask(, ) ? : ;
  45. ans[mx] = ;
  46. if (!K)
  47. ans[!mx] = ;
  48. } else {
  49. int dfn = N - , cd = ;
  50. chain[] = ;
  51. for (int i = ; i < N; ++i) que[i] = i;
  52. while (dfn > ) {
  53. if (!ask2(chain[cd - ], que[dfn], que[dfn - ])) {
  54. if (!ask(que[dfn], que[dfn - ]))
  55. swap(que[dfn], que[dfn - ]);
  56. ans[que[dfn]] = ;
  57. } else {
  58. if (ask(que[dfn], que[dfn - ]))
  59. swap(que[dfn], que[dfn - ]);
  60. chain[cd++] = que[dfn];
  61. }
  62. dfn--;
  63. }
  64. if (ask(que[dfn], chain[cd - ])) {
  65. ans[chain[cd - ]] = ;
  66. int cmx = que[dfn];
  67. dfn = cd;
  68. for (int i = ; i < cd; ++i) que[i] = chain[i];
  69. int cur = solvechain(dfn, K);
  70. K ^= ((dfn - cur - ) & );
  71. cur = que[cur];
  72. if (!ask2(chain[cd - ], cmx, cur)) {
  73. if (ask(cmx, cur))
  74. ans[cmx] = ;
  75. else
  76. ans[cur] = ;
  77. } else {
  78. if (ask(cur, cmx))
  79. ans[cmx] = ;
  80. else
  81. ans[cur] = ;
  82. K ^= ;
  83. }
  84. ans[cmx] = K;
  85. } else {
  86. ans[que[dfn]] = ;
  87. chain[cd++] = que[dfn];
  88. for (int i = ; i < cd; ++i) que[i] = chain[i];
  89. solvechain(cd, K);
  90. }
  91. }
  92. } else {
  93. int mx = ;
  94. for (int i = ; i < N; ++i)
  95. if (ask(mx, i) == )
  96. mx = i;
  97. ans[mx] = ;
  98. int dfn = ;
  99. K ^= ;
  100. for (int i = ; i < N; ++i) {
  101. if (i == mx)
  102. continue;
  103. que[++dfn] = i;
  104. }
  105. while (dfn > ) {
  106. if (ask2(mx, que[dfn], que[dfn - ]) == ) {
  107. if (ask(que[dfn - ], que[dfn]))
  108. swap(que[dfn - ], que[dfn]);
  109. ans[que[dfn]] = ;
  110. } else {
  111. if (!ask(que[dfn - ], que[dfn]))
  112. swap(que[dfn - ], que[dfn]);
  113. ans[que[dfn]] = ;
  114. K ^= ;
  115. }
  116. dfn--;
  117. }
  118. if (K && dfn)
  119. ans[que[dfn]] = ;
  120. }
  121. }

WC2019 I 君的商店的更多相关文章

  1. 【LOJ】#2985. 「WC2019」I 君的商店

    LOJ#2985. 「WC2019」I 君的商店 一道很神仙的题啊QAQ 居然是智商题--不是乱搞或者是大数据 我们可以用2N问出一个最大值是1 然后对于任意两个值\(x + y\)和\(a\)比较 ...

  2. loj2985「WC2019」I 君的商店(二分,思维)

    loj2985「WC2019」I 君的商店(二分,思维) loj Luogu 题解时间 真的有点猛的思维题. 首先有一个十分简单的思路: 花费 $ 2N $ 确定一个为 $ 1 $ 的数. 之后每次随 ...

  3. LOJ #2985. 「WC2019」I 君的商店

    传送门 搬题解QwQ 首先最大值一定为 \(1\),直接扫一遍两两比较 \(O(2N)\) 求出最大值 设最大值位置为 \(a\),对于任意两个没有确定的位置 \(x,y\) 询问 \([a,x+y] ...

  4. 【loj2985】【WC2019】I君的商店

    题目 交互题: 有\(n\)个物品,每个物品的价格为0或者1; 给出为1的物品的个数奇偶性k,并保证至少有一个价格为1: 每次可以询问一个集合S的另一个集合T的价值和的大小,交互库会返回>=或者 ...

  5. 游记-NOI2019

    Day -18 被各路julao们轮番吊打-- Day -12 鸽子F发布了笔试题库,然而并没有 "MLE全场记零分" 的操作 Day -8 广二体育馆机器装配完毕,误闯开幕式表演 ...

  6. NOI2019 游记——一切都是最好的安排

    有幸运有遗憾 一切都是最好的安排. Day-3 临近NOI了,机房都在狂奶某某同学进队稳了 HE省队垫底,THUSC面试都没进 作为一个有自知之明的人 也就指望着能拼进前100,至少也拿个银牌. 心态 ...

  7. 【NOI 2019】同步赛 / 题解 / 感想

    非常颓写不动题怎么办…… 写下这篇博客警示自己吧…… 游记 7.16 我并不在广二参加 NOI,而是在距离广二体育馆一公里远的包间打同步赛(其实就是给写不动题找个理由) 上午身体不舒服,鸽了半天才看题 ...

  8. NOI2019退役记

    Day0 时光荏苒,日月如梭.人生中第二次也是最后一次全国赛开始了. 坐6h高铁+1h大巴来到gzez,热死.室友是A类的Gloid和C类的仓鼠,我寝室是为数不多(或许只有1个)的凑齐了ABC三种类别 ...

  9. 大熊君{{bb}}移动开发之旅(第一季)

    一,开篇概述 Hi,大家好!大熊君又和大家见面了,从这篇文章开始我要和大家聊聊移动开发的话题,这部分文章共8季,分别从不同角度来讲解什么是移动开发?移动开发涉及到什么方面的技术点以及移动开发中的常见问 ...

随机推荐

  1. 使用SQL Server Management Studio 创建数据库备份作业

    --完整备份,每周一次USE MasterGOdeclare @str varchar(100)set @str='D:\Weldon\DBBACK\FullBak'+replace(replace( ...

  2. 计算机网络概述 传输层 TCP拥塞控制

    TCP拥塞控制 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就 ...

  3. c++ boost库学习三:实用工具

    noncopyable 大家都知道定义一个空类的时候,它实际包含了构造函数,拷贝构造函数,赋值操作符和析构函数等. 这样就很容易产生一个问题,就是当用户调用A a(“^_^") 或者A c= ...

  4. 获取蓝牙mac地址

    http://macpu.github.io/2015/11/12/iOS%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E8%93%9D%E7%89%99Mac%E5%9C ...

  5. juniper常用命令(二)

    Juniper防火墙基本命令 常用查看命令 Get int查看接口配置信息 Get int ethx/x查看指定接口配置信息 Get mip查看映射ip关系 Get route查看路由表 Get po ...

  6. Struts2的Action中访问servletAPI方式

    struts2的数据存放中心为ActionContext,其是每次请求来时都会创建一个ActionContext,访问结束销毁,其绑定在ThreadLocal上,由于每次访问web容器都会为每次请求创 ...

  7. skynet中动态库的处理

    skynet中的.so动态库由service-src中的c文件编译完后生成,其中最重要的是snlua.c. 源码地址:https://github.com/cloudwu/skynet/service ...

  8. nginx流量全copy记录

    参考:http://tyrion.iteye.com/blog/2311987 准备两台服务器: 0.0.0.1 0.0.0.2 在 0.0.0.1上 . 下载 wget https://github ...

  9. linux图形界面基本知识(X、X11、Xfree86、Xorg、GNOME、KDE之间的关系)

    linux图形界面基本知识(X.X11.Xfree86.Xorg.GNOME.KDE之间的关系)(转自互联网) LINUX初学者经常分不清楚linux和X之间,X和Xfree86之间,X和KDE,GN ...

  10. svg_path

    1. path 的 d属性中,M的大/小写貌似不影响图形显示效果(至少现在[20160108]我测试下来是这样[chrome 版本 47.0.2526.80 m]):L/H/V 的大小写 是影响图形显 ...