NOIp模擬賽 西行妖下

2022-05-09 12:30:12 字數 1723 閱讀 7212

題目描述:

給出一棵n個節點的樹,每個點初始m值為1。

你有三種操作:

1.add l r k ,將l到r路徑上所有點m值加k。

2.multi l r k ,將l到r路徑上所有點m值乘k。

3.query l r ,設x是l到r路徑上的點,y是x的m值。假設有1~y共y個點,隨機打亂,求形成錯排的概率。

(k<=1000,n<=80000)

題解:樹剖正解?

(反正我用的dfs序+並查集)

首先1000^80000錯排怎麼搞啊?

要明白我們真正要的並不是錯排數,而是錯排數/階乘。

打表後發現他是:

0.0,0.5,0.333333333,0.375,0.366666667,0.368055556,0.367857143,0.367881944,0.367879464

最後一位用的一般值。

(後來發現這個精度依然不夠,要用錯排遞推直接打表。不然會卡精。)

樹鏈怎麼修改啊?

其實可以用單點修改……

重點在於一共只有80000個點,如果m值超過15就不用處理了,保留15位就夠了……

所以單點最多修改80000*15次……

並查集維護。

**:

#include#include

#include

using

namespace

std;

//lgl ak in noip

#define n 80050

double num[15],tmp[15

];void

init()

}int

n,hed[n],cnt,q;

char ch[20

];struct

ege[

2*n];

void ae(int ff,int

t)struct

aaafku

}int qry(int

x)

return

ret;

}}f[15

];int

las[n];

intdep[n],siz[n],fa[n],son[n],top[n],typ[n];

inttin[n],tout[n],tim;

void dfs1(int u,int

ff) tout[u]=tim;

f[1].ins(tout[u]+1,-1);}

void dfs2(int u,int

tp)}

int get_lca(int x,int

y)

return dep[x]x:y;

}int get_las(int

x)void deala(int u,int k,int

lim)

void dealb(int u,int k,int

lim)

intmain()

dfs1(

1,1),dfs2(1,1

); scanf("%d

",&q);

for(int l,r,k,i=1;i<=q;i++)

printf(

"%.1lf\n

",ans);

}else

else}}

return0;

}

noip模擬賽 密碼

表示沒看懂演算法3 問題描述 有壓迫,就有反抗。mored的寵物在法庭的幫助下終於反抗了。作為乙隻聰明的寵物,他打算把魔法使mored的魔法書盜去,奪取mored的魔法能力。但mored怎麼會讓自己的魔法書輕易地被盜取?mored在魔法書上設定了乙個密碼鎖,密碼鎖上有乙個問題。施以斯臥鋪魔法吧,你有...

NOIP模擬賽 老師

題目描述 一座有n層的教學樓裡有一些學生,第i 0 i n 層有studentsi個學生。你被給定了乙個數k,如果第i層有x個學生,那麼這一層需要 x k 個老師。你可以調整每個學生的樓層,但是每個學生至多只能調整一層,就是說第i層的學生只能去第i 1層 如果有的話 第i層 第i 1層 如果i 1 ...

NOIP模擬賽 分錢

題目描述 兩個人在街上撿到了一些錢,這些錢共有n張,他們等了很久也沒有等來失主,於是決定把錢平分。但錢可能無法平分。他們先把能夠平分的錢盡量先平分了,使得剩下不能平分的錢盡量少。這些不能平分的錢怎麼辦呢他?他們決定拿去賭場裡面賭一把。他們運氣太好了,那些不能平分的錢變成了雙倍,於是他們就把那個錢分了...