description

题面

data range

\[0\le m<n\le 200000,0\le k\le 500000
\]

solution

之前本人一直煞笔地思考暴力是否可行

考虑按照操作关系直接构树,之后按照每个反应中两点在树上的\(lca\)深度排序

最后依次考虑每个反应即可

虽然说建出来的也是个\(Kruskal\)重构树

code

没有按质合并的并查集都能过

#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<complex>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define FILE "a"
#define mp make_pair
#define pb push_back
#define RG register
#define il inline
using namespace std;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
const dd eps=1e-10;
const int mod=1e9+7;
const int N=400010;
const int M=500010;
const dd pi=acos(-1);
const int inf=2147483645;
const ll INF=1e18+1;
const ll P=100000;
il ll read(){
RG ll data=0,w=1;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
return data*w;
} il void file(){
srand(time(NULL)+rand());
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
} int num,n,m,k,g[N],t;ll ans;
int fa[N],f[20][N];
int find(int x){return fa[x]?fa[x]=find(fa[x]):x;}
int dep[N],RT;
int head[N],nxt[N],to[N],cnt;
il void add(int u,int v){
to[++cnt]=v;
nxt[cnt]=head[u];
head[u]=cnt;
}
void dfs(int u,int ff){
f[0][u]=ff;dep[u]=dep[ff]+1;
for(RG int i=1;f[i-1][f[i-1][u]];i++)f[i][u]=f[i-1][f[i-1][u]];
for(RG int i=head[u];i;i=nxt[i]){
RG int v=to[i];dfs(v,u);
}
}
struct edge{int u,v,id,d;}E[M];
bool cmp(edge x,edge y){if(x.d==y.d)return x.id<y.id;return x.d>y.d;}
il int lca(int u,int v){
if(dep[u]<dep[v])swap(u,v);
RG int d=dep[u]-dep[v];
for(RG int i=19;~i;i--)if(d&(1<<i))u=f[i][u];
if(u==v)return u;
for(RG int i=19;~i;i--)
if(f[i][u]!=f[i][v])u=f[i][u],v=f[i][v];
if(u==v)return u;
return f[0][u];
} int main()
{
num=n=read();m=read();k=read();
for(RG int i=1;i<=n;i++)g[i]=read();
for(RG int i=1,a,b;i<=m;i++){
a=read();b=read();a=find(a);b=find(b);
num++;fa[a]=fa[b]=num;add(num,a);add(num,b);
}
for(RG int i=1;i<=n+n;i++)if(!fa[i])dfs(i,0);
for(RG int i=1,a,b;i<=k;i++){
a=read();b=read();if(find(a)!=find(b))continue;
E[++t]=(edge){a,b,i,dep[lca(a,b)]};
}
sort(E+1,E+t+1,cmp);
for(RG int i=1,s;i<=t;i++){
s=min(g[E[i].u],g[E[i].v]);
g[E[i].u]-=s;g[E[i].v]-=s;ans+=2ll*s;
}
printf("%lld\n",ans);
return 0;
}

[bzoj3712][PA2014]Fiolki的更多相关文章

  1. BZOJ3712[PA2014]Fiolki——并查集重构树

    题目描述 化学家吉丽想要配置一种神奇的药水来拯救世界.吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[i]克的第i种物质.吉丽需要执行一定的步骤来配置药水,第i个步骤 ...

  2. BZOJ3712[PA2014]Fiolki 建图+倍增lca

    居然是一道图论题 毫无思路 我们对于每一次的融合操作 $(a,b)$ 建一个新点$c$ 并向$a,b$连边 再将$b$瓶当前的位置赋成$c$ 这样子我们就可以建成一个森林 现在枚举每一种反应$M_i$ ...

  3. [bzoj3712][PA2014]Fiolki_倍增LCA

    Fiolki bzoj-3712 PA-2014 题目大意:题目链接. 注释:略. 想法: 神题! 我们建树:对于一次倾倒操作,我们弄一个新的大瓶子作为两个合并瓶子的父亲节点,与两个瓶子相连. 对于一 ...

  4. 【BZOJ-3712】Fiolki LCA + 倍增 (idea题)

    3712: [PA2014]Fiolki Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 303  Solved: 67[Submit][Status] ...

  5. [PA2014]Fiolki

    [PA2014]Fiolki 题目大意: 有\(n(n\le2\times10^5)\)种不同的液体物质和\(n\)个容量无限的药瓶.初始时,第\(i\)个瓶内装着\(g_i\)克第\(i\)种液体. ...

  6. 【BZOJ3712】Fiolki(并查集重构树)

    [BZOJ3712]Fiolki(并查集重构树) 题面 BZOJ 题解 很神仙的题目. 我们发现所有的合并关系构成了一棵树. 那么两种不同的东西如果产生反应,一定在两个联通块恰好联通的时候反应. 那么 ...

  7. BZOJ 3712: [PA2014]Fiolki 倍增+想法

    3712: [PA2014]Fiolki Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 437  Solved: 115[Submit][Status ...

  8. 【BZOJ】3712: [PA2014]Fiolki

    http://www.lydsy.com/JudgeOnline/problem.php?id=3712 题意:n个瓶子,第i个瓶子里又g[i]克物质.m次操作,第i次操作把第a[i]个瓶子的东西全部 ...

  9. bzoj 3712: [PA2014]Fiolki

    Description 化学家吉丽想要配置一种神奇的药水来拯救世界.吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[i]克的第i种物质.吉丽需要执行一定的步骤来配置药 ...

随机推荐

  1. Hive窗口函数之LAG、LEAD、FIRST_VALUE、LAST_VALUE的用法

    一.创建表: create table windows_ss ( polno string, eff_date string, userno string ) ROW FORMAT DELIMITED ...

  2. HashMap在并发场景下踩过的坑

    本文来自网易云社区 作者:张伟 关于HashMap在并发场景下的问题有很多人,很多公司遇到过!也很多人总结过,我们很多时候都认为这样都坑距离自己很远,自己一定不会掉入这样都坑.可是我们随时都有就遇到了 ...

  3. 爬虫初体验:Python+Requests+BeautifulSoup抓取广播剧

    可以看到一个DIV下放一个广播剧的信息,包括名称和地址,第一步我们先收集所有广播剧的收听地址: # 用requests的get方法访问novel_list_resp = requests.get(&q ...

  4. 第四篇 与Flask相关的插件(flask-session、wtforms)

    公司中使用SQL的种方式: 1. 写Django:ORM(关系对象映射), 2. 写Flask和其他:有两种方式: (1) 原生SQL:使用原生SQL有两种选择: A. pymysql (python ...

  5. Python中一些糟糕的语法!你遇到过吗?还知道那些?

    Python是一门语法优雅,功能强大,开发效率高,应用领域广泛的解释性语言. 其有非常多的优点,但是也并不是完美的,除了大家都知道的执行速度不够快,Python2和Python3的兼容问题,以及GIL ...

  6. POJ - 3259

    要判断是否有负的权值 #include<iostream> #include<stdio.h> #include<algorithm> #include<st ...

  7. [问题] docker: Failed to start Docker Application Container Engine.

    docker无法启动: # systemctl restart docker Job for docker.service failed because the control process exi ...

  8. HDU 1403 Longest Common Substring(后缀自动机——附讲解 or 后缀数组)

    Description Given two strings, you have to tell the length of the Longest Common Substring of them. ...

  9. mysql唯一查询

    MySQL单一字段唯一其他字段差异性忽略查询.在使用MySQL时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返 ...

  10. Java中Collection和Collections的区别(转载)

    转载来源:http://www.cnblogs.com/dashi/p/3597937.html 1.java.util.Collection 是一个集合接口(集合类的一个顶级接口).它提供了对集合对 ...