Codeforcesラウンド#619(DIV 2):B。Motarackの誕生日

Discription
ダークはMotarackの誕生日に出席しようとしています。ダークは、彼がMotarackに与えるために起こっているの贈り物は、n負でない整数の配列aであることを決定しました。

ダーク、1000年前に、その配列を作成したので、その配列内のいくつかの要素が消えました。ダークはMotarackは、それらの間の高い絶対差を持つ2つの隣接する要素を持つ配列を確認するために嫌っていることを知っています。彼は整数k(0≤k≤109)を選択したいとkの配列aの不足しているすべての要素を置き換えるので、彼は多くの時間を持っていません。

ダークkを有するすべての欠落要素を置換した後、アレイA内の(全て1≤i≤n-1について| | AI-aiを1 +の、すなわち最大値)mが全ての隣接する要素間の最大絶対差とします。

Mが最小となるように暗いは、整数kを選択しなければなりません。あなたは彼を助けることはできますか?

入力
入力は、複数のテストケースから構成されています。テストケースの数-最初の行は、単一の整数t(1≤t≤104)を含みます。テストケースの説明は次の通りです。

配列aのサイズ - 各テストケースの最初の行は1個の整数N(2≤n≤105)を含みます。

各テストケースの2行目は、A1、A2、...、(-1≤ai≤109)が含まnは整数。AI場合= -1、その後、i番目の整数がありません。少なくとも1つの整数は、すべてのテストケースに欠けていることが保証されています。

すべてのテストケースのためのnの合計が4⋅105を超えていないことを、保証されています。

出力は、
次の形式で各テストケースのための答えを印刷します:

次の2つの整数、Mの可能な最小値であり、mに等しいアレイにおける隣接する要素間の最大絶対差を行う整数k(0≤k≤109)を印刷すべきです。

kを有するすべての欠落要素を交換した後、隣接する要素間の最大絶対差がMになっていることを確認します。

複数の可能なkが存在する場合、あなたはそれらのいずれかを印刷することができます。

例の
入力

7
5
-1 10 -1 12 -1
5
-1 40 35 -1 35
6
-1 -1 9 -1 3 -1
2
-1 -1
2
0 -1
4
1 -1 3 -1
7
1 -1 7 5 2 -1 5

出力

1 11
5 35
3 6
0 42
0 0
1 2
3 4


11とアレイをすべて欠落要素を交換後の最初のテストケースでは、[11,10,11,12,11]となります。任意の隣接する要素間の絶対差は、任意の隣接する要素間の絶対差が≤0となるように、kの値を選択することは不可能である1です。だから、答えは1です。

6と全て欠落している要素を置換後の第3のテストケースでは、アレイ[6,6,9,6,3,6]になります。

|a1−a2|=|66|=0;
|a2−a3|=|69|=3;
|a3−a4|=|96|=3;
|a4−a5|=|63|=3;
|a5−a6|=|36|=3.

だから、任意の隣接する要素間の最大の差は3です。

質問の意味
非負の束を持って、いくつかの理由のためのいくつかの失われたがあります。すべての数字隣接する二つの数のように教室で同じ数の損失を埋めるために尋ねる間の最小差。
そして、最大の差出力の数を記入してください。

考え
両側充填の平均数を取って、最大差分値-1セットを見つけるの両側に、反復します。
しない左右の数の-1 -1に等しくない場合、記録差が最大値をとります。
最後に、左右の挿入比較の数との差の数との差が、最大値をとります。

ACコード

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define sd(n) scanf("%d", &n)
#define sdd(n, m) scanf("%d%d", &n, &m)
#define sddd(n, m, k) scanf("%d%d%d", &n, &m, &k)
#define sld(n) scanf("%lld", &n)
#define sldd(n, m) scanf("%lld%lld", &n, &m)
#define slddd(n, m, k) scanf("%lld%lld%lld", &n, &m, &k)
#define sf(n) scanf("%lf", &n)
#define sff(n, m) scanf("%lf%lf", &n, &m)
#define sfff(n, m, k) scanf("%lf%lf%lf", &n, &m, &k)
#define pd(n) printf("%d\n", (n))
#define pdd(n, m) printf("%d %d\n", n, m)
#define pld(n) printf("%lld\n", n)
#define pldd(n, m) printf("%lld %lld\n", n, m)
#define rep(i, a, n) for(int i=a; i<=n; i++)
#define per(i, n, a) for(int i=n; i>=a; i--)
 
 
int T;
int n;
int a[100001];
int c,ans;
 
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        sd(n);
        for(int i=1; i<=n; i++)
            sd(a[i]);
        a[0]=-1,a[n+1]=-1,c=0;
        int k=1,tmp=-1,tt=0,q=1,f=-1;
        int l=1e9+1;
        int r=0;
        for(int i=1;i<=n;i++)
        {
            if(a[i]!=-1)
            {
                f=a[i];
                if(a[i+1]!=-1)
                    c=max(abs(a[i+1]-a[i]),c);
                if(a[i-1]!=-1)
                    c=max(abs(a[i]-a[i-1]),c);
                    //continue;
            }
            else
            {
                if(a[i-1]!=-1)
                {
                    l=min(a[i-1],l);
                    r=max(a[i-1],r);
                }
                if(a[i+1]!=-1)
                {
                    l=min(a[i+1],l);
                    r=max(a[i+1],r);
                }
            }
        }
        ans=(l+r+1)/2;
        c=max(abs(r-ans),c);
        c=max(abs(ans-l),c);
        if(f==-1)
        {
            cout<<0<<" "<<42<<endl;
            continue;
        }
        cout<<c<<" "<<ans<<endl;
    }
    return 0;
}
公開された313元の記事 ウォンの賞賛105 ・は 10000 +を見て

おすすめ

転載: blog.csdn.net/weixin_43460224/article/details/104312241