BZOJ3700: 发展城市

https://lydsy.com/JudgeOnline/problem.php?id=3700

分析:

  • 枚举两个人,先求链交,求到两个端点的时间。
  • 链交求法:求两两\(lca\)的\(4\)个点,去除掉不在路径上的,再去重,取\(dfs\)序最大的两个点。
  • 同向,早进去的那个碗出来,异向,时间段有交。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100050
typedef long long ll;
typedef double f2;
int head[N],nxt[N<<1],to[N<<1],cnt,val[N<<1],n;
int m,qs[N],qt[N],bg[N],ed[N],et[N<<1],qc[N],dep[N];
int f[20][N<<1],Lg[N<<1],dis[N],dfn[N];
char buf[100000],*p1,*p2;
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd() {
int x=0; char s=nc();
while(s<'0'||s>'9') s=nc();
while(s>='0'&&s<='9') x=(((x<<2)+x)<<1)+s-'0',s=nc();
return x;
}
int qv[N];
int ans;
inline void add(int u,int v,int w) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=w;
}
bool in_subtree(int x,int y) {
return dfn[y]>=dfn[x]&&dfn[y]<=ed[x];
}
int cmp(const int &x,const int &y) {return dep[x]<dep[y]?x:y;}
int lca(int x,int y) {
x=bg[x]; y=bg[y];
if(x>y) swap(x,y);int len=Lg[y-x+1];
return cmp(f[len][x],f[len][y-(1<<len)+1]);
}
void dfs(int x,int y) {
dfn[x]=++dfn[0];
dep[x]=dep[y]+1;
et[++et[0]]=x;
int i;
for(i=head[x];i;i=nxt[i]) if(to[i]!=y) {
dis[to[i]]=dis[x]+val[i];
dfs(to[i],x); et[++et[0]]=x;
}
ed[x]=dfn[0];
}
int Dis(int x,int y) {return dis[x]+dis[y]-2*dis[lca(x,y)];}
inline bool cmp1(const int &x,const int &y) {return dfn[x]>dfn[y];}
int G[5];
void QuErY(int x,int y) {
G[1]=lca(qs[x],qs[y]);
G[2]=lca(qs[x],qt[y]);
G[3]=lca(qt[x],qs[y]);
G[4]=lca(qt[x],qt[y]);
int i;
for(i=1;i<=4;i++) if(!in_subtree(qc[x],G[i])||!in_subtree(qc[y],G[i])) G[i]=0;
sort(G+1,G+5,cmp1);
int ln=unique(G+1,G+5)-G-1;
for(i=1;i<=ln;i++) if(!G[i]) ln=i-1;
if(!ln) return ;
if(ln==1) {
int u=G[1];
ll d1=Dis(qs[x],u),d2=Dis(qs[y],u);
if(d1*qv[y]==d2*qv[x]) ans++;
return ;
}else {
int u=G[1],v=G[2];
ll d1=Dis(qs[x],u),d2=Dis(qs[x],v),d3=Dis(qs[y],u),d4=Dis(qs[y],v);
if(d1<=d2) {
if(d3<=d4) {
if((d1*qv[y] >= d3*qv[x] && d2*qv[y] <= d4*qv[x])||(d1*qv[y] <= d3*qv[x] && d2*qv[y] >= d4*qv[x])) ans++;
}else {
swap(d3,d4);
if((d2*qv[y]>=d3*qv[x]&&d1*qv[y]<=d4*qv[x])||(d4*qv[x]>=d1*qv[y]&&d3*qv[x]<=d2*qv[y])) ans++;
}
}else {
swap(d1,d2);
if(d3>d4) {
swap(d3,d4);
if((d1*qv[y] >= d3*qv[x] && d2*qv[y] <= d4*qv[x])||(d1*qv[y] <= d3*qv[x] && d2*qv[y] >= d4*qv[x])) ans++;
}else {
if((d2*qv[y]>=d3*qv[x]&&d1*qv[y]<=d4*qv[x])||(d4*qv[x]>=d1*qv[y]&&d3*qv[x]<=d2*qv[y])) ans++;
}
}
}
}
void clr() {
cnt=et[0]=0; dfn[0]=0; ans=0;
}
void solve() {
n=rd();
int i,x,y,z,j;
clr();
for(i=1;i<=n;i++) head[i]=0;
for(i=1;i<n;i++) {
x=rd(); y=rd(); z=rd();
add(x,y,z); add(y,x,z);
}
dfs(1,0);
for(i=et[0];i;i--) bg[et[i]]=i;
for(i=1;i<=et[0];i++) f[0][i]=et[i];
for(Lg[0]=-1,i=1;i<=et[0];i++) Lg[i]=Lg[i>>1]+1;
for(i=1;(1<<i)<=et[0];i++) {
for(j=1;j+(1<<i)-1<=et[0];j++) {
f[i][j]=cmp(f[i-1][j],f[i-1][j+(1<<(i-1))]);
}
}
dfn[0]=0;
m=rd();
for(i=1;i<=m;i++) qs[i]=rd(),qt[i]=rd(),qv[i]=rd(),qc[i]=lca(qs[i],qt[i]);
for(i=1;i<=m;i++) {
for(j=i+1;j<=m;j++) {
QuErY(i,j);
}
}
printf("%d\n",ans);
}
int main() {
int Tcas;
scanf("%d",&Tcas);
while(Tcas--) solve();
}

BZOJ3700: 发展城市的更多相关文章

  1. BZOJ1906树上的蚂蚁&BZOJ3700发展城市——RMQ求LCA+树链的交

    题目描述 众所周知,Hzwer学长是一名高富帅,他打算投入巨资发展一些小城市. Hzwer打算在城市中开N个宾馆,由于Hzwer非常壕,所以宾馆必须建在空中,但是这样就必须建立宾馆之间的连接通道.机智 ...

  2. 【BZOJ3700】发展城市 [LCA][RMQ]

    发展城市 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 众所周知,Hzwer学长是一名高富 ...

  3. 发展城市 BZOJ 3700

    发展城市 [问题描述] 众所周知,Hzwer学长是一名高富帅,他打算投入巨资发展一些小城市. Hzwer打算在城市中开N个宾馆,由于Hzwer非常壕,所以宾馆必须建在空中,但是这样就必须建立宾馆之间的 ...

  4. 拓扑排序 --- hdu 4948 : Kingdom

    Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  5. [Arduino] 基于Xbee Pro和网络技术的智能公交系统设计

    转自:http://www.21ic.com/app/rf/201112/99474.htm 引言 公共交通具有个体交通无法比拟的强大优势,优先发展城市公共交通系统是解决大.中城市交通问题的最佳途径. ...

  6. 2015年iOS开发工程师前景分析

    "互联网+"概念的提出催生了大量互联网企业,越来越多的传统行业需要与互联网更深地渗透与融合.而在这股互联网化的浪潮中,行业却发现找不到优秀的互联网人才. 互联网企业数量持续增长,用 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. Ming Yin(@kalasoo)在知乎的几个回答 : 观点犀利

    这篇文章汇总了掘金前站长Ming Yin(阴明)在知乎的几个犀利的观点,原文可访问zhihu.com/kalasoo 由@flightmakers转载(收藏)在此 你是否有个人网站.可否和大家分享一下 ...

  9. VR的发展历程-VR全景智慧城市

    从1962年有第一台VR开始,到2014年Oculus被Facebook收购为止,VR经历了一个非常漫长的过程.从鲜为人知,到被广泛认识,逐渐走进我们生活.这就是VR形成的时代.在这个时代里,VR设备 ...

随机推荐

  1. 手机touch事件

    touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时候触发 touchend:触摸结束的时候触发 而每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点( ...

  2. Java学习笔记——java介绍

    Java开源语言 C语言闭源语言 IOS闭源系统  采用object-c语言开发 应用程序分类(从类型分类) C/S(Client Server):不联网的软件也属于C/S B/S(Browser S ...

  3. 我为什么选择采用node.js来做新一代的EasyDarwin RTSP开源流媒体服务器

    在去年我们还未开始开发基于node.js的新版本EasyDarwin RTSP开源流媒体服务器的时候,我写了一篇博客<对EasyDarwin开源项目后续发展的思考:站在巨人的肩膀上再跳上另一个更 ...

  4. Bootstrap学习-导航条-分页导航

    1.导航条基础 导航条(navbar)和上一节介绍的导航(nav),就相差一个字,多了一个“条”字.其实在Bootstrap框架中他们还是明显的区别.在导航条(navbar)中有一个背景色.而且导航条 ...

  5. win7 32位下载安装redis并安装php_redis扩展

    redis打包文件下载地址:http://files.cnblogs.com/files/cuiwenyuan/Redis-3.2.100-Windows-32.zip php_redis.dll下载 ...

  6. Java进阶学习:JSON解析利器JackSon

    Java:JSON解析利器JackSon JackSon基础 1.Maven项目引入 <!-- https://mvnrepository.com/artifact/org.codehaus.j ...

  7. Spark Structured Streaming框架(1)之基本用法

     Spark Struntured Streaming是Spark 2.1.0版本后新增加的流计算引擎,本博将通过几篇博文详细介绍这个框架.这篇是介绍Spark Structured Streamin ...

  8. X-real-ip与X-Forwarded-For

    经过反向代理后,客户端与web服务器之间添加了中间层,因此: 1.代理服务器使用$remote_addr拿到的会是客户端的ip 2. web服务器使用$remote_addr拿到的会是代理服务器的ip ...

  9. The Quantum L3 router and floating IPs

    This post shows how the Quantum L3 Agent uses the Linux IP stack to implement the Quantum L3 Routing ...

  10. linux rpm包的编译

    有些软件包的特性是编译者选定的,如果编译未选定此特性,将无法使用.rpm包的版本落后于源码包. 因此需要定制安装,也就是手动编译安装. 编译需要编译环境. 编译的过程如下: 1.下载源码 2.执行 t ...