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

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

数据理论最多递归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 ;
}

Aizu 2456 Usoperanto (贪心)的更多相关文章

  1. Aizu 2456 Usoperanto 贪心 拓扑排序

    Usoperanto Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/contest_show.php?cid= ...

  2. 贪心+拓扑排序 AOJ 2456 Usoperanto

    题目传送门 题意:给出一条链,比如x连到y,x一定要在y的左边,且代价是这条链经过的点的权值和,问如何排序使得代价最小 分析:类似拓扑排序,先把入度为0的点入队,把指向该点的所有点按照权值排序,保证这 ...

  3. Aizu 2302 On or Off dfs/贪心

    On or Off Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.act ...

  4. POJ - 2456 Aggressive cows(二分+贪心)

    题意:把c个牛分进n个摊位,摊位位置已知,所有摊位分布在0 <= xi <= 1,000,000,000,问两头牛间最小距离的最大值. 分析:找所有最小距离取个最大的.所以二分找这个最小的 ...

  5. coderforces Gym 100803A/Aizu 1345/CSU 1536/UVALive 6832 Bit String Reordering(贪心证明缺)

    Portal: http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1345  http://codeforces.com/gym/100 ...

  6. POJ 2456: Aggressive cows(二分,贪心)

    Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20485   Accepted: 9719 ...

  7. Aizu 0525 Osenbei(状压+贪心)

    题意:翻煎饼,只能横着翻或者竖着翻.问最多有多少朝上? 行只有10,所以枚举一下2^10的状态,每列取0或1中最大的一个. 在枚举外面把饼翻好,枚举里面指针指一下就好.(位运算或bitset乱搞 #i ...

  8. Aizu 0033 Ball(dfs,贪心)

    日文题面...题意:是把一连串的有编号的球往左或者往右边放.问能不能两边都升序. 记录左边和右边最上面的球编号大小,没有就-1,dfs往能放的上面放. #include<bits/stdc++. ...

  9. POJ 2456 Aggressive cows ( 二分 && 贪心 )

    题意 : 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1e9) ...

随机推荐

  1. The Little Prince

    Chapter 1 That is why, at the age of six, I gave up what might have been a magnificant career as a p ...

  2. Java中Object类的公有方法

    HashCode();wait();notify();equals();getClass();toString();clone();finalize(); 这里只是简单介绍一下其中的几个函数: Has ...

  3. 2018宁夏邀请赛G(DFS,动态规划【VECTOR<PAIR>】)

    //代码跑的很慢四秒会超时,结尾附两秒代码(标程) #include<bits/stdc++.h>using namespace std;typedef long long ll;cons ...

  4. Java8 使用 stream().filter()过滤List对象(查找符合条件的对象集合)

    内容简介 本文主要说明在Java8及以上版本中,使用stream().filter()来过滤一个List对象,查找符合条件的对象集合. List对象类(StudentInfo) public clas ...

  5. go语言实战教程:项目文件配置和项目初始化运行

    在上节内容中,我们已经搭建了实战项目框架,并将实战项目开发所需要的静态资源文件进行了导入.在本节内容中,我们将讲解如何通过相关的配置,并初始化运行项目. conf配置文件读取配置信息 我们前面说过,使 ...

  6. 洛谷P1066 2^k进制数

    P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. ( ...

  7. MCP|DYM|Quantitative mass spectrometry to interrogate proteomic heterogeneity in metastatic lung adenocarcinoma and validate a novel somatic mutation CDK12-G879V (利用定量质谱探究转移性肺腺瘤的蛋白质组异质性及验证新体细胞突变)

    文献名:Quantitative mass spectrometry to interrogate proteomic heterogeneity in metastatic lung adenoca ...

  8. TOPOI 测验1320, 问题C: 4410: [CF41D]Pawn 解题报告

    题目链接 题目大意 在一个树阵中按一定走法取一些树,使和最大且被 k+1整除 解题思路 类似一个数塔问题 因为最后的结果要被 k+1 整除,所以可以记录到每一个点  对 k+1 取余结果不同的最优解( ...

  9. POJ1016 Numbers That Count

    题目来源:http://poj.org/problem?id=1016 题目大意: 对一个非负整数定义一种运算(inventory):数这个数中各个数字出现的次数,然后按顺序记录下来.比如“55531 ...

  10. python中enumerate、xrange、range

    enumerate可以给列表自动生成一列,默认从0开始,自动增长1,可以指定默认开始值 list_product = ["thinkpad","macbook" ...