8.3概要

8.3概要

スコア

0 + 45 + 50

スリル

8:30私は250ポイントを得ることができ見積もり

10:30私はゼロに破裂すると思います

最初に私はそれがT1T3を行うだろうと思いました

結果は、再生するために出てきません。

しかし、試合後に最も簡単でT2で見つかりました

実際には、T1の暴力を生きることができます

T1

chnlich私は三国志のゲームをプレイするのが大好き、と戦略の驚きのいくつかを使用するようにしたいです。今、彼は世界を征服するために旅を開始したいと考えています。彼の敵の都市NとNの知事、N N都市は2次元平面上の点とみなすことができます。Nの都市は0,1,2、......、N-1の番号が付け。i番目の都市の座標は、(XI、李)紫の値の都市知事を保護する能力です。

各時間chnlichは側面が矩形領域の軸に平行な選択、及びK小都市の前記驚き県能力値(都市及び驚き後に依然として県)。

しかし、彼の敵は、多くの場合、密かにchnlich見つかった弱点を防ぐために、知事2都市を交換します。

さて、chnlichは毎回驚きを重視する彼の敵の能力を知りたいと思いました。

データの100%に、N <= 60000、M <= 10000,0 <=西、李、紫<= 10 ^ 9、K <= ^ 9 10、すべての操作が有効であることを確実にします。

時間制限:10000ミリ秒

詐欺のタイトル

NMは生きることができます

プレスZ-順序は、矩形内のk番目の都市が答えです見つけるために、それぞれを頼みます

T2

Nレベルがありますが、最初のQマニアがあります。各チェックポイントを通じて、uがポイントと1人の生命、およびQ.の生活の制限を取得します 前記U =分(連続最後オフ通過の数、R)。

あなたがこのレベルに合格しない場合は、1人の命を失い、そして次のレベルに移動します。いかなる生命か挑戦レベルではないがない場合、ゲームオーバーであり、得られたスコアは、各レベルで得られたスコアの合計です。

chnlichは長い時間のためにこのゲームをプレイしないので、各レベルを介して各人生の確率は、原chnlich最高スコア記録はS. P(0 <= p <= 1)であるれています さて、以前の最高スコアより多くを得ることを期待することができchnlich合計スコアで、pは少なくとも同じくらいのとき、私は、知りたいchnlich。

データの100%に、N <= 10 ^ 8,1 <= R <= 20,1 <= Q <= 5、すなわちS確保することが可能スコアです。

乗算トルク付与半分

式は、
I + 1] \ [F [ \\ I [F; [分(J + 1、Q)] [分(K + 1、R)] + = F [I] [J] [K] * P +1] [J-1] [ 0] + = F [I] [J] [K] *(1-P); \\ ANS + = F [I] [J] [K] * P *(MIN( K + 1、R))は、
\] 最初に私は、ANSは、実際には、瞬間を取ることができないと考えた可能性

T3

Nインテリジェンスステーション、番号1,2,3、...、NにB国と国、各ステーションは、座標情報(XI、李)を有しています。しかし、スタッフが各情報ステーションは、爆弾に埋葬されたその国のAを、発見しました!

これらの爆弾は限り同時に3つの爆弾はそれらを解体として、非常に特別で、すべての爆弾が爆発しません。各ステーションの連絡先情報は、コストがかかりますので、爆弾は爆弾のすべての二つの間のマンハッタン距離の合計対価を取り解体。全国のコマンド当局は今、あなたを見つける最高の価格と必要な場合があります最小のコストを知ってほしいです。

^ 8データの100%に、N <= 100000、0 <=西、李<= 10

XmaxのXがXは、2つの点の大きい点の座標座標を表すように、まず、2点の選択限り場合を考える、Xminとは、
Xの2点は、Xが小さい点、値Ymax、Yminとの共感の座標座標を表します。そして、答えはある
のXmax-Xminと+ Ymaxの-Yminと。私たちは、最初の最大値を計算します。明らかに限り、私たちが作ることを選択すると、最大の分布を考慮して
のXmax + Ymaxと、-Xmin-Yminと、 Xmaxの-Yminと、-Xmin + Ymaxの暴力にこれら4点の最大表現。
そして、最小値を計算します。かかわらず、2点の位置がXminと= Xmaxの又は値Ymin = Ymaxのこれらの両極端の
2つだけ(左下、左上)、対称である、我々は唯一の場合を考えます。第二の点への最初の点はで左
以下の例。次いで、第1の点座標(Xminと、Yminの)。明らかに、我々は、X> Xminとし、Y> Yminを探している
と、X + Yの最小ポイント。我々は降順にX軸を列挙できることを確認X> Xminと、Y軸はライン維持座標
セグメントツリー、記録間隔X + Y、ツリー内の各点でのクエリ[Yminの限り線分の最小値を+ X + Y最小∞)である
値、回答を更新し、挿入ポイント(Xminと、Yminの)へ。時間複雑性O(NlogN)。
次に、3点の場合を考えます。私たちは、物質と3タップまたは2間のマンハッタン距離を考えます。描画することにより、
簡単には、本当の問題は、最小の長方形の周囲を、含めることができる3つのポイントを見つけることであることを確認するために、すなわち、
2 *(Xmaxの-Xminと+ Ymaxの -Ymin)、 限り、我々は最大限とのXmax-Xminとを最小限に抑えるよう+ YmaxとYminの-ができます。
これら4つの未知数を考慮し、明らかに、点は、一つXと一つY未知の未知数、回答の組成の最大値を決定してもよいです
2例が存在することができる:
①XとYを定義する点、他の2点がXおよびYによって識別されます
②XとYを決定する点が、他の点もXとYが同定され、点が
何も決定されていない(ただし、この時点で存在しなければならないが)。
私たちは、これらの2つの場合を考えます。最大値を考えてみましょう。明らかに、最大の決定である点
をXmax + Ymaxと、-Xmin + Ymaxと、 -Xmin-Yminと、Xmaxの-Yminとを、 8 Xminと、をXmax、Yminと、Ymaxとの最大で
3つの選択された点は、これだけ選択しますこれらの値は、最大のポイントに暴力的になることができます。
そして、最小値を検討してください。最初のケース①を考えます。左上のX及びYで決定された点を仮定する(すなわち、3点の点
+ Ymaxとの-Xmin最小)、他の2点が(Xmaxと、Y)と(X、値Ymin)としました。我々は、ツリーラインを維持
iは各点の列挙として左上隅の下方から上方に電源を入れたとき、我々はすべてのツリーライン保守使用し、最初にXを維持し
(X、Yminの)ノードの最大値Xmaxの-Yminとを。各時間点の列挙は、まず問い合わせそれ(Xminと、+∞)の
、最小更新応答をXmax、Yminの、及びは(-∞、Xminと)で可能Xmaxのツリーラインとして更新
をXmax、Yminと、可能なセグメントツリーは、この時点で最大Y値を更新YMINのように自分を置く、我々は完璧にできる
状況①、O(NlogN)の時間複雑に取り組みます。
②のケースでは、ポイントの中央を列挙し、次に最も近いノードを計算し、これは2〜4個の方向のある
最近のマンハッタン距離を決定する状況。2つの対角線方向とアップデートと回答への最も近い点までの距離を計算します。時間計算
学位はまだO(NlogN)です。
この問題は、複雑さは依然としてO(NlogN)である時間を解決するために分割を使用してアルゴリズムを征服することができます。

よる爆弾解決レポート.PDF

小さなミスがたくさん~~あります。

注意が必要ないくつかの領域があります。

  1. 回転の全体のポイントは、ポイント(x、y)は(-y、X)となります
  2. 状況①アドレッシング、時間の単一のポイントが答えを更新することはできません更新し、コードを参照してください
  3. ②の場合は、一致する点は、ダブルカウントを防ぐために、我々は方向点を使用し1〜I-1 iの点の対角線方向で、更新されたI + 1 iの更新されたn〜
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 1000000000
using namespace std;

struct kk
{
    int x,y,rank;
};

struct qy
{
    int x,y,ans,tag,ans2;
};

int n,i,j,k,ans1,ans2,fx;
kk a[100005],b[100005];
int t1[100005],t2[100005];
qy tree[400005],treee[400005];
int sel[9];
int mi[5][100005];

int find1(int x)
{
    int l=1,r=t1[0],mid=(l+r)/2;
    while (l<r)
    {
        if (t1[mid]<x) l=mid+1;
        else r=mid;
        mid=(l+r)/2;
    }
    return mid;
}

int find2(int x)
{
    int l=1,r=t2[0],mid=(l+r)/2;
    while (l<r)
    {
        if (t2[mid]<x) l=mid+1;
        else r=mid;
        mid=(l+r)/2;
    }
    return mid;
}

int comp(kk a,kk b)
{
    return ((a.x>b.x)||((a.x==b.x)&&(a.y>b.y)));
}

void clear(int k,int l,int r)
{
    tree[k].x=tree[k].y=tree[k].tag=INF;
    tree[k].ans=INF;
    if (l!=r)
    {
        int mid=(l+r)/2;
        clear(k*2,l,mid);
        clear(k*2+1,mid+1,r);
    }
}

void clear2(int k,int l,int r)
{
    treee[k].x=treee[k].y=treee[k].tag=INF;
    treee[k].ans=INF;
    treee[k].ans2=-INF;
    if (l!=r)
    {
        int mid=(l+r)/2;
        clear2(k*2,l,mid);
        clear2(k*2+1,mid+1,r);
    }
}

void pushdown(int k,int l,int r)
{
    if (l!=r)
    {
        tree[k*2].ans=min(tree[k*2].ans,tree[k*2].x+tree[k].tag);
        tree[k*2].tag=min(tree[k*2].tag,tree[k].tag);
        tree[k*2+1].ans=min(tree[k*2+1].ans,tree[k*2+1].x+tree[k].tag);
        tree[k*2+1].tag=min(tree[k*2+1].tag,tree[k].tag);
    }
    tree[k].tag=INF;
}

void update(int k,int l,int r)
{
    tree[k].x=min(tree[k*2].x,tree[k*2+1].x);
    tree[k].y=min(tree[k*2].y,tree[k*2+1].y);
    tree[k].ans=min(tree[k*2].ans,tree[k*2+1].ans);
}

int query(int k,int l,int r,int x,int y)
{
    pushdown(k,l,r);
    if ((l<=y)&&(r>=x))
    {
        if ((l>=x)&&(r<=y))
        {
            return tree[k].ans;
        }
        int mid=(l+r)/2;
        return min(query(k*2,l,mid,x,y),query(k*2+1,mid+1,r,x,y));
    }
    return INF;
}

int query2(int k,int l,int r,int x,int y)
{
    if ((l<=y)&&(r>=x))
    {
        if ((l>=x)&&(r<=y))
        {
            return treee[k].ans;
        }
        int mid=(l+r)/2;
        return min(query2(k*2,l,mid,x,y),query2(k*2+1,mid+1,r,x,y));
    }
    return INF;
}

int query3(int k,int l,int r,int x,int y)
{
    if ((l<=y)&&(r>=x))
    {
        if ((l>=x)&&(r<=y))
        {
            return treee[k].ans2;
        }
        int mid=(l+r)/2;
        return max(query3(k*2,l,mid,x,y),query3(k*2+1,mid+1,r,x,y));
    }
    return -INF;
}

void modify1(int k,int l,int r,int x,int y)
{
    pushdown(k,l,r);
    if (l==r)
    {
        tree[k].x=min(tree[k].x,y);
    }
    else
    {
        int mid=(l+r)/2;
        if (x<=mid)
            modify1(k*2,l,mid,x,y);
        else
            modify1(k*2+1,mid+1,r,x,y);
        tree[k].x=min(tree[k*2].x,tree[k*2+1].x);//这里不能更新ans,因为旧的y都在x右边 
    }
}

void modify2(int k,int l,int r,int x,int y,int z)
{
    pushdown(k,l,r);
    if ((l<=y)&&(r>=x))
    {
        if ((l>=x)&&(r<=y))
        {
            tree[k].ans=min(tree[k].ans,tree[k].x+z);//必须这样打,因为是用这个z跟以前的x匹配 
            tree[k].tag=min(tree[k].tag,z);
            return;
        }
        int mid=(l+r)/2;
        modify2(k*2,l,mid,x,y,z);
        modify2(k*2+1,mid+1,r,x,y,z);
        update(k,l,r);
    }
}

void modify3(int k,int l,int r,int x,int y)
{
    if (l==r)
    {
        treee[k].ans=min(treee[k].ans,y);
        treee[k].ans2=max(treee[k].ans2,y);
    }
    else
    {
        int mid=(l+r)/2;
        if (x<=mid)
            modify3(k*2,l,mid,x,y);
        else
            modify3(k*2+1,mid+1,r,x,y);
        treee[k].ans=min(treee[k*2].ans,treee[k*2+1].ans);
        treee[k].ans2=max(treee[k*2].ans2,treee[k*2+1].ans2);
    }
}

void does()
{
    int i,j,s1,s2;
    for (i=1;i<=n;i++) b[i].rank=i;
    t1[0]=0;
    for (i=1;i<=n;i++)
        t1[++t1[0]]=a[i].x;
    sort(t1+1,t1+1+t1[0]);
    for (i=1;i<=n;i++)
        b[i].x=find1(a[i].x);
    t2[0]=0;
    for (i=1;i<=n;i++)
        t2[++t2[0]]=a[i].y;
    sort(t2+1,t2+1+t2[0]);
    for (i=1;i<=n;i++)
        b[i].y=find2(a[i].y);
    sort(b+1,b+1+n,comp);
    
    clear(1,1,n);
    for (i=1;i<=n;i++)
    {
        s1=query(1,1,n,b[i].y,n);
        ans2=min(ans2,s1-t1[b[i].x]-t2[b[i].y]);
        modify1(1,1,n,b[i].y,t1[b[i].x]);
        modify2(1,1,n,1,b[i].y-1,t2[b[i].y]);
    }   
}

void does2()
{
    for (i=1;i<=n;i++) b[i].rank=i;
    t1[0]=0;
    for (i=1;i<=n;i++)
        t1[++t1[0]]=a[i].x;
    sort(t1+1,t1+1+t1[0]);
    for (i=1;i<=n;i++)
        b[i].x=find1(a[i].x);
    t2[0]=0;
    for (i=1;i<=n;i++)
        t2[++t2[0]]=a[i].y;
    sort(t2+1,t2+1+t2[0]);
    for (i=1;i<=n;i++)
        b[i].y=find2(a[i].y);
    sort(b+1,b+1+n,comp);
    
    clear2(1,1,n);
    fx++;
    for (i=1;i<=n;i++)
    {
        mi[fx][b[i].rank]=query2(1,1,n,b[i].y,n)-t1[b[i].x]-t2[b[i].y];
        modify3(1,1,n,b[i].y,t1[b[i].x]+t2[b[i].y]);
    }
    clear2(1,1,n);
    fx++;
    for (i=n;i>=1;i--)
    {
        mi[fx][b[i].rank]=t1[b[i].x]+t2[b[i].y]-query3(1,1,n,1,b[i].y);
        modify3(1,1,n,b[i].y,t1[b[i].x]+t2[b[i].y]);
    }
}

int js(int x,int y,int z)
{
    return (max(max(a[x].x,a[y].x),a[z].x)-min(min(a[x].x,a[y].x),a[z].x)+max(max(a[x].y,a[y].y),a[z].y)-min(min(a[x].y,a[y].y),a[z].y));
}

int main()
{
    freopen("read.in","r",stdin);
    ans1=0;
    ans2=100000000;
    scanf("%d",&n);
    for (i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i].x,&a[i].y);
    }
    for (i=1;i<=8;i++)
    sel[i]=1;
    for (i=1;i<=n;i++)
    {
        if (a[sel[1]].x+a[sel[1]].y<a[i].x+a[i].y) sel[1]=i;
        if (a[sel[2]].x-a[sel[2]].y<a[i].x-a[i].y) sel[2]=i;
        if (-a[sel[3]].x+a[sel[3]].y<-a[i].x+a[i].y) sel[3]=i;
        if (-a[sel[4]].x-a[sel[4]].y<-a[i].x-a[i].y) sel[4]=i;
        if (a[sel[5]].x<a[i].x) sel[5]=i;
        if (-a[sel[6]].x<-a[i].x) sel[6]=i;
        if (a[sel[7]].y<a[i].y) sel[7]=i;
        if (-a[sel[8]].y<-a[i].y) sel[8]=i;
    }
    for (i=1;i<=8;i++)
    {
        for (j=i+1;j<=8;j++)
        {
            for (k=j+1;k<=8;k++)
            {
                if ((sel[i]!=sel[j])&&(sel[i]!=sel[k])&&(sel[j]!=sel[k]))
                ans1=max(ans1,js(sel[i],sel[j],sel[k]));
            }
        }
    }
    does();
    for (i=1;i<=n;i++)
    {
        swap(a[i].x,a[i].y);
        a[i].x=-a[i].x;
    }
    does();
    for (i=1;i<=n;i++)
    {
        swap(a[i].x,a[i].y);
        a[i].x=-a[i].x;
    }
    does();
    for (i=1;i<=n;i++)
    {
        swap(a[i].x,a[i].y);
        a[i].x=-a[i].x;
    }
    does();
    for (i=1;i<=n;i++)
    {
        swap(a[i].x,a[i].y);
        a[i].x=-a[i].x;
    }
    does2();
    for (i=1;i<=n;i++)
    {
        swap(a[i].x,a[i].y);
        a[i].x=-a[i].x;
    }
    does2();
    for (i=1;i<=n;i++)
    {
        ans2=min(ans2,mi[1][i]+mi[2][i]);
        ans2=min(ans2,mi[3][i]+mi[4][i]);
        if (ans2==0)
        {
            ans2=ans2;
        }
    }
    printf("%d\n%d",ans1*2,ans2*2);
    
}

醜い死にました

おすすめ

転載: www.cnblogs.com/leason-lyx/p/11293740.html