zoukankan      html  css  js  c++  java
  • 【LOJ】#2569. 「APIO2016」最大差分

    题解

    第一个子任务直接询问最大最小,每次可以问出来两个,再最大最小-1再问两个,最多问(frac{N + 1}{2})次就还原出了序列

    第二个子任务由于差分肯定会大于等于(lceil frac{mx - mn}{N - 1} ceil)
    那么我们直接把序列最大最小按照这个值分块,只用两个块之间的差分大小来更新答案

    代码

    #include <bits/stdc++.h>
    #define fi first
    #define se second
    #define pii pair<int,int>
    #define pdi pair<db,int>
    #define mp make_pair
    #define pb push_back
    #define enter putchar('
    ')
    #define space putchar(' ')
    #define eps 1e-8
    #define mo 974711
    #define MAXN 1000005
    //#define ivorysi
    using namespace std;
    typedef long long int64;
    typedef double db;
    template<class T>
    void read(T &res) {
        res = 0;char c = getchar();T f = 1;
        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);
    }
    void MinMax(int64 s,int64 t,int64 &mn,int64 &mx) {
        putchar('?');space;out(s);space;out(t);enter;
        fflush(stdout);
        read(mn);read(mx);
    }
    int64 inf = 1e18;
    int64 findGap(int T,int N) {
        int64 mn,mx;
        int64 ans = 0;
        if(T == 1) {
    	MinMax(0,inf,mn,mx);
    	int64 ls = mn,lt = mx;
    	for(int i = 1 ; i <= (N + 1) / 2 - 1 ; ++i) {
    	    if(ls + 1 > lt - 1) break;
    	    MinMax(ls + 1,lt - 1,mn,mx);
    	    if(mn == -1) break;
    	    ans = max(mn - ls,ans);
    	    ans = max(lt - mx,ans);
    	    ls = mn,lt = mx;
    	}
    	ans = max(ans,lt - ls);
        }
        else {
    	MinMax(0,inf,mn,mx);
    	int64 len = (mx - mn - 1) / (N - 1) + 1;
    	int64 a = mn,m2 = mx;
    	int64 pre = mn;
    	ans = len;
    	for(int i = 1 ; i <= N - 1 ; ++i) {
    	    int64 b;
    	    b = min(a + len,m2);
    	    MinMax(a,b,mn,mx);
    	    if(mn != -1) {
    		ans = max(ans,mn - pre);
    		pre = mx;
    	    }
    	    if(a > m2 - len - 1) break;
    	    a = a + len + 1;
    	}
        }
        return ans;
    }
    int main() {
    #ifdef ivorysi
        freopen("f1.in","r",stdin);
    #endif
        int T,N;
        read(T);read(N);
        int64 x = findGap(T,N);
        putchar('!');space;out(x);enter;fflush(stdout);
        return 0;
    }
    
  • 相关阅读:
    [luoguP2221] [HAOI2012]高速公路(线段树)
    SICP:对数步数内迭代计算幂的函数
    python__tkinter之listbox&button
    C陷阱与缺陷 之 各种知识技巧
    ACM && Find Minimum in Rotated Sorted Array
    windows编程一些小知识
    Linux_C pthread 关于多线程一个简单的程序
    ACM&贪心算法
    Linux_C socket 数据报之client, server.c
    Linux_C socket 数据报之一些辅助函数
  • 原文地址:https://www.cnblogs.com/ivorysi/p/10130541.html
Copyright © 2011-2022 走看看