[LOJ 번호 2985. "WC2019"나는 6 월 상점

LOJ 번호 2985. "WC2019"나는 6 월 상점

그것은 요정 테마 아 QAQ의

IQ는 실제로 문제가되지 않습니다 ...... 잤 또는 빅 데이터입니다

우리는 일을 물어 2N의 최대 사용할 수 있습니다

다음에, 두 값 \ (X + Y의 \)\ (A \) 비교

만약 \ (X + Y \ 당량 \) 최소 다음이다 \ (0 \)

경우 \ (X + Y \ GEQ \)은 그 최대 값은 1이고

우리는 비교 \ (X \)(Y \) \의 크기를 전체 숫자의 값을 결정하기 위해 얻어 질 수있다

이다 \ (7N \)

그리고 우리는 선거를 세 개의 숫자를 직접하는 경우 \ (X, Y하는 \ )

(2) 이러한 그 비용 \ (X \ GEQ Y \)

$ 경우 X + Y의 \ 달러 (A $)를 LEQ

그래서 \ (y를 \)는 0이어야합니다

그렇지 않으면, 지금 \ (A \) 시퀀스에 던져 \ (X의 \)가 새로운되기 위해 \ (A \) , \ 합니다 (y 축 \) 새로운되기 위해 \ (X \)

이 경우 우리는이 순서에, 순서에 필요성을 모두이 하나의 이진 값에 의해 증가하는 순서와 밖으로 단일 값을, 나가

그런 다음 우리는 이분법 마지막 제로의 가능한 위치, 또는이 위치를 파악하고 이전 위치는 일련의 뒤에 0을 찾을 수있는 마지막의 위치에 의해, 00 또는 11이 마지막 1 있어야합니다입니다 수 있습니다 그것은 모두 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 ;
}

추천

출처www.cnblogs.com/ivorysi/p/10938491.html