~~~题面~~~

题解:

  这题想法简单,,,写起来真的是失智,找了几个小时的错误结果是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. ROS(一)Topic 通信

    ROS系统起源于2007年斯坦福大学人工智能实验室的项目与机器人技术公司Willow Garage的个人机器人项目(Personal Robots Program)之间的合作,2008年之后就由Wil ...

  2. Ajax中post请求和get请求的区别

    首先提出两点Post比Get大的不同地方 1.post请求浏览器每次不会缓存,每次都会重新请求,而get请求不要缓存的时候,需要手动设置 写上xhr.setRequestHeader("If ...

  3. ThinkDev.Data更新日志

    2013-09-29 10:001.重构Where.And.Or.Having.JoinTable代码,新增条件组合查询QueryGroup2.1.1.2.0 2013-09-04 09:001.修复 ...

  4. 「专题训练」Machine Schedule(HDU-1150)

    题意 在一个工厂,有两台机器\(A, B\)生产产品.\(A\)机器有\(n\)种工作模式(模式\(0\),模式\(1\)--模式\(n-1\)).\(B\)机器有\(m\)种工作模式(模式\(0\) ...

  5. mysql5.6 无法远程连接问题解决

    需要配置mysql5.6版本的my.cnf文件,我的my.cnf文件配置如下: port=3306是我后来自己加上的.加上这个之后重启mysql service mysqld restart 记得给r ...

  6. 聊聊Bug引发事故该不该追求责任

    最近读极客时间朱赟的一篇文章有感,在这也聊一下,在互联网的公司大多数以迭代的方式上线需求,节奏一般都比较快,经常会一个需求当天来了第二天就上线,开发和测试时间总共就两天,中间还穿插着别的需求测试,不像 ...

  7. Memcache的客户端连接系列(二) Python

    关键词: Memcached   Python 客户端 声明:本文并非原创,转自华为云帮助中心的分布式缓存服务(Memcached)的用户指南.客户端连接方法通用,故摘抄过来分享给大家. Python ...

  8. 头文件#ifndef #define #endif使用

    想必很多人都看过“头文件中的 #ifndef #define #endif 防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件 ...

  9. c# 删除word文档中某一页

    object objPage = 14; int pages = oDoc.ComputeStatistics(Microsoft.Office.Interop.Word.WdStatistic.wd ...

  10. Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...