传送门

搬题解QwQ

首先最大值一定为 \(1\),直接扫一遍两两比较 \(O(2N)\) 求出最大值

设最大值位置为 \(a\),对于任意两个没有确定的位置 \(x,y\)

询问 \([a,x+y]\),如果 \(a\le x+y\) 那么 \(x,y\) 的最大值为 \(1\),否则 \(x,y\) 最小值为 \(0\)

再询问 \([x,y]\) 即可

复杂度 \(O(7N)\)

考虑 \(Task3\),首先花费 \(2\) 的代价找到端点的 \(1\)

假设序列为 \(00000....11111\),只需要找到最靠前的位置 \(x\),使得 \(x+(x+1)\ge 1\),二分即可

然后 \(\ge x+1\) 的位置都是 \(1\),\(< x\) 的位置都是 \(0\),利用奇偶性判断 \(x\) 是否为 \(1\)

再考虑 \(Task6\),猜想复杂度为 \(5N+3logN\) 左右

任取三个没有确定的位置 \(x,y,a\),询问 \([x+y,a]\),再花费 \(2\) 的代价确定 \(x\le y\) 或者 \(y\ge x\)

假设 \(x\le y\)

如果 \(x+y\le a\),那么 \(x=0\)

否则 \(y\ge a\),把 \(y\) 当成新的 \(a\) 继续做

最后可以得到一个不确定的位置 \(z\) 和一条递增的链 \(x_1...x_k\),其它的都是 \(0\)

\(max(z,x_k)\) 一定为 \(1\),那么可以直接用 \(Task3\) 的方法二分

最后利用常数的代价 \(+\) 奇偶性求出 \(z\) 和二分中不确定的位置

# include "shop.h"
# include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int maxn(1e5 + 5); int tmp1[2], tmp2[2], que[maxn], cnt, st[maxn], tp; inline int Query1(int x, int y) {
tmp1[0] = x, tmp2[0] = y;
return query(tmp1, 1, tmp2, 1);
} inline int Query2(int x, int y, int z) {
tmp1[0] = x, tmp1[1] = y, tmp2[0] = z;
return query(tmp1, 2, tmp2, 1);
} inline int Binary(int n, int k, int *ans) {
int i, l, r, mid, ret, v;
l = 0, ret = n - 1, r = n - 2;
while (l <= r) {
mid = (l + r) >> 1;
if (!Query2(que[mid], que[mid + 1], que[n - 1])) ret = mid, r = mid - 1;
else l = mid + 1;
}
v = ret;
if (((n - ret) & 1) ^ k) ++ret;
for (i = 0; i < ret; ++i) ans[que[i]] = 0;
for (i = ret; i < n; ++i) ans[que[i]] = 1;
return v;
} void find_price(int task_id, int n, int k, int ans[]) {
int i, mx = 0, ret;
for (i = 0; i < n; ++i) ans[i] = 0;
if (task_id == 3) {
for (i = 0; i < n; ++i) que[i] = i;
if (!Query1(0, n - 1)) reverse(que, que + n);
Binary(n, k, ans);
}
/* times = 7N
else {
for (i = 1; i < n; ++i) if (Query1(mx, i)) mx = i;
ans[mx] = 1, cnt = 0, k ^= 1;
for (i = 0; i < n; ++i) if (i ^ mx) que[++cnt] = i;
while (cnt > 1) {
if (Query2(que[cnt], que[cnt - 1], mx)) {
if (!Query1(que[cnt], que[cnt - 1])) swap(que[cnt], que[cnt - 1]);
ans[que[cnt]] = 0;
}
else {
if (Query1(que[cnt], que[cnt - 1])) swap(que[cnt], que[cnt - 1]);
ans[que[cnt]] = 1, k ^= 1;
}
--cnt;
}
if (k && cnt) ans[que[1]] = 1;
}
*/
else {
if (n == 1) {
ans[0] = 1;
return;
}
if (n == 2) {
mx = Query1(0, 1) ? 1 : 0;
ans[mx] = 1;
if (!k) ans[mx ^ 1] = 1;
return;
}
st[0] = cnt = 0, tp = 1;
for (i = 1; i < n; ++i) que[++cnt] = i;
while (cnt > 1) {
if (Query2(que[cnt], que[cnt - 1], st[tp - 1])) {
if (!Query1(que[cnt], que[cnt - 1])) swap(que[cnt], que[cnt - 1]);
ans[que[cnt]] = 0;
}
else {
if (Query1(que[cnt], que[cnt - 1])) swap(que[cnt], que[cnt - 1]);
st[tp++] = que[cnt];
}
--cnt;
}
if (Query1(que[cnt], st[tp - 1])) {
ans[st[tp - 1]] = 1, mx = que[cnt], cnt = 0;
for (i = 0; i < tp; ++i) que[cnt++] = st[i];
ret = Binary(cnt, k, ans);
k ^= (cnt - ret - 1) & 1, ret = que[ret];
if (Query2(ret, mx, st[tp - 1])) {
if (!Query1(ret, mx)) swap(ret, mx);
ans[ret] = 0;
}
else {
if (Query1(ret, mx)) swap(ret, mx);
ans[ret] = 1, k ^= 1;
}
ans[mx] = k;
}
else {
ans[que[cnt]] = 1, st[tp++] = que[cnt], cnt = 0;
for (i = 0; i < tp; ++i) que[cnt++] = st[i];
Binary(cnt, k, ans);
}
}
}

LOJ #2985. 「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#2983. 「WC2019」数树

    传送门 抄题解 \(Task0\),随便做一下,设 \(cnt\) 为相同的边的个数,输出 \(y^{n-cnt}\) \(Task1\),给定其中一棵树 设初始答案为 \(y^n\),首先可以发现, ...

  4. LOJ#2983. 「WC2019」数树 排列组合,生成函数,多项式,FFT

    原文链接www.cnblogs.com/zhouzhendong/p/LOJ2983.html 前言 我怎么什么都不会?贺忙指导博客才会做. 题解 我们分三个子问题考虑. 子问题0 将红蓝共有的边连接 ...

  5. 【LOJ】#2983. 「WC2019」数树

    LOJ2983. 「WC2019」数树 task0 有\(i\)条边一样答案就是\(y^{n - i}\) task1 这里有个避免容斥的方法,如果有\(i\)条边重复我们要算的是\(y^{n - i ...

  6. loj3161「NOI2019」I 君的探险(随机化,整体二分)

    loj3161「NOI2019」I 君的探险(随机化,整体二分) loj Luogu 题解时间 对于 $ N \le 500 $ 的点,毫无疑问可以直接 $ O(n^2) $ 暴力询问解决. 考虑看起 ...

  7. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  8. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  9. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

随机推荐

  1. java在编译期和运行期都做了什么

    Java对象内存存储,引用传递,值传递详细图解 java对象在内存中的分配 编译过程: 编译器把一种语言规范转化为另一种语言规范的这个过程需要哪些步骤?回答这个问题需要参照<编译原理>,总 ...

  2. 【NOIP2017】逛公园 最短路+DP

    诶,去年场上不会处理$0$的环,只拿了$60$有点可惜. 我们先不管边边权为$0$的边. 我们先跑一次最短路,令$dis[u]$表示从$1$至$u$的最短路的长度. 那么根据题目的要求,从起点走到$u ...

  3. POJ 1154

    #include<iostream> #include<stdio.h> #define MAXN 20 using namespace std; int DFS(int i, ...

  4. linux 从0开始

    网络配置: http://blog.51yip.com/linux/1120.html 网络配置为自动获取 vi命令参考: http://c.biancheng.net/cpp/html/2735.h ...

  5. VUE之文字跑马灯效果

    VUE之文字跑马灯效果 1.效果演示 2.相关代码 <!DOCTYPE html> <html lang="en"> <head> <me ...

  6. Android 开发工具类 02_DensityUtils

    常用单位转换的辅助类: 1.dp 转 px: 2.sp 转 px: 3.px 转 dp: 4.px 转 sp. import android.content.Context; import andro ...

  7. C/C++ -- Gui编程 -- Qt库的使用 -- 使用.ui文件

    1.创建Qt空工程 2.添加Qt设计师界面,无按钮对话框helloqt.ui 3.编辑界面,添加部件,修改对话框对象名为HelloQt <?xml version="1.0" ...

  8. Chapter 3 Phenomenon——6

    A low oath made me aware that someone was with me, and the voice was impossible not to recognize. 某人 ...

  9. CentOS7安装SaltStack的踩坑经历

    虚拟机镜像:centOS7 minion 版本 软件版本: salt-master-2017.7.2-1.el7.noarchsalt-minion-2017.7.2-1.el7.noarchsalt ...

  10. 机器学习--Gradient Boosting Machine(GBM)调参方法详解

    一.GBM参数 总的来说GBM的参数可以被归为三类: 树参数:调节模型中每个决策树的性质 Boosting参数:调节模型中boosting的操作 其他模型参数:调节模型总体的各项运作 1.树参数 现在 ...