涼脾的比賽補題

2021-10-02 08:01:49 字數 3425 閱讀 7385

題目鏈結

題意:給出一棵有n(n≤10 000)條邊的樹,存在且僅存在乙個critical結點,使得刪除該critical結點後,不連通的結點對最多。

①求出刪除該critical結點後不連通的結點對的數量n1。

②在刪除critical結點後加一條最優的邊,使得恢復連通的結點對最多,同時求出加上該最優邊後依舊不連通的結點對的數量n2。

比賽時寫的並查集+帶判斷的暴力刪點[accept]思路:

暴力列舉與最大度數相差range以內的點為刪點,對剩下的點用帶權並查集求不連通的節點對數量。結果取所有列舉的max

非正解,range試了幾次,取100時tle,取1時wa,取10時ac

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define inf 0x7fffffff

typedef

long

long ll;

const

int n=

11000

;int l[n]

,r[n]

,n,all,n1,n2,du[n]

,fa[n]

;int siz[n]

,st[n]

,cnt,n1_,n2_;

intfind

(int u)

intmain()

int id=0;

for(

int i=

1;i<=n;i++)if

(du[i]

>du[id]

)id=i;

all=n*

(n-1)/

2;for(

int k=

0;k<=n;k++

)else

continue

;for

(int i=

1;i<=n;i++)}

}int sum=0;

for(

int i=

0;i<=n;i++)}

n1=all-sum;

sort

(st+

1,st+

1+cnt)

; sum-

=st[cnt]

*(st[cnt]-1

)/2+st[cnt-1]

*(st[cnt-1]

-1)/

2;sum+

=(st[cnt]

+st[cnt-1]

)*(st[cnt]

+st[cnt-1]

-1)/

2;n2=all-sum;

if(n1>n1_)

} cout<" "<}

正解思路:因為是n+1個點n條邊的連通圖,所以任取一點為根把圖轉化為樹,dfs求出每個節點的每個子節點的size,當前點到根那一邊的連通分量大小為n+1-∑size[all_son]。求出最大n1,再使刪除當前點後的兩個最大連通分量連通,計算n2。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef

long

long ll;

const

int n=

11000

;int n,fa[n]

,siz[n]

,n1,n2,id,son[n]

,cnt;

vector<

int>v[n]

;void

dfs(

int k)

}int

main()

dfs(0)

;for

(int i=

0;i<=n;i++)}

son[

++cnt]

=n+1

-siz[id]

;for

(auto

&j:v[id])if

(j!=fa[id]

)son[

++cnt]

=siz[j]

;sort

(son+

1,son+

1+cnt)

; n2=n1-son[cnt]

*son[cnt-1]

; cout<" "<}

思路:先根據題意,每x天的飯量取值只能為m*[(2/3) ^ x],x取值為0,1,2…n,所以我們可以先把每天飯量的可能取值求出來,存進陣列e裡。

然後定義dp[i][j]表示第i天,飯量為e[j]時,吃掉的食物總量。

先把初始值設為-1,表示未賦值。然後讓dp[i][0]全等於0,表示一直不吃的情況。

然後分類討論:

今天吃完後的分值為dp[i][j]+min(e[j],a),記為aftereat

· 今天吃,明天也吃:dp[i+1][j+1]=max(dp[i+1][j+1],aftereat)

· 今天吃,明天不吃,後天吃:dp[i+2][j]=max(dp[i+2][j],aftereat)

· 今天吃,明天不吃,後天也不吃,大後天吃:dp[i+3][0]=max(dp[i+3][0],aftereat)

#include

using namespace std;

typedef

long

long ll;

const

int n=

107;

int n,m,dp[n]

[n],e[n]

;int

main()

}int ans=0;

for(

int j=

0;j<=n;j++

) ans=

max(ans,dp[n+1]

[j])

; cout

}

2020 01 18涼脾比賽

題目鏈結 題意是 給你一串字串 偶數個 1.首先把這個字串劃分為兩半,設為x,y。2.計算x字串中的每乙個字元對應的序號並相加和為sum,然後x中的每個字元變為加上這sum後對應的字元,y字串操作同理。3.第二步操作後的x字串中的每個字元要加上對應的y字串中的每個字元對應的序號。include in...

涼脾的比賽題解

題意給定乙個字串,字串的長度一定是偶數,首先先把字串分成長度相等的前後兩部分,然後對這兩個字串做相同處理,處理規則是,先求字串的總數和,總數和的求法就是字串中的所有字母減a加起來 比如abcd總數和就是0 1 2 3 6,知道了總數和,字串中的每個字母都加上總數和,假設總數和是6,a就變成了g,z變...

涼心的比賽 一 補題

題目鏈結 題意 有n個物品,能進行a次操作一和b次操作二,每個物品有乙個hp和damage,操作一為把某個物品的hp變為原來的兩倍,操作二為把某個物品的hp賦值給它的damage,問這n個物品的damage的總和最大是多少。思路 證明出來a操作應該都使用給同乙個物品最優,然後按b操作的最優方案排序,...