2017北京國慶刷題Day4 afternoon

2022-03-02 01:03:51 字數 3669 閱讀 3541

期望得分:100+100+0=200

實際得分:5+0+0=5

每加入乙個數,x的因數字置++

注意:根號x列舉時,如果x是完全平方數,根號x會重複累計2次,要減去

考場上沒減,5分 /(ㄒoㄒ)/~~

樹形dp

令col[i] 表示 i與i的父節點之間的連邊

f[i] 表示 在節點i的子樹中,鏈的乙個端點為i,且與i直接相鄰的邊的邊的顏色 不與col[i] 相同 的方案數

f[i] 表示對應的權值和

g[i] 表示在節點i的子樹中,鏈的乙個端點為i 的方案數

g[i] 表示對應的權值和

將i的子樹中經過i的鏈分為兩種

① 以i為端點,用 g g  統計

②i為中間的乙個點,用 f f 統計

狀態轉移方程:

設j為i的子節點,val[i]表示節點i的點權

① g[i]=σ(f[j]+1) g[i]=σ(f[j]+val[j])

② f[i]= σ(f[j]+1) f[i]=σ(f[j]+val[j]) 其中,j滿足col[j]!=col[i]

③ g[i]+=g[i]*val[i] 

④ f[i]+=f[i]*val[i]

解釋:1、g[i]、f[i] 的轉移 就是把子樹中的 g,f 累加起來,再加上子樹的個數,因為i和i的子樹的根節點(即i的子節點)構成一條新的合法的鏈

2、①、② 中 g、f 的轉移 就是把子樹中的 g、f累加起來,再加上子節點的權值和,因為i和的i的子節點構成一條新的合法的鏈

3、③、④ 所有的以i為乙個端點的鏈都累加乙個 i的權值

統計答案:

1、以i為端點的鏈,就是ans+=g[i]

2、以i為中間乙個點的鏈,顯然是要拿以i為端點的兩條鏈拼起來

①對於i的每個子樹j,假設j會被使用sum次,子樹j的合法鏈的權值總和為v,那麼 這個子樹j 對 答案的貢獻就是  sum*(v+val[j])。

加val[j]是因為 子樹j的根節點的權值不屬於v,但以這個點為鏈的乙個端點,以i的其他子樹的乙個點為鏈的另乙個端點, 這就是一條合法的鏈

如何統計sum?

設s[k]表示當前i的子樹中,以i為鏈的乙個端點 且 與i直接相連的邊的顏色為k 的鏈的條數

顏色編號大至1e9? ——離散化

那麼sum=g[i]-s[col[j]]  即只要與i直接相連的邊的顏色 不等於 col[j] ,就可以與j的子樹中的鏈 以及 j 拼接

② 考慮了鏈的拼接,還差兩條鏈的交點的權值沒有加,即i的權值。

設兩條鏈拼接的總方案數字 tot,那麼最後再加上 tot*val[i] 就行了

tot=σ (  (f[[j]+1) * (g[i]-s[col[j]])  )  / 2  原理同上

除2是因為 一條鏈被列舉了兩次

解決本題關鍵:

同一行/列只有被選中奇數次才有效

假設有i行j列被翻了過來

那麼可以得到等式

i*m+j*n-2*i*j=s

解得j=(s-i*m)/(n-2*i)

由此可知,我們只需要列舉i,就可以直接算出j

這個 i,j 合法的條件是:

① 不越界

②(n-i)%2=0,(m-j)%2=0

因為只能再翻偶數次,才能保證當前i,j 合法

如何計算一對合法的i,j的答案?

n行裡i行被翻了過來  c(n,i)

m列裡j列被翻了過來 c(m,j)

被翻了偶數次的行,就是把(r-i)/2  次機會 分給 n 行 c((r-i)/2+n-1,n-1)

注意不是n行裡面選 (r-i)/2  行翻過來,因為同一行可以不翻,也可以翻多次

同理,偶數次列為 c((c-i)/2+m-1,m-1)

把這4個c 乘起來就是這一對i,j 的答案

最後累加所有的i,j 的貢獻即可

#include#include

using

namespace

std;

#define n 200001typedef

long

long

ll;const

int mod=1e9+7

;ll inv[n],fac[n];

ll pow(ll a,

intb)

intmain()

}printf("%d

",ans);

}

view code

2017北京國慶刷題Day7 afternoon

期望得分 100 30 100 230 實際得分 60 30 100 190 排序去重 固定右端點,左端點單調不減 考場上用了二分,沒去重,60 記錄所有子集的最後出現位置 對於每個ai,列舉ai的子集,若最後出現位置 列舉子集複雜度 for int s 1 s for int i s i i i ...

LeetCode刷題之旅(Day4)

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...

牛客網刷題day4

1.下列 中的錯誤是 d 1 public class test 2 8 a.非法的表示式 i 1 b.找不到符號i c.類不應為public d.尚未初始化變數i 解析 在方法內定義的變數在使用之前必須初始化,否則報錯。3.在資料報網路中,每個分組攜帶有目的地主機的位址。a a.是b.否 解析 資...