bzoj3322 最大生成树+LCA
题目大意:给个无向图,每条边有个限制,每个点最多能买入和卖出一定黄金;然后按顺序走过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 ...
随机推荐
- PhotoShop纸张大小
1*标准打印纸 A4:210mm*297mm A3: 420mm*297mm 一张全开纸切成多少份 大度16开:210mm*285mm(度:切的意思) 大度8开:420*285mm 2*传统印刷纸 A ...
- 20160128_关于SVN提交不了并且还提示升级的解决方法
因为是在项目中新增了文件夹,可能是直接在文件夹里放入文件,导致svn没有读取到文件信息,所以提交不了. 搞了一晚上,蛋疼死,解决方法:把新增的文件夹复制出来,删掉里面的 .svn文件夹.然后删掉项目里 ...
- String.valueOf(int i)和Integer.toString(int i)有什么区别?
以下是2个人的回答,我是从百度上复制下来的,做个笔记,以后方便看 String.valueOf()它可以将JAVA基本类型(int,double,boolean等)和对象(Object)转换成Stri ...
- 转:12C CDB and pdb with sql developer
How to install the 12c DB and use the Pluggable DB with SQL DeveloperGoal To give a path to install ...
- listener.ora
EOF YESTERDAY=`cat /database/log/tns_log/yesterday.out` TODAY=`date '+%d-%b-%Y'` echo $YESTERDAY $T ...
- Android OpenGL ES(十三)通用的矩阵变换指令 .
Android OpenGL ES 对于不同坐标系下坐标变换,大都使用矩阵运算的方法来定义和实现的.这里介绍对应指定的坐标系(比如viewmodel, projection或是viewport) An ...
- HALF<水题>
题意: 找出n/d=0.5的所有数.输入:test,x(代表n的位数,1<=x<=4).并且n和d的每一个位数不能有重复,也不能是0. 输入: 1 1 输出: the form 1/2 = ...
- display:block;inline;inline-block大总结
总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通 ...
- 将所需要的图标排成一列组成一张图片,方便管理。li的妙用
我在做一个网站的header 但是视频教学里面将电话图标,微信图标,以及每一个英文字母右边的小点拼成一副图. (图片的名字是top_ioc.png)拼成的整个图片作为li的背景.通过移动就可以分别将每 ...
- jquery_api(事件一)
一 .unload在火狐,谷歌无法弹出alerta是因为这两个浏览器默认组织alert弹出,unload事件可以进行一些对象销毁,事件解除绑定等清理工作. 如果你想在用户离开页面之前确认是否离开,最好 ...