牛客小白月賽29 D 種樹

2021-10-10 14:18:27 字數 1818 閱讀 2806

d 種樹

很久沒來水部落格了,來水一下部落格

這個題目一開始還不知道怎麼寫但是仔細想了一下我們用max次數越多,那麼最後的結果就越大,而最後的結果顯然和最多能取多少次最大值,還有想要取的那個數的深度有關,如果最大值的深度小於可以取最大值的次數,那麼就能取到,如果最大值的深度小於可以取最大值的次數,那麼最後的結果就是最多能取最大值值的深度的最大值和以及這之外的最小值的最大值取max;(其實就是找到乙個想要的值當深度小於可以取max的的時候一直取max,其他取min,找到所有情況然後取所有情況的max)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define ms(a,b) memset(a,b,sizeof(a))

#define lowbit(x) x & -x

#define fi first

#define ull unsigned long long

#define se second

#define lson (rt<<1)

#define rson (rt<<1|1)

#define endl "\n"

#define bug cout<<"----acac----"<#define ios ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)

using

namespace std;

const

int maxn =

5e5+10;

const

int maxm =

1e4+50;

const

double eps =

1e-7

;const ll inf =

0x3f3f3f3f

;const ll lnf =

0x3f3f3f3f3f3f3f3f

;const ll mod =

1e9+7;

int n;

int a[maxn]

;vector<

int>ve[maxn]

;int m, k;

intdfs

(int u,

int deep)

else

if(ve[u]

.size()

==0&& deep > k)

for(

int i =

0; i < ve[u]

.size()

; i++

)else

}return ans;

}int

main()

}for

(int i =

1; i <= n; i++

)scanf

("%d"

,&a[i]);

m = n >>1;

//一共需要剪枝多少次

k =(m +1)

>>1;

//可以取最多取多少次max

printf

("%d\n"

,dfs(1

,0))

;return0;

}

項鍊 牛客小白月賽29

scimoon 意外得到了乙個項鍊,這個項鍊非常的神奇 它有 n 個珠子,一開始每個珠子有乙個編號,從左到右編號分別是 1 至 n,scimoon 進行了 m 次操作,每次操作有下面這麼幾種 1 x y 表示將編號為 x 的珠子移到編號為 y 的珠子的後面 2 x y 表示將編號為 x 的珠子移到編...

牛客練習賽29D 禁止動規

newcoder 你在乙個無限長的數軸上,一開始你在原點 本來你只有兩種操作 向左dp,以及向右dp 然而由於禁止dp 於是你只能另尋出路 萬幸的是,dp之神隨機給了你n個變數,既 x 1,x 2,x n 每個變數的值在 1,m 之間,且是整數 每次你可以選擇乙個變數 x i 然後向左走 x i 個...

牛客網小白月賽D

題目 水果店裡有 n個水果排成一列。店長要求顧客只能買一段連續的水果。小陽對每個水果都有乙個喜愛程度 ai,最終的滿意度為他買到的水果的喜歡程度之和。如果和為正 不管是正多少只要大於 0 即可 他就滿意了。小陽想知道在他滿意的條件下最多能買多少個水果。你能幫幫他嗎?輸入描述 第一行輸入乙個正整數 n...