牛客網NOIP賽前集訓營 提高組(第一場)

2021-08-27 23:52:07 字數 3946 閱讀 6786

題目鏈結~

problem

求所有大於等於 le

n len

的區間的中位數最大可以是多少

solution

我們二分乙個答案,對於序列中大於的給

1 1

,小於的給 −1

' role="presentation" style="position: relative;">−1−

1。 若存在某一段的值大於等於

0 0

,則說明這個答案成立

這個問題可以用字首和來維護

code

#include 

#include

#include

using

namespace

std;

#define n 100010

int n,m,a[n],b[n],sum[n];

inline

bool check(int x)

return0;}

int main()

printf("%d",ans);

return

0;}

problem求 l

' role="presentation" style="position: relative;">ll到

r r

的數字中,乘積在 l1

' role="presentation" style="position: relative;">l1l

1到 r1

r

1之間的數有多少個

solution

記憶化搜尋…細節超多

code

#include 

#include

#include

using

namespace

std;

#define ll long long

int s[20];

ll l,r,l1,r1;

mapdp[20][2];

ll dfs(int pos,int lim,int pre,ll sum)

if(!lim) dp[pos][pre][sum]=ans;

return ans;

}ll solve(ll x)

int main()

problem

有一棵

n n

個節點的樹(

1' role="presentation" style="position: relative;">1

1為根),

m m

個守衛,每個可以守護一段路徑。

問對於一次詢問 (v

i,ki

)' role="presentation" style="position: relative;">(vi

,ki)

(vi,

ki), 想找到乙個離根節點最近的 ui

u

i使得 vi

v

i到 ui

u

i這條路徑被大於等於

k k

個守衛守護。輸出 vi

' role="presentation" style="position: relative;">viv

i到 ui

u i距離

solution

由於查詢只會向上不會向下,即 ui

u

i一定是 vi

v

i到根上的一點。

因此我們可以把守衛守護的路徑變成 (x

i,lc

a(xi

,yi)

)、(y

i,lc

a(xi

,yi)

) (xi

,lca

(xi,

yi))

、(yi

,lca

(xi,

yi))

對於每次詢問,(v

i,ui

) (vi

,ui)

,如果有邊(x

i,yi

) (xi

,yi)

(直上直下)能完全覆蓋它,那麼 xi

x

i一定為 vi

v

i子樹, yi

y

i一定為 xi

x

i到根上的一點

因此我們可以求出 df

s dfs

序,所有結果就是 vi

v

i的子數中到符合條件最小的。我們可以二分這個點,判斷是否有至少

k k

條路徑。

這個可以用主席樹來記錄。

此時複雜度為 nl

og2n

' role="presentation" style="position: relative;">nlo

g2nn

log2

n 但其實結果我們只想求深度差。因此主席樹中我們可以記錄深度到為

x x

的有多少條邊

那麼結果就是 vi

' role="presentation" style="position: relative;">viv

i的子數中第

k k

小的code

#include 

#include

#include

using

namespace

std;

#define n 200010

int n,m,q,tot=0,num=0,len=0,owo=0,in[n],out[n],h[n],lg[n],fa[n][20],dep[n],root[n],id[n];

struct nodeedge[n<<1];

struct node1tree[n*200];

inline

char gc()

return *s++;

}inline

int read()

while('0'

<=ch && ch<='9') x=x*10+ch-'0',ch=gc();

return x*f;

}inline

void insert(int x,int y)

void dfs(int x)

for(int i=h[x];i;i=edge[i].next)out[x]=tot;

}inline

int lca(int x,int y)

if(x==y) return x;

for(int i=lg[n];i>=0;i--)

return fa[x][0];

}void add(int &p,int l,int r,int x)

int query(int p,int v,int l,int r,int k)

inline

int solve(int x,int k)

int main()dep[1]=1;dfs(1);

num=0;memset(h,0,sizeof(h));

for(int i=1;i<=m;i++)

for(int i=1;i<=n;i++)

}q=read();

for(int i=1;i<=q;i++)

return

0;}

2020牛客NOIP賽前集訓營 提高組(第四場)

有 f n 2 f 2 f 1 f 2 f 2 f 2 令 g n f n 2 很自然的有 g n 2g 2g g 將遞推式寫成矩陣的形式 a 令 vec n 為 g n,g g t 可以逆推出 vec 0 把 vec 表示成 a n vec 將題目中的 f s sum limits g sum l...

牛客CSP S提高組賽前集訓營2

然後隨便用乙個資料結構維護一下就行了,我寫的線段樹。我們先找出每個環,然後我們先刪連線環的邊,每刪一條就可以多產生乙個聯通塊,在考慮刪環邊,發現從最大的環刪起一定最優 因為你刪的第一條邊得不到任何新的聯通塊 就很容易想到tar jantarjan tarjan 發現你只能寫出80 8080 分,因為...

牛客CSP S提高組賽前集訓營1

比賽鏈結 官方題解 before t1觀察 結論題,t2樹形dp,可以換根或up down,t3正解妙,轉化為圖上問題。題目質量不錯,但資料太水了 一共n個石子堆,每個石子堆有ai個石子,兩人輪流對石子塗色 先手塗紅,後手塗藍 且需要保證當前回合塗的石子顏色不能和它相鄰的兩個同色,誰塗不下去誰輸。一...