[試験室] 11.4

[試験室] 11.4

数日間ssw02クッション

ようこそ転載するssw02のブログ:https://www.cnblogs.com/ssw02/p/11794181.html


代数

妖精T1は、利害関係者は、次のHEOI-ドードーのブログに行くことができます。

デコレーション

彼は今、問題を切り出す必要があると言ってデコ。

O

正の整数nの最初の行。
次ラインnは1または正の整数、i番目Fiの+ 1。
次のライン数n、i番目の0は、リンXiansen iはi番目の場合ライトは、オフにされるドット希望を示す場合
数がリンXiansen望ましいライトがオンになっているIドットで表されます。
出力ラインはLinxianセンの最小値を表す整数は、彼が木を見に期待することを確認するために数秒かかります。

アイデア

Nが小さいので、圧力を形成すると考えられます。任意のアイデアなので、まったく、そのDPを検討してください。(Lwq:DP状の圧力に関係なく家族の関係なく、どのようなN ^ TMの)

アカウントに一つのことを考えると、林氏は、ポイントをアクティブ(ないMC)した後、次の第二に、それをオフにすることができ、時間がNを超えることはありません (あなたは出力N + -rand()のポイントをカンニングすることができます)。

私たちは[i] [j]は、i番目の点を示す前処理された変更の活性化の後に、ツリー全体のJ秒に及ぼす影響。アカウントに駅の寄与を取った場合| =変更ができます。

列挙の順序は、1秒前のポイントの影響を排除する必要がある場合により連続に、インパクトに参加する前に、私のアプローチは、1つの以上乗車複雑N.だろう

列挙がフラッシュバック場合でも、時間が異なります。ように配置DP [i] [j]はiが第二の状態のターゲットになることがあり、状態jです。このような排他的なまたは唯一の変更点[i]と[J-1]することができます。

得られた状態遷移式:DP [I + 1] [j ^変化[K] [I] = DP [I] [J]真:?偽;(k:1〜(1 << N)-1)

コード

#include<bits/stdc++.h>
using namespace std ;
inline int read(){
    int s=0 ; char g=getchar() ; while(g>'9'||g<'0')g=getchar() ; 
    while( g>='0'&&g<='9' )s=s*10+g-'0',g=getchar() ; return  s ;
}
int N , sta , fa[20] , change[20][20] , dp[20][(1<<17)] ; 
void  prepare(){
    for( int i = 0 ; i <= N ; ++i )change[1][i] = 1 ;
    for( int i = 2 ; i <= N ; ++i ){
        int now = i ; 
        change[i][0] = ( 1<<(i-1) ) ; 
        for( int j = 1 ; j <= N ; ++j ){
            now = fa[now] ; 
            if(now) change[i][j] = (change[i][j-1]|(1<<(now-1))) ;
            else change[i][j] = change[i][j-1] ;//到顶了 
        }
    }
}
int main(){
    freopen("decoration.in","r",stdin) ; 
    freopen("decoration.out","w",stdout) ;
    N = read() ;  int m1 ; fa[1] = fa[0] = 0 ;
    for( int i = 1 ; i < N ; ++i )fa[i+1] = read() ; 
    for( int i = 1 ; i <= N ; ++i ){
        m1 = read() ;if(m1)sta |= (1<<(i-1) ) ;
    }
    prepare() ;
    dp[0][sta] = 1 ; // 状态为sta,0秒后状态为sta 
    for( int i = 0 ; i <=  N ; ++i ){
        if( dp[i][0] ){
            cout<<i ; return 0 ; 
        }
        for( int k = 1 ; k <= (1<<N)-1 ; ++k )
            if( dp[i][k] ){//状态为k,i秒后可以到达sta 
                dp[i+1][k] = true ; 
                for( int j = 1 ; j <= N ; ++j )dp[i+1][k^change[j][i]] = true ; 
            }
    }
    return 0;
}

ランチ

正直に言うと、この質問は非常に癌です。(清チーを考えます)

私たちは、様々な人との競合関係を考慮してください。

男0なら、私たちは、状況に適応するために、特に彼を制御することはできません。

人間-1を考えると、彼は、人と1つのディナーで、その後、人々のために夕食の前癌1アルゴリズムに学習してはいけません。

タイトル読ん注意:SPJオンを、私たちはちょうどプログラムが正当なせることができます。

人はがんアルゴリズムI瞬間に学ぶことができるならば、彼は(J> I)とき癌アルゴリズムの社会Jではありません。できるだけ多くのプロセス全体を推進します。

具体的に:人は初めてがんアルゴリズムを学んだとして、[]サブHをしてみましょう。それから彼は、人々-1影響で、食事の影響を受けることになります。あなたはLを選択したときに控え、できるだけ多くの時間を作るために、時間を食べる[U] =のL + 1。

そして、より多くの人々との関係を検討します。(U、V)夕食ようにします。もし、[U]> R知らF、その後、Vおよびuが前に食べないと確かに学んでいない、または解決策。この状況は、Hを導くことができる[U] - MAX(H [U]、L + 1)。

すべての制限を満たしていなければならない時間[U]を考慮すると、それが最大値をとります。この事は、一度dijkstar実行し、最長の道路維持管理することができます。

さて、食事の問題を考慮して、H []配列を維持:夕食の時間みんなに会った:正当1.(あなたが食べることができる)2つの満たすDIS [i]は> = H [i]の.. (uはアルゴリズム癌を学び、Vに教え、最短時間は、DISの配列によって表される)上記で得られたことができるとの間のすべての法的関係をみよう

LIM =最大(MAX(L [i]は、DIS [U])[I]に、H)。(LIM [I]乃至] DIS)=分[I]乃至] DIS。

その後、これはダイクストラです......

ssw02はコードを書く決定することは不可能。

コード:

#include<bits/stdc++.h>
using namespace std ;
const int MAXN = 200005 ;
inline int read(){
    int s=0,w=1 ; char g=getchar() ; while(g>'9'||g<'0'){if(g=='-')w=-1,g=getchar() ;} 
    while(g>='0'&&g<='9')s=s*10+g-'0',g=getchar() ; return s*w ;
}
int N , M , sta[MAXN] , h[MAXN] , L[MAXN*2] , R[MAXN*2] ;
int head[MAXN] , to[MAXN*2] , nex[MAXN*2] , tot = 1 ;
bool vis[MAXN] ; 
struct ap{
    int u , v , l , r ; 
}t[MAXN] ;
priority_queue<pair<int,int> >q ; 
void  add( int x , int y , int l , int r ){
    to[++tot] = y , nex[tot] = head[x] , L[tot] = l , R[tot] = r , head[x] = tot ; 
}
void  dijkstra(){//维护每个人学会的时间的下限 
    while( !q.empty() ){
        int  u = q.top().second ; q.pop() ; 
        if( vis[u] )continue ; 
        vis[u] = true ; 
        for( int i = head[u] ; i ; i = nex[i] ){//u,v在 L R 吃饭  , u 学会的时间 > R ,说明 u,v吃饭时v还没有学会,贪心在L吃饭,v在L+1学会 
            if( R[i] < h[u] )//出现限制情况 
                if( h[to[i]] < L[i]+1 ){//更新限制 
                    h[to[i]] = L[i]+1 ;
                    q.push( make_pair( h[to[i]],to[i] ) ) ; 
                }
        }
    }
}
int dis[MAXN] ; 
void  dijkstra2(){//维护每个人学会的时间 (贪心最早)
    while( !q.empty() )q.pop() ; 
    memset( vis , 0 , sizeof(vis) ) ;
    for( int i = 1 ; i <= N ; ++i )dis[i] = (1<<30) ; 
    q.push( make_pair(0,1) ) ; dis[1] = 0 ;
    while( !q.empty() ){
        int u = q.top().second ; q.pop() ;
        if( vis[u] )continue ; 
        vis[u] = true ; 
        for( int i = head[u] ; i ; i = nex[i] ){
            int  lim = max( h[to[i]] , max( L[i] , dis[u] ) ) ;//由 u 传授给 v : 满足条件 u会 , 能吃饭 
            if( lim <= R[i] )//合法 
                if( dis[ to[i] ] > lim ){
                    dis[ to[i] ] = lim ;
                    q.push( make_pair( -dis[to[i]] , to[i] ) ) ;
                }
        }
    }
}
void  print(){
    for( int i = 1 ; i <= M ; ++i ){
        if( sta[t[i].u] == -1 || sta[t[i].v] == -1 || ( t[i].r < max(dis[t[i].u] , dis[t[i].v]) ) )printf("%d\n",t[i].l ) ; 
        //有任意一个人不会,贪心最早吃饭 || 两个人吃饭时都不会 (任意时间吃)
        else printf("%d\n",max( max(dis[t[i].u],dis[t[i].v]) , t[i].l ) ) ;
    }
}
int main(){
    freopen("lunch.in","r",stdin) ;
    freopen("lunch.out","w",stdout) ; 
    N = read() , M = read() ; 
    for( int i = 1 ; i <= M ; ++i ){
        t[i].u = read() , t[i].v = read() , t[i].l = read() , t[i].r = read() ;
        add( t[i].u , t[i].v , t[i].l , t[i].r ) ; 
        add( t[i].v , t[i].u , t[i].l , t[i].r ) ;  
    }
    for( int i = 1 ; i <= N ; ++i ){
        sta[i] = read() ; 
        if( sta[i] == -1 ){
            h[i] = (1<<30) ; q.push( make_pair( h[i] , i ) ) ;
        }
    }
    dijkstra() ; dijkstra2() ; bool flag = 1 ; 
    for( int i = 1 ; i <= N ; ++i )//最后会但限制不会,冲突 
        if( sta[i] == 1 && dis[i] == (1<<30) )flag = 0 ; 
    for( int i = 1 ; i <= M ; ++i ){
        if( sta[ t[i].u ]==-1 && dis[ t[i].v ] <= t[i].l )flag = 0 ;//明明不会有还在和会的吃饭 
        if( sta[ t[i].v ]==-1 && dis[ t[i].u ] <= t[i].l )flag = 0 ;
    }
    if( flag )print() ; 
    else cout<<"Impossible" ;
    return 0 ;
}

概要

T1は、ジェン^ TM癌(私はほとんど....華容強化されたバージョンを書きました)

T2は、アカウントへの配列の変化状態をとる未知のターゲットは、ターゲット時間に固定されている古典的な設計の状態遷移式で、便宜上、それは状態遷移フラッシュバックの設計です。

T3は、最短経路問題に非常に良いアイデアの帯域制限の問題を属します。帯域制限条件の複数(差分と全く同様の制約を考えた)、成立しています。

受刑質問はまだT1明らかにパニックに問題の今日の試験を持っている場合、より良い練習、全体試験の姿勢に影響を与えます。T2、T3は+ルーチンの質問を考えている、そして時には画期的なssw02悲惨な死には至りませんでした。本当にあまりにも多くの時間を費やし、そして、各パックのデータカード(サブタスクキル!!!)、明日、アルゴリズムを検証することを確認していないされているT1に(検査は... PPTを確認するために戻って行きました)依存性は、問題を行って。

おすすめ

転載: www.cnblogs.com/ssw02/p/11794181.html