建设基础化学网站的经验,做网站优化两年遇到的SEO常态,三网合一网站怎么做,网站制作教程dw正题
题目链接:https://www.luogu.com.cn/problem/P5208 题目大意
有一个长度为nnn的010101序列aaa#xff0c;你知道里面有奇数个111还是偶数个111。你每次可以选择两个下标集合S/TS/TS/T询问集合SSS和集合TTT位置的数字和哪个更大。
交互库只会告诉你S≤TS\leq TS≤T或者…正题
题目链接:https://www.luogu.com.cn/problem/P5208 题目大意
有一个长度为nnn的010101序列aaa你知道里面有奇数个111还是偶数个111。你每次可以选择两个下标集合S/TS/TS/T询问集合SSS和集合TTT位置的数字和哪个更大。
交互库只会告诉你S≤TS\leq TS≤T或者S≥TS\geq TS≥T。
要求在所有询问集合大小之和不超过 500100500100500100 的情况下得到整个aaa序列。
1≤n≤1051\leq n\leq 10^51≤n≤105 解题思路
注意到数据中有一个点保证了aaa序列单调我们先假设为单调不升。
此时有a11a_11a11那么我们考虑二分对于一个位置midmidmid我们判是否amidamid1≤1a_{mid}a_{mid1}\leq 1amidamid1≤1如果是那么说明amid10a_{mid1}0amid10否则amidamid1≥1a_{mid}a_{mid1}\geq 1amidamid1≥1就说明了amid1a_{mid}1amid1。
这样我们同样每次能过缩小一半但是最后会剩下两个数字我们用奇偶性去判断。
那么对于一般的情况我们考虑也去构造一个单调不升的序列两个数字比不出东西我们考虑拿三个数字去比较假设我们现在有一个a≤ba\leq ba≤b。
我们拿ababab和ccc去比较
若ab≤cab\leq cab≤c那么有a0a0a0。若ab≥cab\geq cab≥c那么有b≥cb\geq cb≥c我们把bbb加入队列这样加入队列的都是单调不升的。 code
#includecstdio
#includecstring
#includealgorithm
using namespace std;
const int N1e510;
int p[N],A[2],B[2];
int query(int *S,int nS,int *T,int nT);
void find_price(int task_id, int n, int k, int ans[]) {if(n1){ans[0]1;return;}if(task_id3||n2){A[0]0;B[0]n-1;if(!query(A,1,B,1))for(int i1;in;i)p[i]i-1;else for(int i1;in;i)p[i]n-i;int l1,rn-1;while(lr){int mid(lr1)1;A[0]p[mid];A[1]p[mid1];B[0]p[1];if(query(A,2,B,1))rmid-1;else lmid;}ans[p[l1]](l1)^k;for(int i1;il;i)ans[p[i]]1;}else{int x0,y1,tot0;for(int i2;in;i){int zi;A[0]y;B[0]z;//yzif(query(A,1,B,1))swap(y,z);A[0]x;B[0]y;B[1]z;if(query(A,1,B,2)){p[tot]x;xy;yz;}else ans[z]0;}A[0]x;B[0]y;if(query(A,1,B,1))p[tot]y;else p[tot]x,swap(x,y);for(int i1;itot-i1;i)swap(p[i],p[tot-i1]);int l1,rtot-1;while(lr){int mid(lr1)1;A[0]p[mid];A[1]p[mid1];B[0]p[1];if(query(A,2,B,1))rmid-1;else lmid;}for(int i1;il;i)ans[p[i]]1;yp[l1];A[0]x;B[0]y;//xyif(query(A,1,B,1))swap(x,y);A[0]x;A[1]y;B[0]p[1];if(query(A,2,B,1))ans[y]0;else ans[x]1,l,xy;ans[x](l1)^k;}return;
}