WC2019 I 君的商店
交互题
一个 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)$ 讨论一下即可
#include <bits/stdc++.h>
#include "shop.h"
#define LL long long
#define rep(i, s, t) for (register int i = s, i##end = t; i <= i##end; ++i)
#define dwn(i, s, t) for (register int i = s, i##end = t; i >= i##end; --i)
using namespace std;
int arr[], brr[];
int ans[], que[], chain[];
int ask(int x, int y) {
arr[] = x, brr[] = y;
return query(arr, , brr, );
}
int ask2(int x, int fst, int scd) {
arr[] = x, brr[] = fst, brr[] = scd;
return query(arr, , brr, );
}
void find_price(int task_id, int N, int K, int ans[]) {
auto solvechain = [&](int N, int K) {
int l = , r = N - , res = N - ;
while (l <= r) {
int mid = (l + r) >> ;
if (ask2(que[N - ], que[mid], que[mid + ]))
res = mid, r = mid - ;
else
l = mid + ;
}
int val = res;
if (K != ((N - res) & ))
res++;
rep(i, , res - ) ans[que[i]] = ;
rep(i, res, N - ) ans[que[i]] = ;
return val;
};
for (int i = ; i < N; ++i) ans[i] = ;
if (task_id == ) {
for (int i = ; i < N; ++i) que[i] = i;
if (ask(N - , ))
reverse(que, que + N);
solvechain(N, K);
} else if (task_id == ) {
if (N == )
ans[] = ;
else if (N == ) {
int mx = ask(, ) ? : ;
ans[mx] = ;
if (!K)
ans[!mx] = ;
} else {
int dfn = N - , cd = ;
chain[] = ;
for (int i = ; i < N; ++i) que[i] = i;
while (dfn > ) {
if (!ask2(chain[cd - ], que[dfn], que[dfn - ])) {
if (!ask(que[dfn], que[dfn - ]))
swap(que[dfn], que[dfn - ]);
ans[que[dfn]] = ;
} else {
if (ask(que[dfn], que[dfn - ]))
swap(que[dfn], que[dfn - ]);
chain[cd++] = que[dfn];
}
dfn--;
}
if (ask(que[dfn], chain[cd - ])) {
ans[chain[cd - ]] = ;
int cmx = que[dfn];
dfn = cd;
for (int i = ; i < cd; ++i) que[i] = chain[i];
int cur = solvechain(dfn, K);
K ^= ((dfn - cur - ) & );
cur = que[cur];
if (!ask2(chain[cd - ], cmx, cur)) {
if (ask(cmx, cur))
ans[cmx] = ;
else
ans[cur] = ;
} else {
if (ask(cur, cmx))
ans[cmx] = ;
else
ans[cur] = ;
K ^= ;
}
ans[cmx] = K;
} else {
ans[que[dfn]] = ;
chain[cd++] = que[dfn];
for (int i = ; i < cd; ++i) que[i] = chain[i];
solvechain(cd, K);
}
}
} else {
int mx = ;
for (int i = ; i < N; ++i)
if (ask(mx, i) == )
mx = i;
ans[mx] = ;
int dfn = ;
K ^= ;
for (int i = ; i < N; ++i) {
if (i == mx)
continue;
que[++dfn] = i;
}
while (dfn > ) {
if (ask2(mx, que[dfn], que[dfn - ]) == ) {
if (ask(que[dfn - ], que[dfn]))
swap(que[dfn - ], que[dfn]);
ans[que[dfn]] = ;
} else {
if (!ask(que[dfn - ], que[dfn]))
swap(que[dfn - ], que[dfn]);
ans[que[dfn]] = ;
K ^= ;
}
dfn--;
}
if (K && dfn)
ans[que[dfn]] = ;
}
}
WC2019 I 君的商店的更多相关文章
- 【LOJ】#2985. 「WC2019」I 君的商店
LOJ#2985. 「WC2019」I 君的商店 一道很神仙的题啊QAQ 居然是智商题--不是乱搞或者是大数据 我们可以用2N问出一个最大值是1 然后对于任意两个值\(x + y\)和\(a\)比较 ...
- loj2985「WC2019」I 君的商店(二分,思维)
loj2985「WC2019」I 君的商店(二分,思维) loj Luogu 题解时间 真的有点猛的思维题. 首先有一个十分简单的思路: 花费 $ 2N $ 确定一个为 $ 1 $ 的数. 之后每次随 ...
- LOJ #2985. 「WC2019」I 君的商店
传送门 搬题解QwQ 首先最大值一定为 \(1\),直接扫一遍两两比较 \(O(2N)\) 求出最大值 设最大值位置为 \(a\),对于任意两个没有确定的位置 \(x,y\) 询问 \([a,x+y] ...
- 【loj2985】【WC2019】I君的商店
题目 交互题: 有\(n\)个物品,每个物品的价格为0或者1; 给出为1的物品的个数奇偶性k,并保证至少有一个价格为1: 每次可以询问一个集合S的另一个集合T的价值和的大小,交互库会返回>=或者 ...
- 游记-NOI2019
Day -18 被各路julao们轮番吊打-- Day -12 鸽子F发布了笔试题库,然而并没有 "MLE全场记零分" 的操作 Day -8 广二体育馆机器装配完毕,误闯开幕式表演 ...
- NOI2019 游记——一切都是最好的安排
有幸运有遗憾 一切都是最好的安排. Day-3 临近NOI了,机房都在狂奶某某同学进队稳了 HE省队垫底,THUSC面试都没进 作为一个有自知之明的人 也就指望着能拼进前100,至少也拿个银牌. 心态 ...
- 【NOI 2019】同步赛 / 题解 / 感想
非常颓写不动题怎么办…… 写下这篇博客警示自己吧…… 游记 7.16 我并不在广二参加 NOI,而是在距离广二体育馆一公里远的包间打同步赛(其实就是给写不动题找个理由) 上午身体不舒服,鸽了半天才看题 ...
- NOI2019退役记
Day0 时光荏苒,日月如梭.人生中第二次也是最后一次全国赛开始了. 坐6h高铁+1h大巴来到gzez,热死.室友是A类的Gloid和C类的仓鼠,我寝室是为数不多(或许只有1个)的凑齐了ABC三种类别 ...
- 大熊君{{bb}}移动开发之旅(第一季)
一,开篇概述 Hi,大家好!大熊君又和大家见面了,从这篇文章开始我要和大家聊聊移动开发的话题,这部分文章共8季,分别从不同角度来讲解什么是移动开发?移动开发涉及到什么方面的技术点以及移动开发中的常见问 ...
随机推荐
- 使用BUCK进行iOS项目打包
关于BUCK BUCK是Facebook开源的快速打包工具,可以用于多种语言及平台的项目打包,例如:C.C++.Java.iOS.Android等等.用于大型的iOS.Android项目,可以显著提升 ...
- 转:MFC中屏蔽ESC和回车关闭对话框
解决方法是在 CDialog::PreTranslateMessage() 的重载函数中将ESC和回车按键的消息处理掉. 直接上代码: CResultCollectorDlg::PreTranslat ...
- Django基础知识MTV
Django简介 Django是使用Python编写的一个开源Web框架.可以用它来快速搭建一个高性能的网站. Django也是一个MVC框架.但是在Django中,控制器接受用户输入的部分由框架自行 ...
- 【Flask】sqlalchemy 排序
### 排序:1. order_by:可以指定根据这个表中的某个字段进行排序,如果在前面加了一个-,代表的是降序排序.2. 在模型定义的时候指定默认排序:有些时候,不想每次在查询的时候都指定排序的方式 ...
- 20145240 《Java程序设计》第六周学习总结
20145240 <Java程序设计>第六周学习总结 教材学习内容总结 InputStream与OutputStream 10.1.1串流设计的概念 Java将输入/输出抽象化为串流,数据 ...
- java中如何高效判断数组中是否包含某个特定的值
四种不同方式检查数组是否包含某个值 使用List: public static boolean useList(String[] arr, String targetValue) { return A ...
- python-字符串应用
例1:用python程序将DNA的一条链翻译出来s1=’ATTACGGC‘ rule={'A':'T','T':'A','C':'G','G':'C'} s1='ATTACGGC' s2=[rule[ ...
- POJ 3167 Cow Patterns (KMP+前缀和)
题意:给你两串数字,长度分别为n和m,数字大小在[1,25].当后一串数字每个数字的排名位置与前一串数字(任一长度为m的子串)每个数字的排名位置一致时就完全匹配,最后求哪些位置是完全匹配的. 例如:1 ...
- 汇编笔记 RET
assume cs:code,ss:stack stack segment db dup() stack ends code segment mov ax,4c00h int 21h start: m ...
- Codeforces Round #373 (Div. 2) A , B , C
A. Vitya in the Countryside time limit per test 1 second memory limit per test 256 megabytes input s ...