此题就是在基环树上的询问

答案分为两部分,一部分是以询问限速开过的时间,一部分是以当前路的限速开过的段。

考虑离线,每次讲限速小于当前询问的限速的路段权值修改。

S->T如果在去环后在同一棵树上,就直接树链+树状数组。

如果不在同一棵树上就取他们到根路径的权值和和环上两种走法的较小值作为答案。

环上边另开树状数组即可

(claris只去一条边变为一棵树的太神了)

#include <bits/stdc++.h>
#define gc getchar()
#define N 100009
using namespace std;
int n,m,qq,first[N],number=1,v[N],w[N],vis[N],pre[N],root[N],so[N],sw[N];
int root_num,rt[N],fa[N],size[N],Mson[N],deep[N],top[N],cnt,dfn[N],id[N];
int is_root[N],limit[4];
double Ans[N],bit[N<<1][4];
map<int,int> mp;
struct edge
{int to,next,len,pd,pos,lev;double val,v;void add(int x,int y,int z,int l,int p){to=y,next=first[x],first[x]=number,lev=z,len=l,pos=p;}
}e[N<<1];
struct Qry
{int x,y,pos;double v;bool operator <(const Qry &rhs) const{return v<rhs.v;}
}q[N];
bool cmp(const int &x,const int &y)
{return e[x].v<e[y].v;
}
int read()
{int x=1;char ch;while (ch=gc,ch<'0'||ch>'9') if (ch=='-') x=-1;int s=ch-'0';while (ch=gc,ch<='9'&&ch>='0') s=s*10+ch-'0';return s*x;
}
int lowbit(int x)
{return x&(-x);
}
void add(int x,double y,int k)
{for (;x<=limit[k];x+=lowbit(x)) bit[x][k]+=y;
}
double qry(int x,int k=0,double ret=0.0)
{for (;x;x-=lowbit(x)) ret+=bit[x][k];return ret;
}
double qry(int x,int y,int k)
{return qry(y,k)-qry(x-1,k);
}
void dfs(int x,int last)
{vis[x]=1;for (int i=first[x];i;i=e[i].next)if (vis[e[i].to]&&i!=(last^1)){int now=x;while (now!=e[i].to){e[pre[now]].pd=e[pre[now]^1].pd=1;mp[pre[now]]=mp[pre[now]^1]=now;root[++root_num]=now;now=e[pre[now]^1].to;}e[i].pd=e[i^1].pd=1;mp[i]=mp[i^1]=e[i].to;root[++root_num]=e[i].to;pre[e[i].to]=i;break;}elseif (!vis[e[i].to]&&i!=(last^1)){pre[e[i].to]=i;dfs(e[i].to,i);if (root_num) break;}
}
void dfs1(int x,int r)
{rt[x]=r;size[x]=1;deep[x]=deep[fa[x]]+1;for (int i=first[x];i;i=e[i].next)if (!e[i].pd&&e[i].to!=fa[x]){pre[e[i].to]=i;mp[i]=mp[i^1]=e[i].to;fa[e[i].to]=x;dfs1(e[i].to,r);size[x]+=size[e[i].to];if (size[e[i].to]>size[Mson[x]]) Mson[x]=e[i].to;}
}
void dfs2(int x,int y)
{id[dfn[x]=++cnt]=x;top[x]=y;if (Mson[x]) dfs2(Mson[x],y);for (int i=first[x];i;i=e[i].next)if (e[i].to!=fa[x]&&e[i].to!=Mson[x]&&!e[i].pd) dfs2(e[i].to,e[i].to);
}
double query(int x,int y,double z,double ret=0.0)
{for (;top[x]!=top[y];x=fa[top[x]]){if (deep[top[x]]<deep[top[y]]) swap(x,y);ret+=qry(dfn[top[x]],dfn[x],0)+qry(dfn[top[x]],dfn[x],1)/z;}if (deep[x]>deep[y]) swap(x,y);ret+=qry(dfn[x]+1,dfn[y],0)+qry(dfn[x]+1,dfn[y],1)/z;return ret;
}
int main()
{freopen("1.in","r",stdin);freopen("1.out","w",stdout);n=read(),m=read(),qq=read();for (int i=1;i<=n;i++){int x=read(),y=read(),l=read(),z=read();e[++number].add(x,y,z,l,i);e[++number].add(y,x,z,l,i);}for (int i=1;i<=m;i++) v[i]=read(),w[i]=read();for (int i=1;i<=n;i++){int level=e[i<<1].lev;e[i<<1].v=e[i<<1|1].v=v[level];e[i<<1].val=e[i<<1|1].val=(double)e[i<<1].len*w[level];}dfs(1,0);for (int i=1;i<=root_num;i++)sw[i]=root[root_num-i+1];for (int i=1;i<=root_num;i++){root[i]=sw[i];dfs1(root[i],root[i]),dfs2(root[i],root[i]);is_root[root[i]]=i;}for (int i=1;i<=n;i++) so[i]=i<<1;sort(so+1,so+n+1,cmp);for (int i=1;i<=qq;i++)q[i].x=read(),q[i].y=read(),q[i].v=read(),q[i].pos=i;limit[0]=limit[1]=n,limit[2]=limit[3]=(root_num<<1);for (int i=1;i<=(root_num<<1);i++)add(i,e[pre[root[(i-1)%root_num+1]]].val,3);sort(q+1,q+qq+1);for (int i=1;i<=n;i++)if (!is_root[i]) add(dfn[i],e[pre[i]].val,1);int now_edge=1;for (int i=1;i<=qq;i++){while (now_edge<=n&&e[so[now_edge]].v<=q[i].v){int now=so[now_edge];if (e[now].pd){//cout<<"updata edge:"<<e[now].to<<" "<<e[now^1].to<<endl;add(is_root[mp[now]],e[now].val/e[now].v,2);add(is_root[mp[now]],-e[now].val,3);add(is_root[mp[now]]+root_num,e[now].val/e[now].v,2);add(is_root[mp[now]]+root_num,-e[now].val,3);}else{add(dfn[mp[now]],e[now].val/e[now].v,0);add(dfn[mp[now]],-e[now].val,1);}now_edge++;}int r1=rt[q[i].x],r2=rt[q[i].y];if (r1==r2) Ans[q[i].pos]=query(q[i].x,q[i].y,q[i].v);else{Ans[q[i].pos]=query(q[i].x,r1,q[i].v)+query(q[i].y,r2,q[i].v);int R1=is_root[r1],R2=is_root[r2];if (R1>R2) swap(R1,R2);double val1=qry(R1+1,R2,2)+qry(R1+1,R2,3)/q[i].v;double val2=qry(R2+1,R1+root_num,2);val2+=qry(R2+1,R1+root_num,3)/q[i].v;Ans[q[i].pos]+=min(val1,val2);}}for (int i=1;i<=qq;i++)printf("%lf\n",Ans[i]);return 0;
}

【bzoj3641】货车运输相关推荐

  1. 倍增LCA NOIP2013 货车运输

    货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情 ...

  2. poj1330|bzoj3732|noip2013 货车运输 kruskal+倍增lca

    学了一早上倍增,感觉lca还是tarjan好写. poj1330 1 #include <stdio.h> 2 #include <string.h> 3 #include & ...

  3. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  4. 【洛谷P1967】[NOIP2013]货车运输

    货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. 1 #include<iostr ...

  5. 【题解】【洛谷 P1967】 货车运输

    目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...

  6. NOIP2013货车运输

    NOIP2013货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超 ...

  7. 货车运输题解 最大生成树+lca

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条 ...

  8. noip 2013 洛谷 P1967 货车运输

    题目:货车运输 大致题意: 给出一张无向带权图,对于m个询问(X,Y),要求找出X到Y的一条路径使得路径上的最小边权最大,并输出这个最小边权. 思路: 可以看出,X到Y的满足条件的路径一定在原图的最大 ...

  9. LUOGU 1967 货车运输 [noip 2013]

    * 1967 货车运输 * 题目描述 AA 国有 n n 座城市,编号从 1 1 到 nn ,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司 ...

  10. 货车运输--kruscal重构树板子

    前置知识: kruscal重构树 用于求解有关两点间路径最大边权最小值和最小边权最大值问题 求解两点间路径最大边权最小值--最大生成树思想,优先选择权值大的边 求解两点间路径最小边权最大值--最小生成 ...

最新文章

  1. HDU 5734 Acperience (公式推导) 2016杭电多校联合第二场
  2. nanomsg(ZeroMQ with C)
  3. BP人工神经网络的介绍与实现
  4. HashSet和HashMap的区别
  5. [排序][二分][dp]JZOJ 2747 捡金子
  6. SAP Spartacus i18n 的文本,和翻译相关的话题:internationalization
  7. 我的世界服务器抽奖系统怎么弄,我的世界自动识别货币抽奖机如何制作
  8. 小谈CDN回源函数计算的应用场景
  9. kalilinux安装qt_Kali Linux 安装和搜狗输入法的安装
  10. docker 安装azkaban_azkaban安装
  11. 留学面试 计算机专业话题,英语面试_美国留学计算机专业详解_沪江英语
  12. 计算机名字需要加_PC吗,ecs计算机名字
  13. 使用STS创建Spring boot project报错:Project build error: Non-resolvable parent POM for
  14. 转载:什么是良好的Verilog代码风格?(作者KellenWang)
  15. java在dos命令_JAVA中如何执行DOS命令
  16. 【OpenGL 实验二】Liang-Barsky 裁剪算法
  17. python 安装包国内源
  18. 华为云HCIA含金量,华为HCIA题库
  19. Matlab求解微分、积分方程
  20. zTree插件setting配置详解

热门文章

  1. 表头让你头疼?看这几招解决Pandas读取Excel表头的问题
  2. 【C语言经典100例】-- 06 用*号输出字母C的图案
  3. pytorch 利用tensorboard显示loss,acc曲线等
  4. ibatis例子(一)
  5. android开发图案解锁,Android开发中图案解锁完整版
  6. python—color对照
  7. Linux下监控磁盘使用量并在超过阀值后自动发送报警邮件
  8. mysql综合案例 数据表的基本操作
  9. Xamarin iOS 让图片动起来,做一个简单的俄罗斯轮盘
  10. iOS删除项目中未使用的图片资源