NOIP模拟测试5「星际旅行·砍树·超级树」
星際旅行
0分
瞬間爆炸。
考試的時候覺得這個題怎么這么難,
打個dp,可以被兒子貢獻,可以被父親貢獻,還有自環(huán),葉子節(jié)點連邊可以貢獻,非葉子也可以貢獻,自環(huán)可以跑一回,自環(huán)可以跑兩回,
關(guān)鍵是同一子樹會貢獻,不同子樹也會貢獻。
這還不是歐拉圖歐拉路問題,awsl
然后我就放棄了這個題
考完試看題解,tm一個大水題
雖然好像不算水,
思考兩個點之間因為連接的是無向邊,所以所有點入度出度都為2。
先不考慮自環(huán)
如果把兩個點之間無向邊拆成兩個有向邊,那么問題就變成去掉兩個邊使原圖存在歐拉路。
于是乎,問題就變得很簡單了
如果有自環(huán)
可以去掉兩個自環(huán),或者去掉一個自環(huán)和一個邊
砍樹
做砍樹時問大佬說,“這是一個數(shù)論分塊”模板題
我:???
原來只有我沒學(xué)過數(shù)論分塊嗎?
https://www.cnblogs.com/0xfffe/p/9648943.html
略微理解了理解,寫的非常清楚
你說這是向下取整,不是向上取整,砍樹要向上取整,那篇博客不適用于砍樹?
確實不適用
我們要分塊的是等式右面的$\sum_{i}^{n} a[i]? +k$除以d
因為C是固定的,所以這是一個分段函數(shù),我們要處理的是不同的右面的值最后再跟左面對應(yīng)
我們?nèi)缓骹存下這一段具體的值,
r存下具體右端點
然后就完了
代碼
?
#include<bits/stdc++.h> using namespace std; #define ll long long #define A 11000000 ll l=1,r,n,m,a[A],dl[A],R[A],f[A],zz=0,num=0,ans=0,sum=0; void precl() {while(1){if(!(sum/l)) break;r=sum/(sum/l);f[++num]=sum/r;R[num]=r;l=r+1;} }int main(){scanf("%lld%lld",&n,&m);sum=m;for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);sum+=a[i];}precl();for(ll j=1;j<=num;j++){ll t=0;for(ll i=1;i<=n;i++){t+=ceil((double)a[i]/(double)R[j]);} // printf("f=%lld R=%lld\n",f[j],R[j]);if(t<=f[j]) ans=R[j];}cout<<ans<<endl; }?
?
以下是我完全錯誤的解釋
設(shè)$k\times i-p=N$ 向上取整設(shè)
$\large{\lceil \frac N{i+d} \rceil}=k$
于是$k\times (i+d)-p2=N$
同樣得出p2=p+kd
就是照貓畫虎的一個過程
底下我不具體推了,
$\large \left \lceil \frac N{\left \lfloor \frac Ni \right \rfloor } \right \rceil$
所以對砍樹這道題來說,這確實是個模板題,分析發(fā)現(xiàn)這是一個分段函數(shù),維護每一段大小相同,維護l,r下一個l=r+1
具體來說
$\large \left \lceil \frac {a[i]}ze8trgl8bvbq \right \rceil$不是為我們具體分塊的值
$\large \lfloor \frac Ni \rfloor$才是
然后等式右面是$\sum_{i}^{n} a[i]? +k$再除以d
這個N就是$\sum_{i}^{n} a[i]? +k$
那么這個題就迎刃而解了。
?
超級樹
?等我AC了可憐與超市
轉(zhuǎn)載于:https://www.cnblogs.com/znsbc-13/p/11209930.html
總結(jié)
以上是生活随笔為你收集整理的NOIP模拟测试5「星际旅行·砍树·超级树」的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jmeter学习笔记(八-1)
- 下一篇: 如何巧妙利用 iPhone 原生相机里的