数据恢复
时间:2021-10-07
本文章向大家介绍数据恢复,主要包括数据恢复使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Description
Solution
容易想到一个贪心的思路,记得有个叫什么国王的游戏的题,大概就是考虑邻项作差。如果 \(x\) 在前面比 \(y\) 在前面更优的话,一定有
\[b_{x}(a_y+S)+b_yS > b_y(a_x+S)+b_xS
\]
化简可得
\[b_xa_y > b_ya_x
\]
所以最有的情况是按这个排序再依次取。如果扩展到树上的话,就可以用一个堆维护,每次取出最大的。
但是这样实际上是错的,因为有依赖关系,即可能有一个点的 \(\frac{b}{a}\) 很小,但它的儿子却很大。这和蓝书上一道染色的题是一个道理。一个性质是,当前所有节点权值最大的点一定会在其父亲被选取之后立即被选择。那么就可以根据这个倒序更新答案,每次把权值最大的点合并到它的父亲,同时计算贡献。可以用并查集维护。
#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
inline int read(){
int x=0,flag=1; char c=getchar();
while(c<'0'||c>'9'){if(c=='-') flag=0;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-48;c=getchar();}
return flag? x:-x;
}
const int N=3e5+7;
ll a[N],b[N];
int Fa[N],fa[N],sz[N];
struct Node{
int pos,sz; ll x,y;
Node(int pos_=0,int sz_=0,ll x_=0,ll y_=0):
pos(pos_),sz(sz_),x(x_),y(y_){}
bool operator <(const Node &X) const{
return y*X.x<X.y*x;
}
};
int find(int x){
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
priority_queue<Node> Q;
int main(){
int n=read(); fa[1]=sz[1]=1;
for(int i=2;i<=n;i++) Fa[i]=read();
for(int i=1;i<=n;i++){
a[i]=read(),b[i]=read();
if(i!=1) Q.push(Node(i,sz[fa[i]=i]=1,a[i],b[i]));
}
ll ans=0;
while(!Q.empty()){
Node t=Q.top(); Q.pop(); int u=t.pos;
if(t.sz!=sz[u]) continue;
int x=find(Fa[u]),y=find(u);
if(x==y) continue;
ans+=a[y]*b[x];
a[x]+=a[y],b[x]+=b[y];
sz[x]+=sz[y],fa[y]=x;
if(x!=1) Q.push(Node(x,sz[x],a[x],b[x]));
}
printf("%lld",ans);
}
原文地址:https://www.cnblogs.com/wwlwQWQ/p/15375965.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Kotlin 使用DSL构建语法结构 看这一篇就够了~
- 浙大版《C语言程序设计(第3版)》题目集 习题4-2 求幂级数展开的部分和
- 2020 年 9 月编程语言排行榜
- 浙大版《C语言程序设计(第3版)》题目集 习题4-3 求分数序列前N项和
- 浙大版《C语言程序设计(第3版)》题目集 习题4-4 特殊a串数列求和
- 一个可能让你的页面渲染速度提升数倍的CSS属性
- 浙大版《C语言程序设计(第3版)》题目集 习题4-6 水仙花数
- 浙大版《C语言程序设计(第3版)》题目集 习题4-7 最大公约数和最小公倍数
- 高危漏洞!黑客可利用sudo获得 root权限
- 浙大版《C语言程序设计(第3版)》题目集 习题4-8 高空坠球
- 浙大版《C语言程序设计(第3版)》题目集 习题4-10 猴子吃桃问题
- 6种展示代码的绝佳方式
- 你电脑里的IE浏览器正在被黑客利用
- 浙大版《C语言程序设计(第3版)》题目集 习题6-8 统计一行文本的单词个数
- 浙大版《C语言程序设计(第3版)》题目集 练习7-2 求最大值及其下标