SlideShare uma empresa Scribd logo
1 de 16
Baixar para ler offline
順列




原案、問題文:宮村
 解答:宮村
 解説:宮村
問題概要

   以下の条件を満たす長さ N の数列 X の個数を数
    える。
   1. 任意の i に対して X[j]=i なる j が存在する。
   2. X[s] = t
   3. X[a[i]] < X[b[i]] (1≦i≦C)
     ( ただし i ≠ j ならば a[i] ≠ a[j])

   2 ≦ N ≦ 2000
   0≦C≦N
問題読み替え

   条件 1 は単に順列であることを言っているだけ。
   簡単のため以下のように問題を読み替える。
   2'. X[s] = N-t+1
   3'. X[a[i]] > X[b[i]] (1≦i≦C)
    ( ただし i ≠ j ならば a[i] ≠ a[j] )
   もとの条件を満たす数列を X[i] := N – X[i] + 1 で
    置き換えた数列の数を数えているに過ぎない
グラフとして解釈する

   各番号を頂点とし、番号 b[i] から a[i] へ辺を張った
    頂点数 N のグラフを考える。
   このとき、この有向グラフで頂点 s が N-t+1 番目に
    くるトポロジカル順序の個数を求めれば良い。


   もちろん、 DAG でなければトポロジカル順序が定
    義できないので、閉路があれば即座に 0 を返す。
   有向閉路の判定は O(N+C) なり O(N*C) なりで簡
    単にできる。
グラフとして解釈する

   入次数 1 以下という制限があるので、有向閉路を
    持たない場合は根付き木が複数個集まったような
    グラフになる。




                 s
グラフとして解釈する

   連結成分毎に分けて考えてもいいが、ダミーノード
    を根としてつけると簡単になる。
   この場合、頂点 s が N-t+2 番目にくるようなトポロ
    ジカル順序の個数を求めれば良い。
               root




                      s
ここまでのまとめ

   結局、有向閉路を持たない場合は以下のような問
    題に帰着できる。


   ノード数 N の根付き木が与えられる。このとき、ノー
    ド v が k 番目にくるようなトポロジカル順序の個数
    を求めよ。
    (N は元の問題とは異なることに注意 )
解法

   動的計画法で解く。
   根から v までのパス上で計算する。
   以下の解説では番号を 0-indexed にする。
根からのパス

            このパス上で DP する   root
root




       v


                            v
状態の関係式



   S[u]={u を根とする部分木のサイズ } とする。
   S[u] = 1 + Σ S[c]
     ただし、 c は u の全ての子
状態の関係式



   T[u] = {u を根とする部分木のトポロジカル順序の
    総数 } とする。
   T[u] = (Π T[c]) * (S[u]-1)! / (Π S[c]!)
      ただし、 c は u の全ての子
   階乗を使わずに二項係数を使って計算しても良い。
状態をどのようにとるか

   根から v へのパス上のノードを浅い順に V[0]=root,
    V[1], …, V[depth]=v, V[d+1]=dummy とする。
   S[dummy] = 0, T[dummy] = 1 としておくと楽。
   G[i] = {V[i] を根とする部分木 }, G[d+1]= 空とする。
   DP[i][j] = {G-G[i+1] で、 V[i] が j 番目に来るような
    トポロジカル順序の総数 } とすると、最終的に
    DP[depth][k] が答となる。
状態の関係式
                                                  オーバーフローに注意
   DP[i][j] = (Σ_{0≦k<j} DP[i-1][k])
    * combination(N-S[V[i+1]]-1-j, S[V[i]]-S[V[i+1]] - 1)
      * (Π T[c]) * (S[i]-S[i+1]-1)! / (Π S[c]!)
   ただし、 c は V[i] の V[i+1] 以外の子
      0          j-1     j    j+1                              N-S[V[i+1]]-1
                       V[i]



    V[i-1] はこのどこかにある
                              全部で N-S[V[i+1]] 個   この中から
                                                  S[V[i]]-S[V[i+1]]-1 個選ぶ
計算量



   状態数が depth * N でおよそ N^2 通りある。
   ひとつの関係式を真面目に計算したら O(N) 程度
    かかって全体で O(N^3) となり TLE しそう。
計算量

   (Π T[c]) * (S[i]-S[i+1]-1)! / (Π S[c]!) の部分は j に
    依存しないので最初に計算しておけばよい。
   Σ_{0≦k<j} DP[i-1][k] は DP[i-1][j] を j の小さい方
    から加算していけば同じ計算を繰り返さずに済む。
     ( 和が出てくる DP を高速化する典型手法 )
   または、累積和を計算しておいて O(1) で表引きで
    きるようにしておく、と考えてもよい。
   こうすると、計算量は全体で O(N^2) となる。
解答例

   宮村
    C++ : 139 行 2517 byte
    Java: 171 行 3327 byte

Mais conteúdo relacionado

Mais procurados

20130921_曲面の微分幾何学
20130921_曲面の微分幾何学20130921_曲面の微分幾何学
20130921_曲面の微分幾何学matsumoring
 
Four op
Four opFour op
Four opoupc
 
ポアンカレ計量
ポアンカレ計量ポアンカレ計量
ポアンカレ計量政孝 鍋島
 
公開鍵暗号2: NP困難性
公開鍵暗号2: NP困難性公開鍵暗号2: NP困難性
公開鍵暗号2: NP困難性Joe Suzuki
 
内藤ゼミ 凸関数 レジュメ
内藤ゼミ 凸関数 レジュメ 内藤ゼミ 凸関数 レジュメ
内藤ゼミ 凸関数 レジュメ yamazaki ryoga
 
曲面の面積の計算と証明
曲面の面積の計算と証明 曲面の面積の計算と証明
曲面の面積の計算と証明 政孝 鍋島
 
曲面の面積の計算と証明
曲面の面積の計算と証明曲面の面積の計算と証明
曲面の面積の計算と証明nabeshimamasataka
 
【材料力学】3次元空間のひずみ (II-11 2018)
【材料力学】3次元空間のひずみ  (II-11 2018)【材料力学】3次元空間のひずみ  (II-11 2018)
【材料力学】3次元空間のひずみ (II-11 2018)Kazuhiro Suga
 
topology of musical data
topology of musical datatopology of musical data
topology of musical dataTatsuki SHIMIZU
 
上三角 Pascal 行列による多項式のシフト
上三角 Pascal 行列による多項式のシフト上三角 Pascal 行列による多項式のシフト
上三角 Pascal 行列による多項式のシフトKeigo Nitadori
 
Sharp2sat
Sharp2satSharp2sat
Sharp2satoupc
 
Rate-Distortion Function for Gamma Sources under Absolute-Log Distortion
Rate-Distortion Function for Gamma Sources under Absolute-Log DistortionRate-Distortion Function for Gamma Sources under Absolute-Log Distortion
Rate-Distortion Function for Gamma Sources under Absolute-Log Distortion奈良先端大 情報科学研究科
 
数学必須手法解説講座vol.1「次数下げ」
数学必須手法解説講座vol.1「次数下げ」数学必須手法解説講座vol.1「次数下げ」
数学必須手法解説講座vol.1「次数下げ」Courslide
 

Mais procurados (20)

20130921_曲面の微分幾何学
20130921_曲面の微分幾何学20130921_曲面の微分幾何学
20130921_曲面の微分幾何学
 
C04
C04C04
C04
 
Four op
Four opFour op
Four op
 
ポアンカレ計量
ポアンカレ計量ポアンカレ計量
ポアンカレ計量
 
公開鍵暗号2: NP困難性
公開鍵暗号2: NP困難性公開鍵暗号2: NP困難性
公開鍵暗号2: NP困難性
 
内藤ゼミ 凸関数 レジュメ
内藤ゼミ 凸関数 レジュメ 内藤ゼミ 凸関数 レジュメ
内藤ゼミ 凸関数 レジュメ
 
Master Thesis
Master ThesisMaster Thesis
Master Thesis
 
曲面の面積の計算と証明
曲面の面積の計算と証明 曲面の面積の計算と証明
曲面の面積の計算と証明
 
曲面の面積の計算と証明
曲面の面積の計算と証明曲面の面積の計算と証明
曲面の面積の計算と証明
 
【材料力学】3次元空間のひずみ (II-11 2018)
【材料力学】3次元空間のひずみ  (II-11 2018)【材料力学】3次元空間のひずみ  (II-11 2018)
【材料力学】3次元空間のひずみ (II-11 2018)
 
Divisor
DivisorDivisor
Divisor
 
Prml 4.3.6
Prml 4.3.6Prml 4.3.6
Prml 4.3.6
 
topology of musical data
topology of musical datatopology of musical data
topology of musical data
 
1
11
1
 
上三角 Pascal 行列による多項式のシフト
上三角 Pascal 行列による多項式のシフト上三角 Pascal 行列による多項式のシフト
上三角 Pascal 行列による多項式のシフト
 
Sharp2sat
Sharp2satSharp2sat
Sharp2sat
 
Prml 4.1.1
Prml 4.1.1Prml 4.1.1
Prml 4.1.1
 
Rate-Distortion Function for Gamma Sources under Absolute-Log Distortion
Rate-Distortion Function for Gamma Sources under Absolute-Log DistortionRate-Distortion Function for Gamma Sources under Absolute-Log Distortion
Rate-Distortion Function for Gamma Sources under Absolute-Log Distortion
 
数学必須手法解説講座vol.1「次数下げ」
数学必須手法解説講座vol.1「次数下げ」数学必須手法解説講座vol.1「次数下げ」
数学必須手法解説講座vol.1「次数下げ」
 
PRML 8.4-8.4.3
PRML 8.4-8.4.3 PRML 8.4-8.4.3
PRML 8.4-8.4.3
 

Destaque

Magical
MagicalMagical
Magicaloupc
 
Palin
PalinPalin
Palinoupc
 
Gcd
GcdGcd
Gcdoupc
 
Rmq
RmqRmq
Rmqoupc
 
Sort
SortSort
Sortoupc
 
Cube
CubeCube
Cubeoupc
 
One
OneOne
Oneoupc
 
Segpair
SegpairSegpair
Segpairoupc
 
Trip
TripTrip
Tripoupc
 
Kth
KthKth
Kthoupc
 
Paren
ParenParen
Parenoupc
 
Goto
GotoGoto
Gotooupc
 
Replace
ReplaceReplace
Replaceoupc
 
Comment
CommentComment
Commentoupc
 
Sanpo
SanpoSanpo
Sanpooupc
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 

Destaque (16)

Magical
MagicalMagical
Magical
 
Palin
PalinPalin
Palin
 
Gcd
GcdGcd
Gcd
 
Rmq
RmqRmq
Rmq
 
Sort
SortSort
Sort
 
Cube
CubeCube
Cube
 
One
OneOne
One
 
Segpair
SegpairSegpair
Segpair
 
Trip
TripTrip
Trip
 
Kth
KthKth
Kth
 
Paren
ParenParen
Paren
 
Goto
GotoGoto
Goto
 
Replace
ReplaceReplace
Replace
 
Comment
CommentComment
Comment
 
Sanpo
SanpoSanpo
Sanpo
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 

Semelhante a Permutation

アルゴリズムとデータ構造15
アルゴリズムとデータ構造15アルゴリズムとデータ構造15
アルゴリズムとデータ構造15Kenta Hattori
 
20170327_レムニスケートにまつわる色々な計算
20170327_レムニスケートにまつわる色々な計算20170327_レムニスケートにまつわる色々な計算
20170327_レムニスケートにまつわる色々な計算matsumoring
 
2015年度秋学期 応用数学(解析) 第13回 孤立特異点と留数 (2015. 12. 17)
2015年度秋学期 応用数学(解析) 第13回 孤立特異点と留数 (2015. 12. 17)2015年度秋学期 応用数学(解析) 第13回 孤立特異点と留数 (2015. 12. 17)
2015年度秋学期 応用数学(解析) 第13回 孤立特異点と留数 (2015. 12. 17)Akira Asano
 
複素数・四元数と図形の回転
複素数・四元数と図形の回転複素数・四元数と図形の回転
複素数・四元数と図形の回転Yoshihiro Mizoguchi
 
2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第13回 孤立特異点と留数 (2015. 1. 8)
2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第13回 孤立特異点と留数 (2015. 1. 8)2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第13回 孤立特異点と留数 (2015. 1. 8)
2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第13回 孤立特異点と留数 (2015. 1. 8)Akira Asano
 
JOIss2020 発表資料
JOIss2020 発表資料JOIss2020 発表資料
JOIss2020 発表資料mdkcpp 1015
 
単調減少な数列の級数問題
単調減少な数列の級数問題単調減少な数列の級数問題
単調減少な数列の級数問題政孝 鍋島
 
単調減少な数列の級数問題
単調減少な数列の級数問題単調減少な数列の級数問題
単調減少な数列の級数問題nabeshimamasataka
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数Taketo Sano
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3noname409
 
パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化Miyoshi Yuya
 
第9回スキル養成講座講義資料
第9回スキル養成講座講義資料第9回スキル養成講座講義資料
第9回スキル養成講座講義資料keiodig
 
コードを書けば複素数がわかる
コードを書けば複素数がわかるコードを書けば複素数がわかる
コードを書けば複素数がわかるTaketo Sano
 
第12回計算機構成
第12回計算機構成第12回計算機構成
第12回計算機構成眞樹 冨澤
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Inc.
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作るTaketo Sano
 
Indeedなう B日程 解説
Indeedなう B日程 解説Indeedなう B日程 解説
Indeedなう B日程 解説AtCoder Inc.
 
線形識別モデル
線形識別モデル線形識別モデル
線形識別モデル貴之 八木
 

Semelhante a Permutation (20)

アルゴリズムとデータ構造15
アルゴリズムとデータ構造15アルゴリズムとデータ構造15
アルゴリズムとデータ構造15
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
20170327_レムニスケートにまつわる色々な計算
20170327_レムニスケートにまつわる色々な計算20170327_レムニスケートにまつわる色々な計算
20170327_レムニスケートにまつわる色々な計算
 
2015年度秋学期 応用数学(解析) 第13回 孤立特異点と留数 (2015. 12. 17)
2015年度秋学期 応用数学(解析) 第13回 孤立特異点と留数 (2015. 12. 17)2015年度秋学期 応用数学(解析) 第13回 孤立特異点と留数 (2015. 12. 17)
2015年度秋学期 応用数学(解析) 第13回 孤立特異点と留数 (2015. 12. 17)
 
複素数・四元数と図形の回転
複素数・四元数と図形の回転複素数・四元数と図形の回転
複素数・四元数と図形の回転
 
2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第13回 孤立特異点と留数 (2015. 1. 8)
2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第13回 孤立特異点と留数 (2015. 1. 8)2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第13回 孤立特異点と留数 (2015. 1. 8)
2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第13回 孤立特異点と留数 (2015. 1. 8)
 
JOIss2020 発表資料
JOIss2020 発表資料JOIss2020 発表資料
JOIss2020 発表資料
 
単調減少な数列の級数問題
単調減少な数列の級数問題単調減少な数列の級数問題
単調減少な数列の級数問題
 
単調減少な数列の級数問題
単調減少な数列の級数問題単調減少な数列の級数問題
単調減少な数列の級数問題
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3
 
パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化
 
第9回スキル養成講座講義資料
第9回スキル養成講座講義資料第9回スキル養成講座講義資料
第9回スキル養成講座講義資料
 
コードを書けば複素数がわかる
コードを書けば複素数がわかるコードを書けば複素数がわかる
コードを書けば複素数がわかる
 
第12回計算機構成
第12回計算機構成第12回計算機構成
第12回計算機構成
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作る
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
Indeedなう B日程 解説
Indeedなう B日程 解説Indeedなう B日程 解説
Indeedなう B日程 解説
 
線形識別モデル
線形識別モデル線形識別モデル
線形識別モデル
 

Mais de oupc

Knapsack
KnapsackKnapsack
Knapsackoupc
 
Game
GameGame
Gameoupc
 
Divisor
DivisorDivisor
Divisoroupc
 
Division
DivisionDivision
Divisionoupc
 
Anagram
AnagramAnagram
Anagramoupc
 
Comment
CommentComment
Commentoupc
 

Mais de oupc (7)

Knapsack
KnapsackKnapsack
Knapsack
 
Game
GameGame
Game
 
Divisor
DivisorDivisor
Divisor
 
Division
DivisionDivision
Division
 
Anagram
AnagramAnagram
Anagram
 
A
AA
A
 
Comment
CommentComment
Comment
 

Permutation

  • 2. 問題概要  以下の条件を満たす長さ N の数列 X の個数を数 える。  1. 任意の i に対して X[j]=i なる j が存在する。  2. X[s] = t  3. X[a[i]] < X[b[i]] (1≦i≦C) ( ただし i ≠ j ならば a[i] ≠ a[j])  2 ≦ N ≦ 2000  0≦C≦N
  • 3. 問題読み替え  条件 1 は単に順列であることを言っているだけ。  簡単のため以下のように問題を読み替える。  2'. X[s] = N-t+1  3'. X[a[i]] > X[b[i]] (1≦i≦C) ( ただし i ≠ j ならば a[i] ≠ a[j] )  もとの条件を満たす数列を X[i] := N – X[i] + 1 で 置き換えた数列の数を数えているに過ぎない
  • 4. グラフとして解釈する  各番号を頂点とし、番号 b[i] から a[i] へ辺を張った 頂点数 N のグラフを考える。  このとき、この有向グラフで頂点 s が N-t+1 番目に くるトポロジカル順序の個数を求めれば良い。  もちろん、 DAG でなければトポロジカル順序が定 義できないので、閉路があれば即座に 0 を返す。  有向閉路の判定は O(N+C) なり O(N*C) なりで簡 単にできる。
  • 5. グラフとして解釈する  入次数 1 以下という制限があるので、有向閉路を 持たない場合は根付き木が複数個集まったような グラフになる。 s
  • 6. グラフとして解釈する  連結成分毎に分けて考えてもいいが、ダミーノード を根としてつけると簡単になる。  この場合、頂点 s が N-t+2 番目にくるようなトポロ ジカル順序の個数を求めれば良い。 root s
  • 7. ここまでのまとめ  結局、有向閉路を持たない場合は以下のような問 題に帰着できる。  ノード数 N の根付き木が与えられる。このとき、ノー ド v が k 番目にくるようなトポロジカル順序の個数 を求めよ。 (N は元の問題とは異なることに注意 )
  • 8. 解法  動的計画法で解く。  根から v までのパス上で計算する。  以下の解説では番号を 0-indexed にする。
  • 9. 根からのパス このパス上で DP する root root v v
  • 10. 状態の関係式  S[u]={u を根とする部分木のサイズ } とする。  S[u] = 1 + Σ S[c] ただし、 c は u の全ての子
  • 11. 状態の関係式  T[u] = {u を根とする部分木のトポロジカル順序の 総数 } とする。  T[u] = (Π T[c]) * (S[u]-1)! / (Π S[c]!) ただし、 c は u の全ての子  階乗を使わずに二項係数を使って計算しても良い。
  • 12. 状態をどのようにとるか  根から v へのパス上のノードを浅い順に V[0]=root, V[1], …, V[depth]=v, V[d+1]=dummy とする。  S[dummy] = 0, T[dummy] = 1 としておくと楽。  G[i] = {V[i] を根とする部分木 }, G[d+1]= 空とする。  DP[i][j] = {G-G[i+1] で、 V[i] が j 番目に来るような トポロジカル順序の総数 } とすると、最終的に DP[depth][k] が答となる。
  • 13. 状態の関係式 オーバーフローに注意  DP[i][j] = (Σ_{0≦k<j} DP[i-1][k]) * combination(N-S[V[i+1]]-1-j, S[V[i]]-S[V[i+1]] - 1) * (Π T[c]) * (S[i]-S[i+1]-1)! / (Π S[c]!)  ただし、 c は V[i] の V[i+1] 以外の子 0 j-1 j j+1 N-S[V[i+1]]-1 V[i] V[i-1] はこのどこかにある 全部で N-S[V[i+1]] 個 この中から S[V[i]]-S[V[i+1]]-1 個選ぶ
  • 14. 計算量  状態数が depth * N でおよそ N^2 通りある。  ひとつの関係式を真面目に計算したら O(N) 程度 かかって全体で O(N^3) となり TLE しそう。
  • 15. 計算量  (Π T[c]) * (S[i]-S[i+1]-1)! / (Π S[c]!) の部分は j に 依存しないので最初に計算しておけばよい。  Σ_{0≦k<j} DP[i-1][k] は DP[i-1][j] を j の小さい方 から加算していけば同じ計算を繰り返さずに済む。 ( 和が出てくる DP を高速化する典型手法 )  または、累積和を計算しておいて O(1) で表引きで きるようにしておく、と考えてもよい。  こうすると、計算量は全体で O(N^2) となる。
  • 16. 解答例  宮村 C++ : 139 行 2517 byte Java: 171 行 3327 byte