BZOJ3641 : 货车运输
若一条边的v小于等于u,则贡献为l*w/v,否则贡献为l*w/u
将边按v从小到大排序,将询问按u从小到大排序
用树链剖分维护链上和,val[0]表示第一种情况下的贡献,val[1]表示第二种情况下的贡献
一开始val[0]都是0,val[1]=l*w,
然后每到一个询问(s,t,u),就把所有v小于等于u的边修改掉,val[0]改为l*w/v,val[1]改为0
因为是环套外向树,所以把额外的边(exa,exb,exl,exv)拿走后变成了一棵树。
查询时在下面三种情况中取min:
1.(s,t)链上val[0]的和+(s,t)链上val[1]的和/u
2.(s,exa)链上val[0]的和+(t,exb)链上val[0]的和+((s,exa)链上val[1]的和+(t,exb)链上val[1]的和)/u+exl*exw/min(u,exv)
3.(s,exb)链上val[0]的和+(t,exa)链上val[0]的和+((s,exb)链上val[1]的和+(t,exa)链上val[1]的和)/u+exl*exw/min(u,exv)
时间复杂度$O(n\log n)$
- #include<cstdio>
- #include<algorithm>
- #define N 100010
- using namespace std;
- inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
- struct edge{int l,x,v,w,id;}E[N];
- struct que{int s,t,u,id;}Q[N];
- int n,m,q,i,x,y,z,t,exa,exb,exl,exx,exv,exw,cnt,now,V[N],W[N],g[N<<1],nxt[N<<2],v[N<<2],ed,size[N<<1],d[N<<1],f[N<<1],son[N<<1],loc[N<<1],top[N<<1],dfn;
- double ans[N],val[2][N<<3];
- inline bool cmpe(edge a,edge b){return a.v<b.v;}
- inline bool cmpq(que a,que b){return a.u<b.u;}
- int F(int x){return f[x]==x?x:F(f[x]);}
- inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
- void dfs1(int x,int pre){
- size[x]=1;d[x]=d[f[x]=pre]+1;
- int heavy=0,sizemax=0,i;
- for(i=g[x];i;i=nxt[i])if(v[i]!=pre){
- dfs1(v[i],x),size[x]+=size[v[i]];
- if(size[v[i]]>sizemax)sizemax=size[v[i]],heavy=v[i];
- }
- if(heavy)son[x]=heavy;
- }
- void dfs2(int x,int pre,int t){
- loc[x]=++dfn;top[x]=t;
- if(son[x])dfs2(son[x],x,t);
- for(int i=g[x];i;i=nxt[i])if(v[i]!=pre&&v[i]!=son[x])dfs2(v[i],x,v[i]);
- }
- void change(int p,int x,int a,int b,int c,double d){
- if(a==b){val[p][x]=d;return;}
- int mid=(a+b)>>1;
- if(c<=mid)change(p,x<<1,a,mid,c,d);else change(p,x<<1|1,mid+1,b,c,d);
- val[p][x]=val[p][x<<1]+val[p][x<<1|1];
- }
- double ask(int p,int x,int a,int b,int c,int d){
- if(c<=a&&b<=d)return val[p][x];
- int mid=(a+b)>>1;double t=0;
- if(c<=mid)t=ask(p,x<<1,a,mid,c,d);
- if(d>mid)t+=ask(p,x<<1|1,mid+1,b,c,d);
- return t;
- }
- inline double query(int p,int x,int y){
- double t=0;
- while(top[x]!=top[y]){
- if(d[top[x]]<d[top[y]])swap(x,y);
- t+=ask(p,1,1,dfn,loc[top[x]],loc[x]);
- x=f[top[x]];
- }
- if(d[x]>d[y])swap(x,y);
- return t+ask(p,1,1,dfn,loc[x],loc[y]);
- }
- inline double getans(int x,int y,int u){
- double t=query(0,x,y)+query(1,x,y)/(double)u,tmp;
- tmp=query(0,x,exa)+query(0,y,exb)+(query(1,x,exa)+query(1,y,exb))/(double)u+(double)exl*(double)exw/(double)(exv<u?exv:u);
- if(tmp<t)t=tmp;
- tmp=query(0,x,exb)+query(0,y,exa)+(query(1,x,exb)+query(1,y,exa))/(double)u+(double)exl*(double)exw/(double)(exv<u?exv:u);
- return tmp<t?tmp:t;
- }
- int main(){
- read(n),read(m),read(q);
- for(i=1;i<=n;i++)f[i]=i;
- for(i=1;i<=n;i++){
- read(x),read(y),read(z),read(t);
- if(F(x)==F(y))exa=x,exb=y,exl=z,exx=t;
- else{
- f[f[x]]=f[y];
- E[++cnt].l=z,E[cnt].x=t,E[cnt].id=n+cnt;
- add(x,n+cnt),add(n+cnt,x),add(y,n+cnt),add(n+cnt,y);
- }
- }
- for(i=1;i<=m;i++)read(V[i]),read(W[i]);
- for(exv=V[exx],exw=W[exx],i=1;i<n;i++)E[i].v=V[E[i].x],E[i].w=W[E[i].x];
- for(i=1;i<=q;i++)read(Q[i].s),read(Q[i].t),read(Q[i].u),Q[i].id=i;
- sort(E+1,E+n,cmpe),sort(Q+1,Q+q+1,cmpq);
- dfs1(1,0),dfs2(1,0,1);
- for(i=1;i<n;i++)change(1,1,1,dfn,loc[E[i].id],(double)E[i].l*(double)E[i].w);
- for(now=i=1;i<=q;i++){
- while(now<n&&E[now].v<=Q[i].u)change(0,1,1,dfn,loc[E[now].id],(double)E[now].l*(double)E[now].w/(double)E[now].v),change(1,1,1,dfn,loc[E[now].id],0),now++;
- ans[Q[i].id]=getans(Q[i].s,Q[i].t,Q[i].u);
- }
- for(i=1;i<=q;i++)printf("%.6f\n",ans[i]);
- return 0;
- }
BZOJ3641 : 货车运输的更多相关文章
- NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】
NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...
- NOIP2013 货车运输 (最大生成树+树上倍增LCA)
死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...
- C++之路进阶——codevs3287(货车运输)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 n ...
- NOIP2013 货车运输
3.货车运输 (truck.cpp/c/pas) [问题描述] A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货 ...
- Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...
- 【NOIP2013提高组】货车运输
货车运输 (truck.cpp/c/pas) [问题描述] A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有q辆货车在运输货物,司机们想知道每辆 ...
- Codevs3278[NOIP2013]货车运输
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 ...
- 洛谷 P1967 货车运输
洛谷 P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在 ...
- P1967 货车运输
P1967 货车运输最大生成树+lca+并查集 #include<iostream> #include<cstdio> #include<queue> #inclu ...
随机推荐
- MySQL之扩展(触发器,存储过程等)
视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( SEL ...
- Linux运维相关目录
- Firefox上Web开发工具库一览
Firefox的目标之一就是尽可能地使web开发者的生活更简单高效,并通过提供工具和具有很强扩展性的浏览器使人们创造出神奇的东西.使web开发者使用Firefox的时候,浏览器可以提供大量开发工具和选 ...
- 45. Singleton类的C++/C#实现[Singleton]
[题目] 设计一个类,我们只能生成该类的一个实例. [分析] 单例模式的意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点.让类自身负责保存它的唯一实例.这个类可以保证没有其他实例可.以被创建 ...
- 【转】solr+ajax智能拼音详解---solr跨域请求
本文转自:http://blog.csdn.net/wangzhaodong001/article/details/8529090 最近刚做完solr的ajax智能拼音.总结一下. 前端:jQuery ...
- codeforces 478A.Initial Bet 解题报告
题目链接:http://codeforces.com/problemset/problem/478/A 题目意思:简单来说,就是初始化的时候,五个人的值都是 b,现在给出每个人最终的状态:就是经过互相 ...
- Auguse 2nd, Week 32nd Tuesday, 2016
Love me little and love me long.不求情意绵绵,但愿天长地久. Friends are relatives you make for yourself.朋友是你自己结交的 ...
- July 21st, Week 30th Thursday, 2016
What youth deemed crystal, age finds out was dew. 年少时的水晶,在岁月看来不过是露珠. As time goes by, we are gradual ...
- intellij 2016注册
第一种方法: http://idea.qinxi1992.cn http://idea.imsxm.com/ http://107.191.37.186:11688
- 何时使用hadoop fs、hadoop dfs与hdfs dfs命令(转)
hadoop fs:使用面最广,可以操作任何文件系统. hadoop dfs与hdfs dfs:只能操作HDFS文件系统相关(包括与Local FS间的操作),前者已经Deprecated,一般使用后 ...