洛谷p1769 DP(線段樹思想)

2021-10-01 22:45:21 字數 2720 閱讀 1381

這題乍一看很嚇人,實則當你去手畫一下比賽過程的時候就可以知道了,假設總人數有8人,1, 2 , 3 , 4 , 5 , 6 ,7 ,8.

題目說了每一輪都是按編號順序從小到大去比賽的那麼第一輪就是(1,2),(3,4),(5,6),(7,8).這麼個比賽順序,第二輪就是(1,2)的勝利者去比(3,4)的勝利者(另外兩個同理)。這個比賽的過程在我剛剛接觸這個題的時候我想的是線段樹的過程,但是是乙個十分完美的區間劃分,線段樹可能會有(1,3)區間去分開變成(1,2)和(3)的情況,但是這裡不會。利用線段樹的這個過程我們就可以十分完美的去模擬出這個比賽的過程。接下來考慮我們要怎麼得到答案,我先說我一開始想的錯誤的想法,我最初為了避免小數運算,選擇了把勝率當做權值去做,90%概率我就拿90分,然後去計算每個人獲勝的總權值去比較大小,但是算權值的時候我用的也是加法,沒去想乘法,所以一頓瞎雞兒操作30分。。。。。

(暴躁改幾次還是沒用選擇開啟了題解233333)正確的應該是這樣子的我們和線段樹一樣f[i],i這個節點就代表了乙個區間範圍[l,r],然後我們在開一維度j表示這個區間內的勝者。f[i][j]的值就代表了j這個人在這個區間獲勝的概率。要怎麼算呢?首先j這個人是在左邊區間來的還是右邊區間來的我們可以知道,我們按他在左邊兒子(區間)來的,(在右邊的同理)。那麼這個j節點就是在[l , mid]的區間的勝者,我們用他這個節點是這個區間的勝者的概率f[i * 2][j]去與右區間的每乙個勝者獲勝的概率去乘上j打贏他們的概率

f[i][j] = sum(f[i*2][j] * f[i * 2 + 1][k]),k就代表了右邊區間的所有可能獲勝的人。這個式子其實就是乙個人在這個區間獲勝是概率是在原本所在區間獲勝的概率在去分別乘上要贏另乙個區間那個獲勝的人的概率在乘上另乙個區間那個獲勝的人要在她所在原本區間要獲勝的概率,有點小饒,在多看兩遍。

這樣就做完收工了,最後統計[1,r]區間每個人的勝率去得答案就好了

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define debug cout<<"*********degug**********";

#define int long long

#define re register

#define yn yn_

using

namespace std;

const

long

long max_ =

1500+7

;const

int mod =

1e9+7;

const

int inf =

1e9;

const

long

long inf =

1e18

;int

read()

while

(ch >=

'0'&&ch <=

'9')

return s * f;

}inline

intmin

(int a,

int b)

inline

intmax

(int a,

int b)

intquick_pow

(int x,

int n)

return res;

}int n, stander;

double f[max_ *4]

[max_]

, nodee[max_]

[max_]

;void

update

(int node,

int l,

int r)

int mid =

(l + r)/2

,l_tree = node *

2, r_tree = node *2+

1;update

(l_tree, l, mid)

;update

(r_tree, mid +

1, r)

;for

(int i = l; i <= mid; i++

) f[node]

[i]= t ;

// printf("[%d,%d]的%d取得勝利的分數:%d\n", l, r, i, f[node][i]);

}for

(int i = mid +

1; i <= r; i++

) f[node]

[i]= t ;

//printf("[%d,%d]的%d取得勝利的分數:%d\n", l, r, i, f[node][i]);}}

signed

main()

}update(1

,1, stander)

;double ansvalue =0;

int ans =

122345

;for

(int i =

1; i <= stander; i++

)else

}cout << ans;

return0;

}

POJ 1769線段樹維護dp

我們設dp i j 為做到第i個sort時候,最大值被移動到j需要轉移用的數目。dp i j dp i 1 j if ti j 即移動不到當前最大值 dp i j min dp i 1 j dp i 1 k si k ti 1 if ti j 即這個最大值包含在這個區間。我們發現dp值只與他前乙個有...

線段樹2 洛谷p3373 線段樹

題目位址 解釋 多了乙個乘法操作,可以考慮優先順序。每次先算乘法。首先,對於乙個區間 和為s 假設已經按 a 乘b進行了操作。值得到的值為 s a b sb ab 假設先乘得到 sb a 這樣相比,add應該還要再乘上乙個b才對,所以,當更新到乙個區間時,為了進行先乘的操作而不讓結果發生變化,應該將...

洛谷 P3372 線段樹 1

今天植樹節,來種一棵線段樹。傳送門如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第 i 個數字表示數列第 i 項的初始值。接下來m行每...