2023年牛客寒假集訓營第一場題解

2021-10-18 19:27:40 字數 3490 閱讀 8267

a、 串

思路:一共n個字元,可以轉化為 i (1<=i<=n) 個字母中包含"us"的方案數之和

用 f[i][2/1/0] 表示前 i 個字母中 含有us/含u但不含us/既不含u也不含us 的方案數

然後可得狀態轉移方程:

f[i][0] = 25 * f[i - 1][0] //前i-1個字元不含u也不含s,那麼第 i 個字元除了u可以在另外25個字母中隨便填

f[i][1] = f[i - 1][0] + 25f[i - 1][1] //前i-1個字元既不含u也不含us的話,那麼第 i 個就填u,前 i-1 個字元含u不含us的話,第i個除了s之外25個字母中隨便填

f[i][2] = f[i-1][1] + 26f[i-1][2] //前i-1個字元含u不含us的話,那麼第 i 個就填s,前 i-1 個字元含us的話,第i個可以在26個字母中隨便填

初始化:f[1][0] = 25,f[1][1] = 1,f[1][2] = 0;

**:

#include

using

namespace std;

typedef

long

long ll;

const

int n =

1e6+

5, mod =

1e9+7;

ll n, ans;

//f[i][0]表示前i個字元沒有u的串的數量

//f[i][1]表示前i個字元有u無us的串的數量

//f[i][2]表示前i個字元有us的串的數量

ll f[n][4

];intmain()

printf

("%lld\n"

, ans)

;return0;

}

b、 括號

思路:若想使構造的括號串最短,可以先構造出乙個「((…))」的對稱符號串,該符號串中的合法括號對有k*k個(k為對稱匹配的括號對數量),然後在此基礎上插入新的半邊括號即可構成有任意對數的括號串

**:

#include

using

namespace std;

typedef

long

long ll;

ll k;

string s;

intmain()

if(t2 <= t1)

else

}return0;

}

c、紅與藍

思路:從葉節點入手,從葉節點開始,將它的顏色染成和它父親相同的顏色,如果按這個規律染完後所有的節點都染上色了,那麼就構造成功了,否則就無法構造滿足條件的染色樹

**:

#include

using

namespace std;

const

int n =

1e5+

5, m = n *2;

int n, idx, cnt;

bool flag =1;

int h[n]

, e[m]

, ne[m]

;int f[n]

, col[n]

;void

add(

int a,

int b)

void

dfs1

(int x,

int fa)

//若該節點沒有子節點或者該節點未被染色 if(

!son ||

!f[x]

)//若其父節點未被染色則給其染上相同的顏色

f[x]

= f[fa]

=++cnt;;}

}void

dfs2

(int x,

int fa)

}int

main()

dfs1(1

,0);

//若根節點未被染色或有節點沒有被染色

if(f[0]

||!flag)

//根節點染上紅色

col[1]

=1;dfs2(1

,0);

for(

int i =

1; i <= n; i++

)return0;

}

f、 對答案一時爽

思路:最小值為0,最大值為n加上兩人所選的相同選項數

**:

#include

using

namespace std;

char a[

105]

, b[

105]

;int

main()

printf

("%d 0\n"

, n + k)

;return0;

}

h、冪塔

思路:找規律/尤拉降冪(待補)

i、限制不互素對的排列

思路:重點在於題目中的 k <= n/2 ,答案就很顯然了,當k < n/2時,在前面放 k+1 個偶數即可,當 k == n/2 時,將偶數6放在最後,然後6後面接上3,後面位置從1開始按順序放沒有用過的整數即可

**:

#include

using

namespace std;

int n, k;

vector<

int> v;

set<

int> s;

intmain()

for(

int i =

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

return0;

}

j、一群小青蛙呱蹦呱蹦呱

思路:剩餘的數除了1以外,每個數一定可以分解為兩個或兩個以上質數相乘,求多個數的最小公倍數實際上就是求所有數**現的每個質因子的最大次方,然後相乘即可

所以先用尤拉篩篩出1 ~ n中的所有質數,然後求出每個質數在1 ~ n出現的最大次方(推公式)相乘,注意此時我們只用篩選1 ~ n/2 部分的質數即可

**:

#include

using

namespace std;

typedef

long

long ll;

const ll n =

2e8+

5, mod =

1e9+7;

ll n, k, ans =1;

ll prime[n]

;bool st[n]

;void

init

(ll m)}}

ll qpow

(ll a, ll b, ll m)

return ans;

}int

main()

if(ans ==1)

puts

("empty");

else

printf

("%lld\n"

, ans)

;return0;

}

2020牛客寒假演算法基礎集訓營第一場(補題)

題目描述 hanayo很喜歡吃公尺飯。有一天,她拿出了 個碗,第乙個碗裝了 粒公尺飯,第二個碗裝了 粒公尺飯,以此類推,第 個碗裝了 粒公尺飯。然而,愛搞惡作劇的rin把所有的碗的順序打亂,並拿走了乙個碗。hanayo想知道,rin拿走的碗裡有多少粒公尺飯?輸入描述 第一行輸入乙個正整數 代表原始的...

2023年牛客寒假集訓營第五場題解

c 石子遊戲 思路 利用差分陣列將區間修改轉化為兩個端點處的單點修改,按照每次新增乙個長度為 k 的區間的規則,首先從左到右將所有點補到該點左邊比它高的點的高度,再從右到做將所有點補到該點右邊比它高的點的高度,最後特判一下第 n k 1 個點 因為差分時以該點為左端點的區間右端點無法判斷 然後如果能...

2023年牛客寒假集訓營第二場題解

d 牛牛與整除分塊 思路 整數分塊有乙個性質,對於乙個整數n,當k n sqrt n 1 時,每個 n k 都是不同的,否則看n k是幾,然後利用對稱軸x n sqrt n 對稱過來 圖源自出題人 f 牛牛與交換排序 思路 如果有解的話k值一定是唯一的,那麼先確定k值,然後判斷這個k值是否可行。手寫...