Codeforces Round 1107 (Div. 3)DE

📅 2026/7/2 8:28:23
Codeforces Round 1107 (Div. 3)DE
D思路肯定是一个一个操作或者两个两个操作最优对于a[i]b[i]的这种情况很好办直接加就行难点在于a[i]b[i]的这种情况这种情况不好办那么a[i]b[i]可以看成这个点的价值可以对右边产生贡献例如1 3 45 3 1我可以先1 0 42 0 4再1 3 42 3 4最后给1加上1就行了所以这个a[i]b[i]这个差值是可以向右一直移动的为了模拟我们令now初始0遇到a[i]b[i]则1遇到a[i]b[i]就减少如果不够这个减就说明方案不可行输出no代码void solve(){ int n;cinn; vectorinta(n10),b(n10); for(int i1;in;i) cina[i]; for(int i1;in;i) cinb[i]; int now0; for(int i1;in;i){ if(a[i]b[i]){ nowb[i]-a[i]; } else{ if(nowa[i]-b[i]){ coutNOendl; return; } now-(a[i]-b[i]); } } coutYESendl; }E思路u v w观察样例发现中间的节点要被乘三次所以中间节点是完全平方数对中间节点进行操作可知有两种贡献方式一种是中间节点是u,v,w其中一个一种是不是对应了选2还是3个“儿子”选两个int s20; int kson.size()-1; vectorintcnt2(k10); for(int i1;ik;i){ cnt2[i]son[i]*(s-son[i]); s2cnt2[i]; } s2/2;选三个int s30; for(int i1;ik;i){ s3son[i]*(s2-cnt2[i]); } s3/3; anss2s3;代码void solve(){ int n;cinn; vectorinta(n10); for(int i1;in;i) cina[i]; vectorvectorint g(n10); for(int i1;in-1;i){ int u,v;cinuv; g[u].push_back(v),g[v].push_back(u); } vectorintcnt(n10,1); auto dfs[](auto dfs,int u,int fa)-void{ for(auto v:g[u]){ if(vfa) continue; dfs(dfs,v,u); cnt[u]cnt[v]; } };dfs(dfs,1,-1); vectorintpre(n10); int ans0; auto dfs2[](auto dfs2,int u,int fa)-void{ vectorintson(1); int s0; son.push_back(pre[u]);spre[u]; for(auto v:g[u]){ if(vfa) continue; pre[v]pre[u]cnt[u]-cnt[v]; dfs2(dfs2,v,u); son.push_back(cnt[v]); scnt[v]; } int sqsqrt(a[u]); if(sq*sqa[u]){ int s20; int kson.size()-1; vectorintcnt2(k10); for(int i1;ik;i){ cnt2[i]son[i]*(s-son[i]); s2cnt2[i]; } s2/2; int s30; for(int i1;ik;i){ s3son[i]*(s2-cnt2[i]); } s3/3; anss2s3; } };dfs2(dfs2,1,-1); coutansendl; }