一道很神仙的題啊QAQc++
竟然是智商題……不是亂搞或者是大數據大數據
咱們能夠用2N問出一個最大值是1spa
而後對於任意兩個值$x + y$和$a$比較code
若是$x + y \leq a$,那麼其中的最小值是$0$get
若是$x + y \geq a$那麼其中的最大值是1it
咱們比較$x$和$y$的大小,總能夠獲得一個數的肯定值class
這是$7N$的數據
而若是咱們直接選三個數$x,y,a$db
用2的代價使得$x \geq y$make
若是$x + y \leq a $
那麼$y$必然是0
不然把如今$a$扔進一個序列裏,$x$成爲新的$a$,$y$成爲新的$x$
這樣的話咱們會獲得一個遞增序列和一個單出來的值,經過二分把這個單出來的值塞進序列裏,全部的1必然都在這個序列裏
那麼咱們能夠二分,找準可能的最後一個0的位置,要麼這個位置和它的前一個位置是00,要麼就是11,最後一位必然是1,經過這個找到最後一個0的位置,序列後面的就都是1了
#include "shop.h" #include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define eps 1e-10 #define MAXN 100005 #define ba 47 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 +c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) { out(x / 10); } putchar('0' + x % 10); } vector<int> line,possible; int S[5],T[5],k,res[MAXN]; int cmp(int a,int b) {// return a >= b S[0] = b;T[0] = a; return query(S,1,T,1); } void Binary() { possible.clear(); for(int i = -1 ; i < (int)line.size() - 1 ; i++) { int t = (line.size() - i - 1) ^ k ^ 1; if(t & 1) possible.pb(i); } int l = 0,r = possible.size() - 1; while(l < r) { int mid = (l + r + 1) >> 1; int x = possible[mid]; S[0] = line[x];S[1] = line[x - 1];T[0] = line.back(); if(query(S,2,T,1)) l = mid; else r = mid - 1; } int x = possible[l]; for(int i = x + 1 ; i < line.size() ; ++i) res[line[i]] = 1; } void find_price(int task_id, int N, int K, int ans[]) { memset(res,0,sizeof(res)); k = K; if(N == 1) {ans[0] = 1;return;} line.clear(); if(task_id == 3) { if(cmp(N - 1,0)) { for(int i = 0 ; i < N ; ++i) line.pb(i); } else { for(int i = N - 1 ; i >= 0 ; --i) line.pb(i); } } else { int a = 0,x = 1,y; for(int i = 2 ; i < N ; ++i) { y = i; if(cmp(y,x)) swap(y,x); S[0] = x;S[1] = y;T[0] = a; if(query(S,2,T,1)) {//x + y <= a } else { line.pb(a); a = x;x = y; } } line.pb(a); int l = 0,r = line.size() - 1; if(cmp(x,line[r])) line.pb(x); else { while(l < r) { int mid = (l + r) >> 1; if(cmp(line[mid],x)) r = mid; else l = mid + 1; } line.insert(line.begin() + l,x); } } Binary(); for(int i = 0 ; i < N ; ++i) { ans[i] = res[i]; } return ; }