Full_of_Boys训练5总结
題目來源:2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest
A. Advertising Strategy
貪心方法:把一部分k放到初始值,剩下一部分,等到最后用。然后,枚舉第一部分放多少即可。
#include <bits/stdc++.h> typedef long long ll; using namespace std; ll n,k,ans=1000000000000000000LL; int main() {scanf("%lld %lld",&n,&k);if(n<=k) {puts("1");return 0;}for(int t=1;t<=k-1;++t) {ll a1=t,tt=1;a1 = a1 + min(a1, (n-a1)/2);while(a1 < n-k+t) {a1 = a1 + min(a1,(n-a1)/2);++tt;}++tt;ans = min(tt, ans);}printf("%lld\n", ans);return 0; }C.?Carpet
先樹剖,構造方法:把重兒子放到當前層的最右端,輕兒子放到下一層,第二次dfs注意順序,否則會交叉。這樣保證高度為logn。。。先是想到如果樹低,可以一層層放,我覺得這種題,一種做法就是多手動構造幾組解,然后找找規律。另一種思路,就是觀察數據范圍,20和100000,首先,第一個數很小,就考慮如何降低深度,于是想到了重心,可是感覺沒啥用,再怎么調深度也不夠,就得朝著把一些比較長的鏈拿出來,放到一排上這個思路做,那就先求直徑,然后,把直徑上的點放在第一排,對于這些點延伸出的子樹,再求直徑,從左到右放在,第二排,遞歸的再去放第三排,這樣應該是有保證的吧,,,寫出來wa了。。哎再改改。。然后樹剖這個思路相對比較好寫吧。。。手懶腦子差。。。只好膜題解。后期也有問題,擅自認慫了,三個人一起剛掉G。。。沒有同時開題,現場一定要避免這種問題。還有些時候,A完簽到題,就放松了。。。腦子停轉的問題,還是很嚴重。
update :好吧,那個每次求直徑的貪心可以卡掉。。。樹的長相如下,這可能只是樹的一部分,即它的葉子節點也許會連和他類似的結構。顯然如果不幸,每次都找到分叉最少的那條直徑。樹的深度,就沒有保證了。。。所以,我們每次怎么算出一棵樹中分叉最多的直徑呀?bfs的時候處理一下度數和最大的路徑?然而還是wa。。。到這好像再想不到樹剖就太zz了,保證重鏈數上界logn條。。。這么優秀的做法。
update:又想了想。。。我每次保證當前這棵樹的重心在這一層,選出過重心的最長徑or度數和最大路徑。。。可以嗎???
發現構造題,有些布星啊。有時間多學點組合構造玩。。。
#include <bits/stdc++.h> const int maxn = 1e5 + 7; using namespace std; struct edge{int e,nxt;}E[maxn<<1]; int h[maxn],cc; void add(int u,int v){E[cc].e=v;E[cc].nxt=h[u];h[u]=cc;++cc; } int sz[maxn], fa[maxn], son[maxn]; void dfs1(int u,int pre){sz[u]=1;fa[u]=pre;for(int i=h[u];~i;i=E[i].nxt){int v=E[i].e;if(v!=pre){dfs1(v,u);sz[u]+=sz[v];if(son[u]==-1||sz[v]>sz[son[u]])son[u]=v;}} } int X[maxn],Y[maxn],cnt[55]; void dfs2(int u, int d){X[u]=++cnt[d];Y[u]=d;for(int i=h[u];~i;i=E[i].nxt){int v=E[i].e;if(v!=son[u]&&v!=fa[u])dfs2(v,d+1);}if(son[u]==-1)return;dfs2(son[u],d); } int n,x,y; int main() {scanf("%d",&n);for(int i=1;i<=n;++i)h[i]=son[i]=-1;for(int i=1;i<n;++i)scanf("%d%d",&x,&y),add(x,y),add(y,x);dfs1(1,0);dfs2(1,1);for(int i=1;i<=n;++i)cout << X[i] <<' '<<Y[i]<<'\n';return 0; }D.?Decoding of Varints
卡unsigned long long。。。注意運算過程
G. God of Winds?
設第一個位置的值為0,然后可以通過遞推,求出整張圖每個位置的值。check一下,是否矛盾即可。WA點:爆int!!!!這道題,一個難點就是考讀題。。。讀懂之后,想到把整個圖每個位置設成未知數,求解方程,顯然會tle。然后,覺得是不每行都能解方程??oldz推了一下,說方程解不了,有一個未知數。反應了半天。其實就是有一個自由項。那我隨便設它是什么就行了。然后就可以通過,格子之間的關系推出整張圖辣。以后,再也不用int了。。。
H.?Hilarious Cooking
發現一定可以構成連續的一段T,那么考慮如何計算出最大值,最小值,再判斷一下,是否在區間內就行了。顯然,如果只有兩端給定,一段區間的最值只受兩端影響。那么,分別計算每段的最值加起來就行。注意還有兩頭要考慮。然后,每段的最值,就可以堆一推公式,o(1)計算了。嘴完了。(感覺挺簡單的啊。。除了討論那塊比較麻煩,為啥就沒讀這題。。不能盲目跟榜哇
?
轉載于:https://www.cnblogs.com/RRRR-wys/p/9038908.html
總結
以上是生活随笔為你收集整理的Full_of_Boys训练5总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 流氓软件怎么找根目录删除流氓软件怎么找根
- 下一篇: Full_of_Boys训练6总结