~~~题面~~~

题解:

  这题想法简单,,,写起来真的是失智,找了几个小时的错误结果是inf没开到LL范围。。。。

  首先我们需要找到任意两点之间能够携带黄金的上限值,因为是在经过的道路权值中取min,我们要使得这个min值最大,就应该要在最大生成树上寻找正确的边。求出最大生成树后我们需要在上面倍增寻找权值最小的边,这条边的权值即为携带黄金的上限值。

  于是你可以写最大生成树也可以写kruskal重构树,这里我写的是kruskal重构树,这样以来,因为kruskal重构树的性质,我们只需要寻找对应2个节点的lca,这个lca的点权即为我们要找的值。

  但是注意到题中有一些点可以被列车连通,因为在这些被联通的点之间移动不会带来任何限制,因此我们可以把这些有列车的节点看做一个点(缩点)

  然后注意到题目要求的仅仅是每个卖黄金的地方卖出的黄金数,而且在任意地方买卖的黄金并没有任何其他限制(如价格之类的),因此我们可以每到一个地方就买光所有黄金,然后如果带不到下一个地方去,我们就当我们之前没买过,对道路的上限取min即可。如果最后黄金有剩余,我们也可以直接当做我们没买过。

  于是这题就做完了。

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 501000
#define ac 1001000
#define LL long long
#define inf 1000000000000000LL//!!!!!!!!!!!!!!!!!!!!!
/*因为只需要关心卖出了多少,所以遇到买入的就能买就买,如果要丢弃就当我没买过,
如果有剩余也当我没买过,然后有列车的点可以相互到达,所以就缩点缩起来,然后有路上有负载上限,
所以就跑最大生成树(重构树),然后倍增查最大上限是多少,把剩余黄金对上限取min即可。*/ int n, m, q, cnt, who;
LL have;
int Head[ac], date[ac], Next[ac], tot;
int father[AC], vis[AC], belong[AC], dep[ac];
LL f[ac][], power[ac];//点权or边权(叶节点就是点权,不然就是边权) struct road{
int x, y;LL dis;
}way[ac]; inline bool cmp(road a, road b){
return a.dis > b.dis;
} inline int read()
{
int x = ;char c = getchar(); bool z = false;
while(c > '' || c < '') {
if(c == '-') z = true;
c = getchar();
}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
if(!z) return x;
else return -x;
} inline int find(int x){
if(father[x] == x) return x;
else return father[x] = find(father[x]);
} inline void add(int f, int w){
date[++tot] = w, Next[tot] = Head[f], Head[f] = tot, father[w] = f;
//printf("%d ---> %d : %d\n", f, w, power[cnt]);
} inline void upmin(LL &a, LL b){
if(b < a) a = b;
} void kruskal()//重构树
{
int b = * n;
for(R i = ; i <= b; i ++) father[i] = i;
for(R i = ; i <= m; i ++)
{
int fx, fy;
fx = find(belong[way[i].x]), fy = find(belong[way[i].y]);
if(fx == fy) continue;
power[++cnt] = way[i].dis;
//printf("%d %d %d\n", way[i].x, way[i].y, way[i].dis);
add(cnt, fx), add(cnt, fy);
}
power[cnt + ] = inf, dep[cnt] = , f[cnt][] = cnt;
} void dfs(int x)//倍增
{
int now;
// printf("!!!%d\n", power[x]);
for(R i = ; i <= ; i ++)
f[x][i] = f[f[x][i - ]][i - ];
for(R i = Head[x]; i; i = Next[i])
now = date[i], f[now][] = x, dep[now] = dep[x] + , dfs(now);
} int lca(int x, int y)//要先倍增找到最小上限
{
if(dep[x] < dep[y]) swap(x, y);
for(R i = ; i >= ; i --)
if(dep[f[x][i]] >= dep[y]) x = f[x][i];
for(R i = ; i >= ; i --)
if(f[x][i] != f[y][i])
x = f[x][i], y = f[y][i];
if(x != y) return power[f[x][]];
else return power[x];
} void go(int f, int w)
{
LL lim = (belong[f] == belong[w]) ? inf : lca(belong[f], belong[w]);
/*if(find(belong[f]) != find(belong[w]))
{
for(R i = w; i <= n; i ++) printf("0\n");
exit(0);
}*/
upmin(have, lim);
if(power[w] > ) have += power[w];
else
{
if(have > - power[w])
have += power[w], printf("%lld\n", -power[w]);
else printf("%lld\n", have), have = ;
}
} void pre()
{
n = cnt = read(), m = read(), q = read();
for(R i = ; i <= n; i ++) vis[i] = read(), belong[i] = i;//读入每个城市的访问顺序
for(R i = ; i <= n; i ++) power[i] = read();//读入每个城市的订单
for(R i = ; i <= m; i ++)//读入边
way[i].x = read(), way[i].y = read(), way[i].dis = read();
for(R i = ; i <= q; i ++)//读入有列车的城市
{
int a = read();
if(!who) who = a;
belong[a] = who;
}
sort(way + , way + m + , cmp);
} void work()
{
if(power[vis[]] > ) have = power[vis[]];
else printf("0\n");
for(R i = ; i < n; i ++) go(vis[i], vis[i + ]);
} int main()
{
// freopen("in.in", "r", stdin);
pre();
kruskal();
dfs(cnt);
work();
// fclose(stdin);
return ;
}

[SCOI2013]摩托车交易 kruskal重构树(最大生成树) 倍增的更多相关文章

  1. isaster(Comet OJ - Contest #11D题+kruskal重构树+线段树+倍增)

    目录 题目链接 思路 代码 题目链接 传送门 思路 \(kruskal\)重构树\(+\)线段树\(+\)倍增 代码 #include <set> #include <map> ...

  2. loj2718 「NOI2018」归程[Kruskal重构树+最短路]

    关于Kruskal重构树可以翻阅本人的最小生成树笔记. 这题明显裸的Kruskal重构树. 然后这题限制$\le p$的边不能走,实际上就是要满足走最小边权最大的瓶颈路,于是跑最大生成树,构建Krus ...

  3. kruskal重构树学习笔记

    \(kruskal\) 重构树学习笔记 前言 \(8102IONCC\) 中考到了,本蒟蒻不会,所以学一下. 前置知识 \(kruskal​\) 求最小(大)生成树,树上求 \(lca​\). 算法详 ...

  4. Kruskal重构树入门

    这个知识点好像咕咕咕了好长了..趁还没退役赶紧补一下吧.. 讲的非常简略,十分抱歉.. 前置知识 Kruskal算法 一定的数据结构基础(如主席树) Kruskal重构树 直接bb好像不是很好讲,那就 ...

  5. LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)

    LOJ2718 BZOJ5415 洛谷P4768 Rank3+Rank1无压力 BZOJ最初还不是一道权限题... Update 2019.1.5 UOJ上被hack了....好像是纯一条链的数据过不 ...

  6. UVA1265 Tour Belt Kruskal重构树、倍增、树上差分

    题目传送门 题意:定义$Tour \, Belt$为某张图上的一个满足以下条件的点集:①点集中至少有$2$个点②任意两点互相连通③图上两个端点都在这个点集中的边的权值的最小值严格大于图上只有一个端点在 ...

  7. [IOI2018]狼人——kruskal重构树+可持久化线段树

    题目链接: IOI2018werewolf 题目大意:给出一张$n$个点$m$条边的无向图,点和边可重复经过,一个狼人初始为人形,有$q$次询问,每次询问要求人形态只能处于编号不小于$L$的点,狼形态 ...

  8. BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra

    题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...

  9. LOJ #2718. 「NOI2018」归程(Dijkstra + Kruskal重构树 + 倍增)

    题意 给你一个无向图,其中每条边有两个值 \(l, a\) 代表一条边的长度和海拔. 其中有 \(q\) 次询问(强制在线),每次询问给你两个参数 \(v, p\) ,表示在 \(v\) 出发,能开车 ...

随机推荐

  1. vim 安装

    Ubuntu 16.04 下 Vim安装及配置 默认已经安装了VIM-tiny linuxidc@linuxidc:~$ locate vi | grep 'vi$' |xargs ls -al lr ...

  2. apache+php+mysql开发环境搭建

    一.Apache       因为Apache官网只提供源代码,如果要使用必须得自己编译,这里我选择第三方安装包Apache Lounge. 进入Apachelounge官方下载地址:http://w ...

  3. MySQL日期函数、时间函数总结(MySQL 5.X)

    一.获得当前日期时间函数 1.1 获得当前日期+时间(date + time)函数:now() select now(); # :: 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下 ...

  4. POJ 3256 (简单的DFS)

    //题意是 K N, M; //有K个牛 N个牧场,M条路 ,有向的  //把K个牛放到任意的n个不同牧场中,问所有牛都可以到达的牧场数的总和  //这是一道简单的DFS题 //k 100 //n 1 ...

  5. CsvHelper文档-2读

    CsvHelper文档-2读 这个库默认不需要做任何设置就可以很容易的使用它.如果你的类属性名称直接匹配csv的标题名称,那么可以按照下面的实例来用: (以下所有的代码都需要引用using csvhe ...

  6. 3D动态人脸识别技术分析——世纪晟人脸识别实现三维人脸建模

    - 目录 - 国内3D动态人脸识别现状概况 - 新形势下人脸识别技术发展潜力 - 基于深度学习的3D动态人脸识别技术分析 1. 非线性数据建模方法 2. 基于3D变形模型的人脸建模 - 案例结合——世 ...

  7. cenos环境变量配置

    Beego环境搭建和bee工具安装使用,以Windows环境为例. 首先,下载并安装好GO并配置好GOROOT和GOPATH环境变量(如果您是用msi包安装的go,那么这些环境变量已经设置好了).并在 ...

  8. CDH问题集

    1.在CM中添加主机报JDK错误 手动在机器上安装oracle-jdk1.7+update64.然后在CM中选择不安装oracle-jdk即可. 2.HostMoinitor无法与server联系 查 ...

  9. 《javascript模式--by Stoyan Stefanov》书摘--基本技巧

    一.基本技巧 1,变量释放的副作用 a.使用var创建的全局变量(在函数外部创建)不能删除. b.不使用var创建的隐含全局变量(尽管在函数内部创建)可以删除. // 定义三个全局变量 var glo ...

  10. Linux下实现Rsync目录同步备份

    需求:对于开发机器做目录的数据备份 测试机IP:192.168.1.100   WEB目录:/bckup/ 下面我将用一台机器来备份上面测试机 /bckup下的所有数据,并实现时时同步 备份机器IP: ...