题目大意:给个无向图,每条边有个限制,每个点最多能买入和卖出一定黄金;然后按顺序走过n个点,求每个卖出黄金的点最多能卖出多少黄金
一开始有点懵,想着怎么再图上做这个问题,后来知道要先建一棵最大生成树
然后就好做了,做的时候黄金全都拿,不必考虑第一个条件,因为就算花不完也能在之前某个地方少买一点黄金
然后没个询问找前后两个点lca,求路径上的最小边的限制,这样就可以求出卖出多少黄金了
最后要谴责一下非常脑残的数据,有个数据点是两条链,dfs时会爆栈= =,WA了我两天十几次
话说出数据时不应该这样戏弄别人,非常浪费时间和精力又没有意义
一定要手写栈!!
#include<stdio.h> #include<string.h> #include<algorithm> #define LL long long #define INF 21474836470000 using namespace std; ; struct node{ int from,to,next; LL cost; }E[maxn*],e[maxn*]; ],Fa[maxn],dep[maxn],head[maxn],tot,logn,order[maxn],scc[maxn],bel,st[maxn*]; LL pre[maxn][]; void insert(int u, int v, LL c){ e[++tot].to=v; e[tot].next=head[u]; e[tot].cost=c; head[u]=tot; } bool cmp(node a, node b){ return a.cost>b.cost; } int find(int x){ return Fa[x]==x?x:Fa[x]=find(Fa[x]); } void dfs(int u, int f){ ; st[++top]=u; while (top){ u=st[top--]; f=fa[u][]; dep[u]=dep[f]+; ; i<=logn; i++) fa[u][i]=fa[fa[u][i-]][i-]; ; i<=logn; i++) pre[u][i]=min(pre[u][i-],pre[fa[u][i-]][i-]); for (int i=head[u]; i; i=e[i].next) if (e[i].to!=f){ fa[e[i].to][]=u; pre[e[i].to][]=e[i].cost; st[++top]=e[i].to; } } } LL lca(int u, int v){ LL ret=INF; if (dep[u]<dep[v]) swap(u,v); while (dep[u]>dep[v]){ ; i--) if (dep[fa[u][i]]>dep[v]){ ret=min(ret,pre[u][i]); u=fa[u][i]; } ret=min(ret,pre[u][]); u=fa[u][]; } if (u==v) return ret; ; i--) if (fa[u][i]!=fa[v][i]){ ret=min(ret,pre[u][i]); ret=min(ret,pre[v][i]); u=fa[u][i]; v=fa[v][i]; } ret=min(ret,min(pre[v][],pre[u][])); return ret; } int main(){ //freopen("motorcycle6.in","r",stdin); //freopen("test.out","w",stdout); scanf("%d%d%d", &n, &m, &q); <<logn)<n) logn++; tot=; memset(pre,,sizeof(pre)); ; i<=n; i++) scanf("%d", &order[i]),Fa[i]=i;// shunxu ; i<=n; i++) scanf("%d", &trade[i]);// yaoqiu ; i<=m; i++) scanf("%d%d%lld", &E[i].from, &E[i].to, &E[i].cost); bel=n; ,x; i<=q; i++) scanf(,bel=min(bel,x); sort(E+,E++m,cmp); ; else num=n-q; ,hehe=; i<=m; i++){ int x=E[i].from, y=E[i].to; if (scc[x]) x=bel; if (scc[y]) y=bel; int fx=find(x), fy=find(y); if (fx!=fy){ Fa[fx]=fy; insert(x,y,E[i].cost); insert(y,x,E[i].cost); hehe++; if (hehe==num) break; } } fa[][]=; dfs(,); LL now=; ]]<) puts(]]; ; i<=n; i++){ ], y=order[i]; if (scc[x]) x=bel; if (scc[y]) y=bel; now=min(now,lca(x,y)); x=order[i-]; y=order[i]; ) now+=(LL)trade[y]; else{ ){ now+=(LL)trade[y]; printf("%d\n", -trade[y]); }else{ printf("%lld\n", now); now=0LL; } } //printf("%lld\n", now); } ; }
bzoj3322 最大生成树+LCA的更多相关文章
-
ACM-ICPC 2018 徐州赛区网络预赛 J Maze Designer(最大生成树+LCA)
https://nanti.jisuanke.com/t/31462 题意 一个N*M的矩形,每个格点到其邻近点的边有其权值,需要构建出一个迷宫,使得构建迷宫的边权之和最小,之后Q次查询,每次给出两点 ...
-
最大生成树——LCA
今天说是要练习LCA结果找了道题看着题解打完了,如此惭愧,Lca还得好好理解啊,感觉在最大生成树上做有点异样,可能还是不是很理解吧,在noip前一定要再把这道题再a一遍,好题啊. 这是2013noip ...
-
ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer 最大生成树 lca
大概就是要每两个点 只能有一条路径,并且约束,最短的边用来砌墙,那么反之的意思就是最大的边用来穿过 故最大生成树 生成以后 再用lca计算树上两点间的距离 (当然防止生成树是一条链,可以用树的重心作为 ...
-
luogu 1967 货车运输(最大生成树+LCA)
题意:给出一颗n个点的图,q个询问,每次询问u到v的路径中最小的边最大是多少. 图的最大生成树有一个性质,对于该图的任意两个点,在树中他们之间路径的最小边最大. 由于这个图不一定联通,于是我们对它的联 ...
-
【NOIP2013】货车运输 最大生成树+LCA
题目描述 AA国有nn座城市,编号从 1到n,城市之间有m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重 ...
-
[洛谷 P1967] 货车运输 (最大生成树 lca)
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
-
UVALive - 4960 Sensor network(生成树+LCA)
题目大意:给出N个点.M条边.问这N个点形成的生成树的最大权值边-最小权值边的最小值 解题思路:先排序,然后按生成树的kruscal算法进行加边,再维护一个最小权值边 加边的时候要考虑一下加下去的边是 ...
-
P1967 货车运输[生成树+LCA]
题目描述 A国有n座城市,编号从 1到n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q* 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重 ...
-
ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)
ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...
随机推荐
-
Eclipse c++代码提示,覆盖下面代码的问题。
今天在使用Eclipse自动提示时,会覆盖下面行的代码!!! 这个错误几乎不能忍,goolge无果. 手动尝试去掉,全部代码提示,终于找到解法办法,但是原因未知. 如下图:需要去掉 "Par ...
-
nodeType的返回
<p id="one" title="one_one">one_one_one</p> 1.用getElementById var o ...
-
[LeetCode]题解(python):107 Binary Tree Level Order Traversal II
题目来源 https://leetcode.com/problems/binary-tree-level-order-traversal-ii/ Given a binary tree, return ...
-
asp.net MVC3 + JQuery 的ajax简单使用
一直都没有使用过JQuery,更没使用过JQuery的ajax支持带来的方便,今天试了一下,真是减少了很多工作量,使用方法也比较简单 这里先记下来,以后使用时可以再拿着用. 本应用中,本来是准备使用长 ...
-
mysql ERROR1405 access deny 问题解决
sudo /usr/local/mysql/bin/mysqld_safe --user=mysql --skip-grant-tables --skip-networking 使用这条命令可以跳过开 ...
-
Gulpfile.js——编译、压缩、合并js和css文件
gulp 一个入门教程:http://www.ydcss.com/gulp API文档地址:http://www.gulpjs.com.cn/docs/api/ 我的一个Low版的gulpfile v ...
-
mvc、mvp和mvvm
一.MVC 设计图: 可能由于MVP.MVVM的兴起,MVC在android中的应用变得越来越少了,但MVC是基础,理解好MVC才能更好的理解MVP,MVVM.因为后两种都是基于MVC发展而来的. 1 ...
-
spring的配置和使用
spring的配置和使用 1. 创建基于java的配置. 配置极少量的XML来启用java配置: <?xml version="1.0" encoding="U ...
-
【Spark】SparkStreaming-提交到集群运行
SparkStreaming-提交到集群运行 spark streaming 提交_百度搜索 SparkStreaming示例在集群中运行 - CSDN博客
-
C# 历史曲线控件 基于时间的曲线控件 可交互的高级曲线控件 HslControls曲线控件使用教程
本篇博客主要对 HslControls 中的曲线控件做一个详细的教程说明,大家可以根据下面的教程开发出高质量的曲线控件 Prepare 先从nuget下载到组件,然后就可以使用组件里的各种组件信息了. ...