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

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

一道很神仙的題啊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 ;
}
相關文章
相關標籤/搜索