Codeforces Round #378 (Div. 2)F - Drivers Dissatisfaction GNU
http://codeforces.com/contest/733/problem/F
题意:给你一些城市和一些路,每条路有不满意程度和每减少一点不满意程度的花费,给出最大花费,要求找出花费小于s的最小生成树中最小的不满意程度
题解:首先明确的是肯定只删除一条路然后其他的找最小生成树即可,但是直接搞复杂度O(m*mlogm)所以先prim扣出一颗最小生成树,然后枚举所有边删这条边,如果在最小生成树上,直接减到贡献即可,如果不在最小生成树上,那么加上这条边,树肯定有环了,我们用lca暴力的扣出这个环最大的不满意程度的那条边,删掉即可,然后算贡献。总的复杂度是O(mlogm+m*logn)
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000009
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; struct edge{
int u,v,id;ll w,c;
bool operator <(const edge&rhs)const{
return w<rhs.w;
}
}e[N];
int father[N],fa[][N],id[][N],n,m,dep[N];
ll ma[][N],s;
bool vis[N];
vector<edge>v[N];
int Find(int x)
{
return father[x]==x?x:father[x]=Find(father[x]);
}
bool cmp(edge a,edge b)
{
return a.id<b.id;
}
ll prim()
{
for(int i=;i<=m;i++)scanf("%lld",&e[i].w);
for(int i=;i<=m;i++)scanf("%lld",&e[i].c);
for(int i=;i<=m;i++)
{
e[i].id=i;
scanf("%d%d",&e[i].u,&e[i].v);
}
for(int i=;i<=n;i++)father[i]=i;
sort(e+,e++m);
ll sum=;
for(int i=;i<=m;i++)
{
int x=e[i].u,y=e[i].v;
int fx=Find(x),fy=Find(y);
if(fx!=fy)
{
father[fx]=fy;
vis[e[i].id]=;
sum+=e[i].w;
}
}
sort(e+,e++m,cmp);
for(int i=;i<=m;i++)
{
if(vis[i])
{
v[e[i].u].pb(e[i]);
swap(e[i].u,e[i].v);
v[e[i].u].pb(e[i]);
}
}
return sum;
}
void dfs(int u,int f,int d)
{
dep[u]=d;
for(int i=;i<v[u].size();i++)
{
int x=v[u][i].v;
if(x!=f)
{
fa[][x]=u;
ma[][x]=v[u][i].w;
id[][x]=v[u][i].id;
dfs(x,u,d+);
}
}
}
void init()
{
dfs(,-,);
// for(int i=1;i<=n;i++)printf("%d %lld %d \n",fa[0][i],ma[0][i],id[0][i]);
for(int i=;i<;i++)
{
for(int j=;j<=n;j++)
{
fa[i][j]=fa[i-][fa[i-][j]];
if(ma[i-][fa[i-][j]]>ma[i-][j])
{
ma[i][j]=ma[i-][fa[i-][j]];
id[i][j]=id[i-][fa[i-][j]];
}
else
{
ma[i][j]=ma[i-][j];
id[i][j]=id[i-][j];
}
}
}
}
int lca(int x,int y)
{
if(dep[x]>dep[y])swap(x,y);
int ans=;ll maxx=;
for(int i=;i<;i++)
{
if((dep[y]-dep[x])>>i&)
{
if(maxx<ma[i][y])
{
maxx=ma[i][y];
ans=id[i][y];
}
y=fa[i][y];
}
}
if(x==y)return ans;
for(int i=;i>=;i--)
{
if(fa[i][x]!=fa[i][y])
{
if(maxx<ma[i][x])
{
maxx=ma[i][x];
ans=id[i][x];
}
if(maxx<ma[i][y])
{
maxx=ma[i][y];
ans=id[i][y];
}
x=fa[i][x];
y=fa[i][y];
}
}
if(maxx<ma[][x])
{
maxx=ma[][x];
ans=id[][x];
}
if(maxx<ma[][y])
{
maxx=ma[][y];
ans=id[][y];
}
return ans;
}
void solve(ll sum)
{
ll ans=1e18,pos;
for(int i=;i<=m;i++)
{
if(vis[i])
{
if(ans>sum-s/e[i].c)
{
ans=sum-s/e[i].c;
pos=i;
}
}
else
{
int ff=lca(e[i].u,e[i].v);
if(ans>sum-e[ff].w+e[i].w-s/e[i].c)
{
ans=sum-e[ff].w+e[i].w-s/e[i].c;
pos=i;
}
}
}
if(!vis[pos])vis[lca(e[pos].u,e[pos].v)]=;
printf("%lld\n",ans);
for(int i=;i<=m;i++)
{
if(pos==i)printf("%d %d\n",i,e[i].w-s/e[i].c);
else if(vis[i])printf("%d %d\n",i,e[i].w);
}
}
int main()
{
scanf("%d%d",&n,&m);
ll sum=prim();
scanf("%lld",&s);
// for(int i=1;i<=n;i++)
// {
// for(int j=0;j<v[i].size();j++)
// {
// printf("%d %d %d %lld %lld\n",v[i][j].u,v[i][j].v,v[i][j].id,v[i][j].w,v[i][j].c);
// }
// puts("");
// }
init();
solve(sum);
return ;
}
/***********************
3 3
1 1 1000
5 5 2
2 1
3 1
3 2
2
***********************/
Codeforces Round #378 (Div. 2)F - Drivers Dissatisfaction GNU的更多相关文章
- Codeforces Round #378 (Div. 2) F - Drivers Dissatisfaction
F - Drivers Dissatisfaction 题目大意:给你n个点,m条边,每个边都有一个权重w,每条边也有一个c表示,消耗c元可以把这条边的权重减1,求最多消耗s元的最小生成树. 思路:因 ...
- Codeforces Round #378 (Div. 2)F
题目:一个带权连通无向图,给第i条边权值减1需要花费ci元,你一共有S元,求最小生成树. 容易得出钱全部花在一条边上是最优的. 我们先做一遍最小生成树. 然后我们枚举减哪一条边. 如果这条边是树上的, ...
- codeforce 378 div 2 F —— Drivers Dissatisfaction (最小生成树,LCA,倍增)
官方题解: If you choose any n - 1 roads then price of reducing overall dissatisfaction is equal to min(c ...
- Codeforces Round #485 (Div. 2) F. AND Graph
Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...
- Codeforces Round #486 (Div. 3) F. Rain and Umbrellas
Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...
- Codeforces Round #501 (Div. 3) F. Bracket Substring
题目链接 Codeforces Round #501 (Div. 3) F. Bracket Substring 题解 官方题解 http://codeforces.com/blog/entry/60 ...
- Codeforces Round #499 (Div. 1) F. Tree
Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...
- Codeforces Round #378 (Div. 2) D题(data structure)解题报告
题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...
- Codeforces Round #376 (Div. 2)F. Video Cards(前缀和)
题目链接:http://codeforces.com/contest/731/problem/F 题意:有n个数,从里面选出来一个作为第一个,然后剩下的数要满足是这个数的倍数,如果不是,只能减小为他的 ...
随机推荐
- 查看Oracle latch _spin_count默认值
查看Oracle latch _spin_count默认值 SELECT X.KSPPINM NAME, Y.KSPFTCTXVL VALUE, Y.KSPFTCTXDF ISDEFAULT FRO ...
- cl查看类的内存布局
查看单个类的内存布局 Microsoft Visual Studio编译器cl的编译选项可以查看源文件中某个C++类的内存布局,对于想了解某个对象的内存布局的人来说十分直观和方便. • 命令格式 ...
- 如何看MFC程序
一直以来 我都一个疑惑 如果看懂别人的MFC 程序. 今日忽然略有小悟. Q:MFC是啥? A:MFC是类库.. ************* Q :MFC 啥玩意类库? A;MFC 是封装API的类 ...
- 使用Webdriver执行JS
首先,我们使用如下方式初始化driver: WebDriver driver = new FirefoxDriver(); JavascriptExecutor jse = (JavascriptEx ...
- PKU 3318 Matrix Multiplication(随机化算法||状态压缩)
题目大意:原题链接 给定三个n*n的矩阵A,B,C,验证A*B=C是否成立. 所有解法中因为只测试一组数据,因此没有使用memset清零 Hint中给的傻乎乎的TLE版本: #include<c ...
- hdu 1569 &1565 (二分图带权最大独立集 - 最小割应用)
要选出一些点,这些点之间没有相邻边且要求权值之和最大,求这个权值 分析:二分图带权最大独立集. 用最大流最小割定理求解.其建图思路是:将所有格点编号,奇数视作X部,偶数视作Y部,建立源点S和汇点T, ...
- FS-LDM 十大主题
英文名称 中文名称 概念定义 Party 当事人 指银行所服务的任意对象和感兴趣进行分析的各种对象.如个人或公司客户.潜在客户.代理机构.雇员.分行.部门等. Internal Org 内部组织 可能 ...
- 十八般武艺之 Runloop
嗯,runloop ,看过,用过.但是有时候突然被问到,总是不能很好的描述给他人,也许是程序员本来口拙的缘故吧.另外,也是对runloop还是理解的不够透彻. 于是乎,决定重新整理一下,加深一下印象. ...
- selenium实现excel文件数据的读、写
在进行软件测试或设计自动化测试框架时,一个不可避免的过程就是: 参数 化,在利用 python 进行自动化测试开发时,通常会使用 excel 来做数据管 理,利用 xlrd.xlwt 开源包来读写 e ...
- [Deep Learning]学习资料积累
1. ufldl教程√ Andrew Ng的教程,matlab代码. 2. Neural Network and Deep Learning√: 一本未写完的书,非常细致,对基础的概念比如cross ...