bzoj 2402 陶陶的难题II 01分数规划 树链剖分 线段树维护凸包
来源:互联网 发布:虚拟拍照软件下载 编辑:程序博客网 时间:2024/06/06 01:49
先01分数规划一下,然后这个东西就是求
把
然后求的时候三分就行了。
虽然这个东西看起来是
#include <bits/stdc++.h>using namespace std;#define N 31000#define M 1100000#define eps 1e-9int n,tot,cnt,m;double a1[N],a2[N],b1[N],b2[N];int head[N],nex[N<<1],to[N<<1];int fa[N],size[N],son[N],top[N],pos[N],bel[N],deep[N];void add(int x,int y){ tot++; nex[tot]=head[x];head[x]=tot; to[tot]=y;}void dfs1(int x,int y){ fa[x]=y;size[x]=1; deep[x]=deep[y]+1; for(int i=head[x];i;i=nex[i]) if(to[i]!=y) { dfs1(to[i],x); size[x]+=size[to[i]]; son[x]=size[to[i]]>size[son[x]] ? to[i]:son[x]; }}void dfs2(int x,int y,int tp){ top[x]=tp; pos[x]=++cnt;bel[cnt]=x; if(son[x])dfs2(son[x],x,tp); for(int i=head[x];i;i=nex[i]) if(to[i]!=y&&to[i]!=son[x]) dfs2(to[i],x,to[i]);}struct node{ double x,y;int pos; node(){} node(double x,double y,int pos):x(x),y(y),pos(pos){} friend bool operator < (const node &r1,const node &r2) { if(fabs(r1.x-r2.x)<eps)return r1.y<r2.y; return r1.x<r2.x; }};struct seg_tree{ int cnt,tp,ret; int beg[N<<2],en[N<<2],st[N],a[M]; double X[N],Y[N]; node p[N]; void build(int l,int r,int now) { tp=0; for(int i=l;i<=r;i++)p[i]=node(X[i],Y[i],i); sort(p+l,p+r+1); for(int i=l;i<=r;i++) { while(tp>=2&&(Y[p[i].pos]-Y[st[tp]])*(X[st[tp]]-X[st[tp-1]])> (Y[st[tp]]-Y[st[tp-1]])*(X[p[i].pos]-X[st[tp]]))tp--; st[++tp]=p[i].pos; } beg[now]=cnt+1; for(int i=1;i<=tp;i++)a[++cnt]=st[i]; en[now]=cnt; if(l==r)return; int mid=(l+r)>>1; build(l,mid,now<<1);build(mid+1,r,now<<1|1); } void get(int now,double K) { int l=beg[now],r=en[now]; while(r-l>3) { int lm=(l+l+r)/3,rm=(r+r+l)/3; 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 now,int lq,int rq,double K) { if(lq<=l&&r<=rq) {get(now,K);return;} int mid=(l+r)>>1; if(mid>=lq)query(l,mid,now<<1,lq,rq,K); if(mid<rq) query(mid+1,r,now<<1|1,lq,rq,K); } int find(int x,int y,double K) { ret=pos[x]; while(top[x]!=top[y]) { if(deep[top[x]]<deep[top[y]])swap(x,y); query(1,n,1,pos[top[x]],pos[x],K); x=fa[top[x]]; } if(deep[x]<deep[y])swap(x,y); query(1,n,1,pos[y],pos[x],K); return ret; }}tr1,tr2;double check(int x,int y,double K){ int p1=tr1.find(x,y,K),p2=tr2.find(x,y,K); return (tr1.Y[p1]+tr2.Y[p2])/(tr1.X[p1]+tr2.X[p2]);}int main(){ //freopen("tt.in","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%lf",&a1[i]); for(int i=1;i<=n;i++)scanf("%lf",&a2[i]); for(int i=1;i<=n;i++)scanf("%lf",&b1[i]); for(int i=1;i<=n;i++)scanf("%lf",&b2[i]); for(int i=1,x,y;i<n;i++) { scanf("%d%d",&x,&y); add(x,y);add(y,x); } dfs1(1,0); dfs2(1,0,1); for(int i=1;i<=n;i++) { tr1.X[pos[i]]=a1[i];tr1.Y[pos[i]]=a2[i]; tr2.X[pos[i]]=b1[i];tr2.Y[pos[i]]=b2[i]; } tr1.build(1,n,1); tr2.build(1,n,1); scanf("%d",&m); for(int x,y;m--;) { scanf("%d%d",&x,&y); double pre=2e5,ans=check(x,y,pre); while(fabs(ans-pre)>1e-4) { pre=ans; ans=check(x,y,pre); } printf("%.3lf\n",ans); } return 0;}
0 0
- bzoj 2402 陶陶的难题II 01分数规划 树链剖分 线段树维护凸包
- BZOJ 2402 陶陶的难题II 二分答案+斜率优化+树链剖分+线段树维护凸包
- bzoj2402 陶陶的难题II
- BZOJ 2401 陶陶的难题I 数论
- bzoj 4515 [Sdoi2016]游戏 线段树维护凸包
- 陶陶的难题
- bzoj 1486(01分数规划)
- bzoj 3232 01分数规划
- HDU 6070 Dirt Ratio 分数规划 二分 线段树维护区间最值
- BZOJ2401: 陶陶的难题I
- bzoj 1018 堵塞的交通|线段树维护连通性
- BZOJ 4034浅谈树链剖分及线段树维护
- bzoj 3232: 圈地游戏 01分数规划
- [BZOJ]5090: 组题 01分数规划
- HDU6070(分数规划+线段树)
- BZOJ-4811: [Ynoi2017]由乃的OJ (树链剖分 线段树维护区间操作值 好题)
- BZOJ 2124 线段树维护hash值
- bzoj 2957 楼房重建 线段树维护
- vbs教程《字符串处理》
- Paint类介绍 以及使用
- windows下查询被占用的端口, 并杀掉相应的进程
- 作旧年结束
- ActiveMQ+Spring 工程创建详解
- bzoj 2402 陶陶的难题II 01分数规划 树链剖分 线段树维护凸包
- Linux stat函数获取文件属性(文件大小,创建时间等)
- 网页前端的Tribon三维模型展示技术分析
- 拷贝构造函数
- LitePal总结
- 继承之Object类
- 111
- 英文语法 —— 句型(定语从句)
- ZCMU—1396