bzoj2402 陶陶的难题II
这个是题目描述:
题解:
啊啊啊啊啊……
垃圾分数规划。
垃圾树链剖分。
垃圾斜率优化。
垃圾darkbzoj。
这里才是题解:
我们设那个分数的值=k,那么有
$(yi-k*xi)+(qj-k*pj)=0$
我们要做的是让k最大。
那么很明显开两颗线段树,每个节点存一个凸包。
鉴于我们要让b值最大,我们要维护一个上凸包。
然后就是三分凸包+树剖。
代码:
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 30050
#define db double
int n,hed[N],cnt,m;
const db inf = 1e10;
const db eps = 1e-;
struct Pnt
{
db x,y;
}p1[N],p2[N];
struct EG
{
int to,nxt;
}e[*N];
void ae(int f,int t)
{
e[++cnt].to = t;
e[cnt].nxt = hed[f];
hed[f] = cnt;
}
int fa[N],siz[N],son[N],dep[N],top[N];
int tin[N],tim;
void dfs1(int u,int f)
{
siz[u]=;
fa[u]=f;
dep[u]=dep[f]+;
for(int j=hed[u];j;j=e[j].nxt)
{
int to = e[j].to;
if(to==f)continue;
dfs1(to,u);
siz[u]+=siz[to];
if(siz[to]>siz[son[u]])son[u]=to;
}
}
void dfs2(int u,int tp)
{
top[u]=tp;
tin[u]=++tim;
if(son[u])
{
dfs2(son[u],tp);
for(int j=hed[u];j;j=e[j].nxt)
{
int to = e[j].to;
if(to==fa[u]||to==son[u])continue;
dfs2(to,to);
}
}
}
struct Pair
{
db x,y;int id;
Pair(){}
Pair(db x,db y,int i):x(x),y(y),id(i){}
friend bool operator < (Pair a,Pair b)
{
if(fabs(a.x-b.x)<eps)return a.y<b.y;
return a.x<b.x;
}
};
struct segtree
{
db x[N],y[N];
Pair tmp[N];
int a[*N],ens[N<<],beg[N<<],tm;
int ct,s[N];
segtree(){tm=;}
void build(int l,int r,int u)
{
ct = ;
for(int i=l;i<=r;i++)tmp[i] = Pair(x[i],y[i],i);
sort(tmp+l,tmp++r);
for(int i=l;i<=r;i++)
{
while(ct>=&&(tmp[i].y-y[s[ct]])*(x[s[ct]]-x[s[ct-]])>(y[s[ct]]-y[s[ct-]])*(tmp[i].x-x[s[ct]]))
ct--;
s[++ct]=tmp[i].id;
}
beg[u]=tm+;
for(int i=;i<=ct;i++)a[++tm]=s[i];
ens[u]=tm;
if(l==r)return ;
int mid = (l+r)>>;
build(l,mid,u<<);
build(mid+,r,u<<|);
}
int ret;
void div_3(int u,db k)
{
int l = beg[u],r = ens[u];
while(r-l>)
{
int lm = (l+l+r)/,rm = (l+r+r)/;
if(y[a[lm]]-k*x[a[lm]]>y[a[rm]]-k*x[a[rm]])r=rm;
else l=lm;
}
for(int i=l;i<=r;i++)
if(y[a[i]]-k*x[a[i]]>y[ret]-k*x[ret])ret=a[i];
}
void query(int l,int r,int u,int ql,int qr,db k)
{
if(l==ql&&r==qr)
{
div_3(u,k);
return ;
}
int mid = (l+r)>>;
if(qr<=mid)query(l,mid,u<<,ql,qr,k);
else if(ql>mid)query(mid+,r,u<<|,ql,qr,k);
else query(l,mid,u<<,ql,mid,k),query(mid+,r,u<<|,mid+,qr,k);
}
int get_ret(int x,int y,db k)
{
ret = tin[x];
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
query(,n,,tin[top[x]],tin[x],k);
x = fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
query(,n,,tin[x],tin[y],k);
return ret;
}
}tr[];
db gt(int x,int y,db k)
{
int a = tr[].get_ret(x,y,k);
int b = tr[].get_ret(x,y,k);
return (tr[].y[a]+tr[].y[b])/(tr[].x[a]+tr[].x[b]);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lf",&p1[i].x);
for(int i=;i<=n;i++)scanf("%lf",&p1[i].y);
for(int i=;i<=n;i++)scanf("%lf",&p2[i].x);
for(int i=;i<=n;i++)scanf("%lf",&p2[i].y);
for(int f,t,i=;i<n;i++)
{
scanf("%d%d",&f,&t);
ae(f,t),ae(t,f);
}
dfs1(,),dfs2(,);
for(int i=;i<=n;i++)
{
tr[].x[tin[i]]=p1[i].x;
tr[].y[tin[i]]=p1[i].y;
tr[].x[tin[i]]=p2[i].x;
tr[].y[tin[i]]=p2[i].y;
}
tr[].build(,n,);
tr[].build(,n,);
scanf("%d",&m);
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
db las = 2e5 , ans = gt(x,y,las);
while(fabs(ans-las)>1e-)
{
las = ans;
ans = gt(x,y,las);
}
printf("%.4lf\n",ans);
}
return ;
}
bzoj2402 陶陶的难题II的更多相关文章
- [BZOJ2402]陶陶的难题II(树链剖分+线段树维护凸包+分数规划)
陶陶的难题II 时间限制:40s 空间限制:128MB 题目描述 输入格式 第一行包含一个正整数N,表示树中结点的个数. 第二行包含N个正实数,第i个数表示xi (1<=xi<= ...
- bzoj 2402: 陶陶的难题II 二分答案维护凸包
2402: 陶陶的难题II Time Limit: 40 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 68 Solved: 45[Submi ...
- BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)
前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...
- 【BZOJ2401】陶陶的难题I 欧拉函数+线性筛
[BZOJ2401]陶陶的难题I 题意:求,n<=1000000,T<=100000 题解:直接做是n*sqrt(n)的,显然会TLE,不过这题a和b都是循环到n,那么就可以进行如下的神奇 ...
- bzoj 2401: 陶陶的难题I 数论
2401: 陶陶的难题I Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 89 Solved: 24[Submit][Status] Descript ...
- P1676陶陶吃苹果 - vijos
描述 curimit知道陶陶很喜欢吃苹果.于是curimit准备在陶陶生日的时候送给他一棵苹果树. curimit准备了一棵这样的苹果树作为生日礼物:这棵苹果树有n个节点,每个节点上有c[i]个苹果, ...
- 武汉科技大学ACM:1007: 陶陶摘苹果
Problem Description 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹 ...
- 洛谷-陶陶摘苹果(升级版)-BOSS战-入门综合练习1
题目描述 Description 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与NOIp2005普及组第一题不同 ...
- NOIP2005-普及组复赛-第一题-陶陶摘苹果
题目描述 Description 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳 ...
- noip普及组2005 陶陶摘苹果
陶陶摘苹果 描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在 ...
随机推荐
- Unity里的人物驱动/换装备/换武器/换衣服/卡通重定位(转)
Unity里的人物驱动/换装备/换武器/换衣服/动画重定位 刚学的过程被这个问题困扰最多. 首先,基本的,大家都知道驱动人物需要骨架.绑骨的Mesh和动画(这三个要是不知道的话就得考虑看看计算机图形学 ...
- python 子类调用父类成员的方法
1.直接写类名调用: parent_class.parent_attribute(self) class Animal(): def __init__(self, name): self.name = ...
- 《对“XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们》的问题的解决方法
<对“XXX::Invoke”类型的已垃圾回收委托进行了回调.这可能会导致应用程序崩溃.损坏和数据丢失.向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们& ...
- Codeforces Round #544 (Div. 3) B.Preparation for International Women's Day
链接:https://codeforces.com/contest/1133/problem/B 题意: 给n个数,和一个k,在n个数中选几对数,保证没对数相加可以整除k. 求最大能选几个数. 思路: ...
- Codeforces Round #408 (Div. 2) A
Description Zane the wizard had never loved anyone before, until he fell in love with a girl, whose ...
- Solutions to an Equation LightOJ - 1306
Solutions to an Equation LightOJ - 1306 一个基础的扩展欧几里得算法的应用. 解方程ax+by=c时,基本就是先记录下a和b的符号fla和flb(a为正则fla为 ...
- 因磁盘空间不足导致HDFS的NameNode进入安全模式问题记录
因磁盘空间不足导致HDFS的NameNode进入安全模式问题记录,调用API上传及下载文件时报如下错误信息: org.apache.hadoop.ipc.RemoteException(org.apa ...
- 关于web中的路径
做了许多Demo发现,浏览器解析的路径和服务器解析的路径是不同的.我们知道,路径加上/的时候,表示的是绝对路径的意思,而如果是服务器解析的话,这个/相对的是我们的web应用,即相对于http://19 ...
- FACVSPOW - Factorial vs Power 数学方法 + 二分
http://www.spoj.com/problems/FACVSPOW/ 求解n! > a^n最小的整数n 对于有n!和a^n的东西,一般是取ln 然后就是求解 (ln(1) + ln(2) ...
- Asp.net 字符(三)
using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using ...