题目大意:略

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

设现在选择的答案是$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. nyoj329-循环小数

    329-循环小数 内存限制:64MB时间限制:3000msSpecial Judge: No accepted:1submit:1 题目描述: 我们可爱的 c小加 近段儿正在潜心研究数学,当他学习到循 ...

  2. django rest-farme-work 的使用(3)

    请求和响应 Requests and Responses 从这一片来说,我们将真正开始覆盖REST框架的核心.我们来介绍一些基本的构建块 Request objects REST框架引入了一个Requ ...

  3. Linux下MATLAB安装及使用

    安装过程 1.在在media目录下创建matlab文件夹,并挂载R2017b_glnxa64_dvd1.iso镜像文件 sudo mkdir /media/matlab sudo mount -t a ...

  4. PHP开发过程中数组汇总 [ 持续更新系列 ]

    开发过程中经常会使用到数组函数,故特地总结出来,自己熟悉,同时供大家参考!(实例部分会抽空尽快完成) 一.目录 array_merge(); 合并数组 array_keys(); array_filt ...

  5. vscode快捷键(lua开发)

    快速定位行:ctrl+g 查找:ctrl+f 格式化代码:ctrl+alt+f 快速查找到当前复制内容的第一次出现的位置ctrl+d 其他常用不一一列举了

  6. 在数据表中字段存有excel、word文件数据,让其随着记录指针移动而改变显示

    这是一个及其简单的问题,可是被绕住了.当记录移动时,装载数据到excel显示数据.这个方法写在哪里?如何触发? datasource.cds等空间的触发都是多次.到现在也没明白如何去做.笨方法: 1. ...

  7. (7)JPA - Hibernate【从零开始学Spring Boot】

    在说具体如何在spring boot 使用Hibernate前,先抛装引玉些知识点?什么是JPA呢? JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象- ...

  8. HIbernate中openSession和getCurrentSession

      这两者的差别网上非常多资源,我这里就copy一下了,然后有点问题的是今天遇到的问题.   openSession和getCurrentSession的根本差别在于有没有绑定当前线程,所以,用法有差 ...

  9. Spark SQL with Hive

    前一篇文章是Spark SQL的入门篇Spark SQL初探,介绍了一些基础知识和API,可是离我们的日常使用还似乎差了一步之遥. 终结Shark的利用有2个: 1.和Spark程序的集成有诸多限制 ...

  10. UI_KVC赋值

    使用KVC对person的属性进行赋值 [aperson setValue:@"yadong" forKey:@"name"]; [aperson setVal ...