贪心,对于一个修饰关系可以连一条有向边,在合并的时候,子节点的序列一定是连续安排的,因为如果有交叉,交换以后一定更优。

然后一个序列一个序列的考虑,长度短的应该在前面,否则同样交换以后更优。因此排序以后统计就行了。

数据理论最多递归1e6层,dfs爆栈了,手写栈模拟递归。。。

#include<bits/stdc++.h>
using namespace std; const int maxn = 1e6+; vector<int> G[maxn];
int M[maxn];
typedef long long ll;
long long ans;
bool cmp(int a,int b) { return M[a] < M[b]; } struct Frame
{
int u,i;
};
stack<Frame> dfs;
inline void CreatFrame(int u){ dfs.push({u,});} #define PS push
void DFS(int s)
{
CreatFrame(s);
bool pre = true;//pre or post
while(dfs.size()){
loop:
int u = dfs.top().u, &i = dfs.top().i;
for(; i < (int)G[u].size(); i++){
if(pre) {
CreatFrame(G[u][i]);
goto loop;
}
M[u] += M[G[u][i]];
pre = true;
}
sort(G[u].begin(),G[u].end(),cmp);
for(int i = ; i < (int)G[u].size(); i++){
ans += M[G[u][i]]*((ll)G[u].size()-i-);
}
dfs.pop(); pre = false;
}
}
int rts[maxn]; //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
int n; scanf("%d",&n);
int c = ;
for(int i = ; i < n; i++){
int f; scanf("%d%d",M+i,&f);
if(~f){ G[f].push_back(i); }
else rts[c++] = i;
}
while(c--){
DFS(rts[c]);
}
printf("%lld\n",ans);
return ;
}

另外拓扑排序也可以避免递归

#include<bits/stdc++.h>
using namespace std; const int maxn = 1e6+; int hd[maxn],nx[maxn],to[maxn],ec; void add(int u,int v)
{
nx[++ec] = hd[u];
to[ec] = v;
hd[u] = ec;
} int M[maxn];
int fa[maxn],deg[maxn]; typedef long long ll; int stk[maxn];
int q[maxn]; //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
int n; scanf("%d",&n);
int rt = ;
for(int i = ; i < n; i++){
int f; scanf("%d%d",M+i,&f);
if(~f){
add(f,i); deg[f]++;
}
fa[i] = f;
}
int frnt = , tail = ;
for(int i = ; i < n; i++){
if(!deg[i]) q[tail++] = i;
}
long long ans = ;
while(frnt<tail){
int u = q[frnt++];
int top = ;
for(int i = hd[u]; i; i = nx[i]){
stk[top++] = M[to[i]];
}
sort(stk,stk+top);
for(int i = ; i < top; i++){
ans += stk[i]*(ll)(top-i-);
}
if(~fa[u]){
M[fa[u]] += M[u];
if(!--deg[fa[u]]) q[tail++] = fa[u];
}
}
printf("%lld\n",ans);
return ;
}

最新文章

  1. CSS实现DIV超长截断,并显示...
  2. Request header is too large
  3. IRaster、IRasterlayer、IRasterdataset之间的转换
  4. Spring Roo
  5. C++堆栈与函数调用
  6. sharepoint 2010 如何使用sharepoint多媒体视频播放media webpart功能
  7. 简明解释算法中的大O符号
  8. Object-C @synthesize -- 笔记
  9. Launcher知识的demo,手机管家小伙家与悬浮窗
  10. Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
  11. 微信跳一跳Python
  12. 玩转接口测试工具fiddler 教程系列1
  13. 判断当前设备是移动端或者PC端
  14. FORM的静态提交
  15. css 常用的绝对定位元素水平垂直居中的方法
  16. TZOJ 3134: 渊子赛马修改版
  17. Adobe PhotoshopCC2017 安装与破解(Mac)
  18. Jquery常用的一些事件 keyup focus
  19. Javascript 创建对象的三种方法及比较【转载+整理】
  20. [OpenCV] Samples 09: plImage &lt;==&gt; Mat

热门文章

  1. 某人视频中提到的 Spark Streaming 优化的几点事项
  2. [Xcode 实际操作]三、视图控制器-(12)在Storyboard中使用集合控件
  3. Nacos深入浅出(九)
  4. FoundToday for HK 技术支持
  5. IIS上部署网站问题总结
  6. ECharts 上手
  7. 项目 08 WebSocket
  8. Python——连接数据库
  9. Eclipse中mybatis的xml文件没有提示,出现the file cannot be validated as the XML definition.....
  10. Murano package