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. hdu 5381 The sum of gcd 2015多校联合训练赛#8莫队算法

    The sum of gcd Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T ...

  2. centos7.0 增加/usr分区的容量减少home分区的大小

    把/home内容备份,然后将/home文件系统所在的逻辑卷删除,扩大/root文件系统,新建/home:tar cvf /tmp/home.tar /home #备份/homeumount /home ...

  3. c_str()方法使用

    语法: const char *c_str(); c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过 ...

  4. 【BZOJ3270】博物馆 期望DP+高斯消元

    [BZOJ3270]博物馆 Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n ...

  5. Largest Rectangle in a Histogram (最大子矩阵)

    hdu 1506 A histogram is a polygon composed of a sequence of rectangles aligned at a common base line ...

  6. nodejs windows下安装运行

    node 官网下载地址http://nodejs.org/  下载自己对应的版本  ,我下的是windows版本 node-v4.1.1-x64.msi 然后 下一步 下一步 就完成安装了,非常简单, ...

  7. react create app ,nginx服务器配置

    server{ listen 80; server_name www.domain.com domain.com; location ~* \.js$ { root /home/hard/Projec ...

  8. Java之线程池(一)

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...

  9. 显示HTML的版权符号

    最近有小伙伴问©符号在页面显示很小,于是去查看他的源代码 他在HTML代码里对应输入© 那么在页面里应该会正常显示版权符号,可是为什么会出现这种问题呢? 首先我想到页面在设计的时候,用的字体是宋体,就 ...

  10. Linux与Windows编译器的区别

    移植工作開始后的第一步就是在目标平台Linux上进行编译,并链接源码.因为须要移植的软件通常并未在Linux平台上编译过,编译的过程可能会遇到非常大的困难.普通情况下,由类型声明引起的编译错误是比較e ...