CSP S 模擬測試 51 題解

2022-05-06 19:54:29 字數 3475 閱讀 9743

慣例先看一遍三道題,t1 一開始反應要求割點,但是這是有向圖,肯定不能求割點,康了一下資料範圍,有40%是樹的,還不錯,決定待會在打。

看t2 字串題,完了我字串最弱了,肯定只能打暴力了,帶著前兩題都不會的心情,看了t3發現是期望,完了爆0了,在一看,發現是sb原題,還簡單一點,趕緊把t3碼了一遍過大樣例,覺得很穩就交了,然後用一點時間把t1樹的分給碼了,然後開始磨t2,發現啥都不會開始dfs,一開始覺得只能拿30pts,後來發現沒有回溯是$o(n^2)$的,打完就沒剩多少時間了,然後考慮t3要不要開long long,覺得沒必要就沒開石樂智。然後想t1無果。

出分發現t3wa 80,然後把開了long long的**交上去a了,我怕不是個傻子,不卡時間為什麼不開long long啊qaq。t2a了,t140,後來聽說用樹的方法跑所有測試點能拿60,艹。少兩句話少拿40.jpg。

扯多了2333

t1 attack:

據說是什麼支配樹裸題,蒟蒻不會,只能照著題解打。

必經關係是一棵樹,這好像就是支配樹?那麼1到k的必經點就是k在這棵樹上的祖先,所以我們在有向圖中跑個拓撲排序,就可以建出這棵樹,但實際上我們並不需要真正建出這棵樹,只需要維護求lca所用的fa陣列和dep陣列即可。另外,因為題目中說所有點都從1開始,所以一開始只要把1入隊就吼了。

再說一下我的sb手殘錯誤

我是大裝置

1 #include2

using

namespace

std;

3const

int n=1e5+10;4

const

int inf=1e9+7;5

int first[n],nex[n<<1],to[n<<1

],tot;

6void add(int a,int

b)9 vector in

[n];

10int d[n],du[n],fa[n][18

],v[n],w[n];

11int lca(int x,int

y)18

19int

main()

30 queueq;

31 q.push(1

);32

//d[1]=0;

33/*

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

*/44

//for(int i=1;i<=n;++i) if(!du[i]) q.push(i)/*,du[i]=inf*/;

45while

(q.size())59}

60}61//

for(int i=1;i<=n;++i,cout<62

for(int i=1;i<=que;++i)70}

71/*

724 3 2

731 2

742 3

752 4

762 3 4

772 2 4

78*/

attack

t2 reverse:

只需要考慮最後一位是什麼就好了,然後誰長就縮誰,直到他們兩個一樣長,就一起縮,博主打的是dfs,細節很多,很難調,所以**就不提供了,所以就以soul神的**為參考吧。

鳴謝soul

1 #include2

#define re register

3using

namespace

std;

4int t,a[2010],b[2010]; char s[2010]; int

len;

5 inline bool

cmp()

11signed main()

24else

if(a[0]0

])25

while(b[0]>a[0

])29

else

if(a[0]==b[0

])35}36

if(a[0])

37else puts("-1"

);38}39

return0;

40 }

reverse

t3 tree:

原題,不,比原題簡單,然後賽時第乙個提交,成功long long見祖宗,喜提wa80。

題解是什麼方法我也不知道,所以就用自己的方法說了還不是頹的以前的題解。

我們設$f[x]$表示從$x$到$fa[x]$的期望步數,$g[x]$表示從$fa[x]$到$x$的期望步數。

考慮轉移$f[x]=\frac+\sum}$

挺顯然的,就是他可以直接上去,也可能先下去在上去。

化簡得$f[x]=du[x]+\sum$,一遍dfs可以求出

在來考慮g的轉移

$g[x]=\frac+\frac+\frac}$

其實和f的轉移也差不多就是分類討論,可以直接下去,可以到x的兄弟節點也可以到x的父節點的父節點。

化簡得$g[x]=du[fa]+g[fa]+\sum$

然後樹上字首和就可以求出從根到x的期望步數了。

吐槽:考試時知道答案一定是整數就沒開double,然後,關於int,他死了最後都想到開long long了為什麼不交啊,我的首殺。

1

//yuanti2//

xingkuizuoguo

3 #include4

using

namespace

std;

5const

int n=1e5+10;6

#define int long long

7int first[n],nex[n<<1],to[n<<1

],tot;

8void add(int a,int

b)11

int f[n],g[n];//

f[x] x->fa[x] g[x] fa[x]->x

12int

sumg[n],sumf[n];

13int

du[n];

14void dfs(int x,int

fa)22 sumf[x]=f[x];23}

24void dfs1(int x,int

fa)31}32

void dfs2(int x,int fa)39}

4041

signed main()

51 dfs(1,0

);52 f[1]=0

;53 dfs1(1,0

);54 sumg[1]=g[1

];55 dfs2(1,0

);56

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

//cout<58

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

//cout<60

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

64/*653

661 2

672 3

68*/

tree

CSP S模擬測試94 題解

高精硬上似乎跑不過,其實可以都取個 log 那麼只需要比較 y times log x 和 sum limits y log i 就好了。includeusing namespace std int t double x,y void work int main 顯然目標區間合法的充要條件是 把位置...

CSP S模擬測試69 題解

一如既往的垃圾,又回到了那個場場墊底的自己,明明考場上都想到正解了,但是就是拿不到分,可能是互奶把rp用光了吧以後一定加強訓練 能力。t1 考場上一直yy矩陣快速冪,雖然自己矩陣快速冪一點都不會還是硬著頭皮yy,發現不可做之後並沒有及時轉化思路,但其實自己預處理的陣列就是正解。切記 不僅矩陣快速冪是...

CSP S模擬測試50 反思 題解

大部分人都覺得t3是道不可做題去剛t1t2了,於是我就僥倖苟到了前面?這場考試比較成功的就是快速水掉了t1t2的部分分,1h拿到88分起碼為之後硬肝t3上了保險 賽後發現就算t3爆零也能rank15?剩下也就沒什麼了 t3的分完全是時間堆出來的,還有運氣成分。因為當時第乙個a掉了二分答案專題的奶牛健...