6368. [2019年9月25日】品質アナログNOIP2019ツリー

タイトル

効果の対象に

バイナリツリー、互いに素と言っの各点の先祖をすべて満たしているがあります。
バイナリツリートラバーサル順序は、一つの可能な解決策を減らし、右にポイントを与えられました。


歴史上のものがたり

最初に考えた、当然のことながら、......、その後両側再帰プロセスをルートとして全ての点と相互素数を見つけることである
が、互いに素与えられ、すべての可能ポイントの数を持って、そのようなアプローチは、多くに退化かもしれない......
第1の予備処理\(L_iを\)\(R_iを\)を表す\(Iは\)第1の左及び\(Iは\)位置と右互いに素ではないとされている\(私は\)が互いに素ではないがポイント。
このことは、事前に話すを持っていないだろうか......
(私はそれがほぼ確実にこの事に対処するための正のソリューションとなります推測)
、その後、ファック......である
正の解決策を考える、いわゆる\(O(N ^ 3) \) 間隔\ (DP \) ......
でも、端数の時間の複雑さは思えませんでした......


正解

ゲームの後半では、私は非常に便利な結論を見つけました:
範囲は、このセクションのすべてのサブセクションは、正当なサブツリーになることができ、正当なサブツリーになることができます。
これは......私もいくつかのデータを撮影し......なぜなら、彼らは脳を作るもので、より明白である
(......しかし、私は最後の試合を使用する方法がわからない)
そして、私にYMQ自然に語った:レンジ場合他のすべての点と互いに素数のいずれかを選択し、再帰処理、処理後に見出されない、処理点の全てと別の素数を選択してOKではありません。
私は証明するために戻って夜に思う:
順番に上記の結論は、ということを意味範囲は、それを含むすべての間隔が正当なサブツリーになることができない、正当なサブツリーことができない場合。
この間隔があると仮定すると、\([L、R&LT] \)および前記他のすべての点の素数\(X \)
そうでない場合、処理した後、それがなければならない\([L、X-1 ] \) または\([X + 1、R ] \) 働きません。
従って含む\([Lとx-1 ] \) または\([X + 1、R ] \) すべてのセクションにしませんああ......このセクションも含む天然\([L、R] \ )

次比較的単純で自然なアプローチがあります:ちょうど再帰についてのサブツリーのルートとして、素数や他のポイントを見つけます。明らかに時間の複雑さはある\(O(N ^ 2) \) 。
、一晩寝に戻ると思った\(O(n個の\ LGのN )\) アプローチ:再帰的に発見した後、両側から同時に見ています。これは、と思われる最適化なし、実際には、再帰的に、現在の間隔の長さの半分に等しい未満の複雑さを見ているのと同等。
これは、セル間の再帰として見大きな間隔を探すために続けることができ、それは、細胞再帰の半分未満の全体の長さに等しい間の長さに分割大きな時間複雑インターバル長以内の最後のセクションです。
したがって、唯一の\(O(\ LG N) \) 層。

そして、私はこの問題に対する1つの解決策である見つけ......もう一つのアプローチは、前処理された後に、より強力な\(O(n)の\) 私の最後のヒットは練習である)の。
右端点の一方の鎖の最大値を維持するためにスタックと、スタック深さのトップです。
スタックのトップが設定されている\(Bの\)次のスタックの1という、\(\)
インクリメンタル方式、新しいたびに考えてみましょう\(私は\)場合、中\(R_B \のLeqは、私は\)が、それは確かではないが(どうやらこの時間\(B = I-1 \) )。
その後、\(私は\)を添加し、そのような回転によって、より良い答えを探すことができます。
必要条件で回転可能である\(L_iを<A + 1 \) として\(A + 1 \)以前に\(B \)サブツリー間隔左点)
必要条件及びより好ましくはれるように\(R_iを\ GEQ R_B \)右の息子を意味し、より良い、もちろん、より多くのポイントを追加することができます。
それがルートまたは優れていないようになるまで成功した回転が、それを回転しようとしていることができます。
明らかにこれはツリー全体が合法であることを保証することができます。


コード

OJパンので、私はコードが正しいか分からない......

using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cassert>
//#include <cmath>
#define N 1000010
#define maxA 10000000
inline int input(){
    char ch=getchar();
    while (ch<'0' || ch>'9')
        ch=getchar();
    int x=0;
    do{
        x=x*10+ch-'0';
        ch=getchar();
    }
    while ('0'<=ch && ch<='9');
    return x;
}
int n,a[N];
int p[maxA],np;
int mnp[maxA+10];
int lst[maxA+10];
int L[N],R[N];
int st[N],top;
int fa[N],son[N][2];
int main(){
//  freopen("in.txt","r",stdin);
    freopen("tree.in","r",stdin);
    freopen("tree.out","w",stdout);
    for (int i=2;i<=maxA;++i){
        if (!mnp[i]){
            p[++np]=i;
            mnp[i]=i;
        }
        for (int j=1;j<=np && i*p[j]<=maxA;++j){
            mnp[i*p[j]]=p[j];
            if (!(i%p[j]))
                break;
        }
    }
    n=input();
    for (int i=1;i<=n;++i)
        a[i]=input();
    for (int i=1;i<=n;++i){
        int t=a[i];
        while (t!=1){
            int x=mnp[t];
            L[i]=max(L[i],lst[x]);
            lst[x]=i;
            while (!(t%x))
                t/=x;
        }
    }
    for (int i=1;i<=maxA;++i)
        lst[i]=n+1;
    for (int i=n;i>=1;--i){
        R[i]=n+1;
        int t=a[i];
        while (t!=1){
            int x=mnp[t];
            R[i]=min(R[i],lst[x]);
            lst[x]=i;
            while (!(t%x))
                t/=x;
        }
    }
    st[top=1]=1;
    for (int i=2;i<=n;++i){
        if (R[st[top]]<=i){
            printf("impossible\n");
            return 0;
        }
        while (top && L[i]<st[top-1]+1 && R[i]>=R[st[top]]){
            son[st[top]][1]=son[i][0];
            son[i][0]=st[top];
            top--;
        }
        son[st[top]][1]=i;
        st[++top]=i;
    }
    for (int i=1;i<=n;++i)
        fa[son[i][0]]=fa[son[i][1]]=i;
    for (int i=1;i<=n;++i)
        printf("%d ",fa[i]); 
    return 0;
}

概要

分割統治アプローチの種類の前にルーチンであるべきです。
すなわち\(T(N)= T (X)+ T(NX)+分(X、NX)\) パーティションのこの形態のは、その時間複雑でもある\(O(N \のLGのN )\ の。
実際に、私は......少し木の背後にあるデカルトのようにこのような行為を見つける
。これは、バイナリツリーを構築するプロセスは、チェーンの右端の部分を維持するためにスタックを使用しようとすることを教えてくれる。

おすすめ

転載: www.cnblogs.com/jz-597/p/11593335.html