题目大意:略

一定范围内求最大值,考虑二分答案

设现在选择的答案是$mid$,$max \left \{ \frac{yi+qj}{xi+pj} \right \} \geq mid $

展开可得,$(yi-mid*xi)+(qj-mid*pj)>=0$,只要存在$i,j$使得这个式子成立,说明$mid$能作为答案

题目并没有要求我们不能选择同一个节点,所以$i,j$之间没有任何关联

现在需要求出$max \left \{ yi-mid*xi \right \}$,$q,p$和$x,y$同理

移项,$yi=mid*xi+b$,求$b$的最大值,发现这是一个一次函数的形式

线段树维护树链剖分序,线段树上每个节点都挂一个上凸包,每次用一条斜率为$mid$的直线去切这个凸包即可

总时间$O(nlog^{4}n)$,理论上过不去,但#巨佬说跑不满

 #include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 30010
#define S1 (N1<<1)
#define T1 (N1<<2)
#define ll long long
#define uint unsigned int
#define rint register int
#define dd double
#define il inline
#define inf 233333333
using namespace std; const dd eps=0.000001;
int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,m;
struct Edge{
int to[S1],nxt[S1],head[N1],cte;
void ae(int u,int v)
{cte++,to[cte]=v,nxt[cte]=head[u],head[u]=cte;}
}E;
struct node{int id;dd val;}tmp[N1];
int cmp1(node s1,node s2){return s1.val<s2.val;}
int stk[N1];
struct SEG{
vector<int>cvh[T1];
void build(int l,int r,int rt,int *A,dd *X,dd *Y)
{
int i,j,cnt=,tp=,mid;
for(i=l;i<=r;i++) cnt++,tmp[cnt].id=A[i],tmp[cnt].val=X[A[i]];
sort(tmp+,tmp+cnt+,cmp1);
stk[++tp]=tmp[].id;
for(i=;i<=cnt;i++)
{
j=tmp[i].id;
while(tp>&&(Y[j]-Y[stk[tp-]])*(X[stk[tp]]-X[stk[tp-]])>=(Y[stk[tp]]-Y[stk[tp-]])*(X[j]-X[stk[tp-]])) tp--;
stk[++tp]=j;
}
for(i=;i<=tp;i++) cvh[rt].push_back(stk[i]);
if(l==r) return;
mid=(l+r)>>;
build(l,mid,rt<<,A,X,Y);
build(mid+,r,rt<<|,A,X,Y);
}
dd cvh_query(int rt,dd K,dd *X,dd *Y)
{
if(cvh[rt].size()==) return Y[cvh[rt][]]-X[cvh[rt][]]*K;
int i,l=,r=cvh[rt].size()-,mid,p=,a,b;
a=cvh[rt][],b=cvh[rt][];
if((Y[b]-Y[a])<=K*(X[b]-X[a])) return Y[a]-X[a]*K;
while(l<=r){
mid=(l+r)>>,a=cvh[rt][mid-],b=cvh[rt][mid];
if((Y[b]-Y[a])>=K*(X[b]-X[a])) p=mid,l=mid+;
else r=mid-;
}return Y[cvh[rt][p]]-X[cvh[rt][p]]*K;
}
dd query(int L,int R,int l,int r,int rt,dd K,dd *X,dd *Y)
{
if(L<=l&&r<=R)
return cvh_query(rt,K,X,Y);
int mid=(l+r)>>; dd ans=-inf;
if(L<=mid) ans=max(ans,query(L,R,l,mid,rt<<,K,X,Y));
if(R>mid) ans=max(ans,query(L,R,mid+,r,rt<<|,K,X,Y));
return ans;
}
}xy,pq;
dd X[N1],Y[N1],P[N1],Q[N1];
namespace cut{
int fa[N1],dep[N1],sz[N1],son[N1],tp[N1];
int st[N1],id[N1],tot;
void dfs1(int u,int ff)
{
for(int j=E.head[u];j;j=E.nxt[j])
{
int v=E.to[j];
if(v==ff) continue;
dep[v]=dep[u]+; fa[v]=u; dfs1(v,u);
sz[u]+=sz[v]; son[u]=sz[v]>sz[son[u]]?v:son[u];
}
sz[u]++;
}
void dfs2(int u)
{
st[u]=++tot,id[tot]=u;
if(son[u]) tp[son[u]]=tp[u], dfs2(son[u]);
for(int j=E.head[u];j;j=E.nxt[j])
{
int v=E.to[j];
if(v==fa[u]||v==son[u]) continue;
tp[v]=v; dfs2(v);
}
}
dd query(int x,int y,dd K)
{
dd mxy=-inf,mpq=-inf;
while(tp[x]!=tp[y])
{
if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
mxy=max(mxy,xy.query(st[tp[x]],st[x],,n,,K,X,Y));
mpq=max(mpq,pq.query(st[tp[x]],st[x],,n,,K,P,Q));
x=fa[tp[x]];
}
if(dep[x]>dep[y]) swap(x,y);
mxy=max(mxy,xy.query(st[x],st[y],,n,,K,X,Y));
mpq=max(mpq,pq.query(st[x],st[y],,n,,K,P,Q));
return mxy+mpq;
}
void init()
{
dep[]=,dfs1(,-);
tp[]=,dfs2();
xy.build(,n,,id,X,Y);
pq.build(,n,,id,P,Q);
}
}; int main()
{
scanf("%d",&n);
int i,x,y;
for(i=;i<=n;i++) scanf("%lf",&X[i]);
for(i=;i<=n;i++) scanf("%lf",&Y[i]);
for(i=;i<=n;i++) scanf("%lf",&P[i]);
for(i=;i<=n;i++) scanf("%lf",&Q[i]);
for(i=;i<n;i++) x=gint(),y=gint(),E.ae(x,y),E.ae(y,x);
cut::init();
scanf("%d",&m);
dd L,R,mid,ans=;
while(m--)
{
x=gint(),y=gint();
L=,R=1e5;
while(R-L>=eps)
{
mid=(L+R)/;
if(cut::query(x,y,mid)>=) ans=mid,L=mid+eps;
else R=mid-eps;
}
printf("%.4lf\n",ans);
}
return ;
}

BZOJ 2402 陶陶的难题II (01分数规划+树剖+线段树+凸包+二分)的更多相关文章

  1. bzoj2402 陶陶的难题II 分数规划+树剖+线段树维护凸壳+二分

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2402 题解 看上去很像分数规划的模型.于是就二分吧.令 \[ \begin{align*}\f ...

  2. bzoj 3597: [Scoi2014]方伯伯运椰子 [01分数规划 消圈定理 spfa负环]

    3597: [Scoi2014]方伯伯运椰子 题意: from mhy12345 给你一个满流网络,对于每一条边,压缩容量1 需要费用ai,扩展容量1 需要bi, 当前容量上限ci,每单位通过该边花费 ...

  3. BZOJ 4819 [Sdoi2017]新生舞会 ——费用流 01分数规划

    比值最大 分数规划 二分答案之后用费用流进行验证. 据说标称强行乘以1e7换成了整数的二分. 不过貌似实数二分也可以过. #include <map> #include <cmath ...

  4. bzoj 4034: [HAOI2015]树上操作 (树剖+线段树 子树操作)

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 6779  Solved: 2275[Submit][Stat ...

  5. bzoj 3531 [Sdoi2014]旅行 (树剖+线段树 动态开点)

    3531: [Sdoi2014]旅行 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 2984  Solved: 1312[Submit][Status ...

  6. BZOJ 4817: [Sdoi2017]树点涂色(LCT+树剖+线段树)

    题目描述 Bob有一棵 nn 个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. Bob ...

  7. bzoj 5210: 最大连通子块和【动态dp+树剖+线段树+堆】

    参考:https://www.cnblogs.com/CQzhangyu/p/8632904.html 要开longlong的 首先看dp,设f[u]为必选u点的子树内最大联通块,p[u]为不一定选u ...

  8. BZOJ 1576 [USACO]安全路经Travel (树剖+线段树)

    题目大意: 给你一张无向图,求1到其他节点 不经过最短路的最后一条边 的最短路长度,保证每个节点的最短路走法唯一 神题,$USACO$题目的思维是真的好 先$dijkstra$出最短路树 对于每个节点 ...

  9. BZOJ 2243: [SDOI2011]染色 (树剖+线段树)

    树链剖分后两个区间合并的时候就判一下相交颜色是否相同来算颜色段数就行了. CODE #include <vector> #include <queue> #include &l ...

随机推荐

  1. 使用ant design pro搭建项目

    脚手架搭建 git clone --depth=1 https://github.com/ant-design/ant-design-pro.git my-project 然后 cd my-proje ...

  2. GCJ 2008 Round 1A Minimum Scalar Product( 水 )

    链接:传送门 题意:给两个向量 v1 = { x1 , x2 , x3 , x4 .... } , v2 = { y1 , y2 , y3 , y4 ...... } 允许任意交换 v1 和 v2 各 ...

  3. HDU1867 - A + B for you again

    Generally speaking, there are a lot of problems about strings processing. Now you encounter another ...

  4. 00065字符串缓冲区_StringBuilder类

    1.StringBuilder类,它也是字符串缓冲区,StringBuilder与它和StringBuffer的有什么不同呢? 它一个可变的字符序列.此类提供一个与 StringBuffer 兼容的 ...

  5. auto-boxing, uboxing,以及缓存问题

    package chengbaoDemo; public class Test02 {    public static void main(String[] args) {        Integ ...

  6. 百度url 参数详解全

    百度url解析Joe.Smith整理大全 百度url解析Joe.Smith整理大全...1 本文链接:http://blog.csdn.net/qq_26816591/article/details/ ...

  7. CDH版hbase-0.98.1单机安装

    HBase 的安装有两种方式:单机安装和分布式安装.HBase的单机安装了解即可,大家重点掌握HBase 分布式集群的安装.下面我们分别进行介绍. HBase 单机安装 HBase 需要运行在 Had ...

  8. codevs——T3657 括号序列

    http://codevs.cn/problem/3657/  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description ...

  9. POI进行ExcelSheet的拷贝

    POI进行ExcelSheet的拷贝 学习了:http://www.360doc.com/content/17/0508/20/42823223_652205632.shtml,这个也需要改改 这个: ...

  10. Unity里包裹Debug,且不影响Debug的重定向

    Debug.Log, Debug.LogWarning, Debug.LogError在project中常常须要再包裹一层.做些定制.也方便开关Log.但有一个问题时.当用一个类将Debug包裹起来后 ...