BZOJ3607 : 数据网络

首先答案一定是包含直径某个端点的一个连通块里所有边权值之和,设直径为$AB$,以$A$和$B$分别为根进行处理。

首先按照最长路法则将这棵树进行树链剖分,那么每个叶子的贡献为它与它所在链顶端的点的距离。

将叶子按贡献从大到小排序,并求出$h[x]$表示$x$子树内叶子排名的最小值。

对于询问$(x,k)$,需要取$2k-1$个叶子。

如果$h[x]\leq k$,那么说明前$2k-1$个叶子形成的连通块经过了$x$点,直接返回前$2k-1$个叶子的贡献和即可。

否则对于一个选中的叶子$y$,如果它顶端不是$x$的祖先,那么踢掉$y$的代价为$y$的贡献。

否则踢掉$y$的代价为$y$到$lca(x,y)$的距离。

那么对于最优情况,要么踢掉第$2k-1$大的叶子,要么踢掉第二种情况里深度最大的叶子$y$。找到这个$y$可以通过轻重链剖分+二分查找得到。

总时间复杂度为$O((n+m)\log n)$。

#include<cstdio>
#include<algorithm>
#define N 100010
using namespace std;
int n,m,i,x,y,z,g[N],v[N<<1],w[N<<1],nxt[N<<1],ed,d[N],val[N],A,B;
inline bool cmp(int x,int y){return val[x]>val[y];}
inline void read(int&a){char c;while(!(((c=getchar())>=‘0‘)&&(c<=‘9‘)));a=c-‘0‘;while(((c=getchar())>=‘0‘)&&(c<=‘9‘))(a*=10)+=c-‘0‘;}
inline void add(int x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;}
void dfs(int x,int y){
  if(d[x]>=d[z])z=x;
  for(int i=g[x];i;i=nxt[i])if(v[i]!=y)d[v[i]]=d[x]+w[i],dfs(v[i],x);
}
struct DS{
int s[N],f[N],d[N],son[N],top[N],m,q[N],sum[N],h[N];
int size[N],SON[N],TOP[N],dfn,loc[N],seq[N];
void dfs(int x){
  for(int i=g[x];i;i=nxt[i])if(v[i]!=f[x]){
    s[v[i]]=s[x]+w[i],f[v[i]]=x,dfs(v[i]);
    if(d[v[i]]+w[i]>=d[x])d[x]=d[son[x]=v[i]]+w[i];
  }
}
void dfs2(int x,int y){
  top[x]=y;val[x]=s[x]-s[y];
  if(!son[x]){q[++m]=x;return;}
  dfs2(son[x],y);
  for(int i=g[x];i;i=nxt[i])if(v[i]!=f[x]&&v[i]!=son[x])dfs2(v[i],x);
}
void dfs3(int x){
  if(!h[x])h[x]=m;
  size[x]=1;
  for(int i=g[x];i;i=nxt[i])if(v[i]!=f[x]){
    dfs3(v[i]),h[x]=min(h[x],h[v[i]]),size[x]+=size[v[i]];
    if(size[v[i]]>size[SON[x]])SON[x]=v[i];
  }
}
void dfs4(int x,int y){
  TOP[x]=y;seq[loc[x]=++dfn]=x;
  if(SON[x])dfs4(SON[x],y);
  for(int i=g[x];i;i=nxt[i])if(v[i]!=f[x]&&v[i]!=SON[x])dfs4(v[i],v[i]);
}
void init(int S){
  dfs(S),dfs2(S,S);
  sort(q+1,q+m+1,cmp);
  for(int i=1;i<=m;i++)h[q[i]]=i,sum[i]=sum[i-1]+val[q[i]];
  dfs3(S),dfs4(S,S);
}
inline int ask(int l,int r,int k){
  int t,mid;
  while(l<=r)if(h[seq[mid=(l+r)>>1]]<=k)l=(t=mid)+1;else r=mid-1;
  return seq[t];
}
inline int lca(int x,int k){for(;x;x=f[TOP[x]])if(h[TOP[x]]<=k)return ask(loc[TOP[x]],loc[x],k);}
inline int query(int x,int k){
  k=k*2-1;
  if(k>=m)return sum[m];
  if(h[x]<=k)return sum[k];
  int y=lca(x,k);
  return sum[k]+s[q[h[x]]]-s[y]-min(s[q[k]]-s[top[q[k]]],s[q[h[y]]]-s[y]);
}
}DA,DB;
int main(){
  read(n),read(m);
  for(i=1;i<n;i++)read(x),read(y),read(z),add(x,y,z),add(y,x,z);
  dfs(1,z=0);A=z;
  for(i=1;i<=n;i++)d[i]=0;
  dfs(A,z=0);B=z;
  DA.init(A),DB.init(B);
  while(m--)read(x),read(y),printf("%d\n",max(DA.query(x,y),DB.query(x,y)));
  return 0;
}

  

时间: 2024-11-03 01:22:52

BZOJ3607 : 数据网络的相关文章

云计算和大数据时代网络技术揭秘(十五)大数据网络

大数据网络设计要点 对大数据,Gartner的定义是:需要新处理模式才能具有更强的决策力.洞察发现力和流程优化能力的海量.高增长率和多样化的信息资产. 维基百科的定义是:无法在可承受的时间范围内用常规软件工具进行捕捉.管理和处理的数据集合. 大数据的4V特点:Volume(大量).Velocity(高速).Variety(多样).Value(价值). 大数据的研究非常热门,也产生了很多理论和实践,本章不是探索大数据实现的技术原理,而是从一个典型的大数据模型Hadoop为例,重点 放在其对网络的要

Android 判断用户2G/3G/4G移动数据网络

在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以在 App 的设置模块里,让用户自己选择,在 2G / 3G / 4G 网络条件下,是否允许请求一些流量比较大的数据. 通过 Android 提供的 TelephonyManager 和 ConnectivityManager 都可以获取到 NetworksInfo 对象,可以通过 getType() 获取类型,判断是 wifi 还是 mobile ,

转:Android 判断用户2G/3G/4G移动数据网络

Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以在 App 的设置模块里,让用户自己选择,在 2G / 3G / 4G 网络条件下,是否允许请求一些流量比较大的数据. 通过 Android 提供的 TelephonyManager 和 ConnectivityManager 都可以获取到 NetworksInfo 对象,可以通过 getType(

云时代的阡陌纵横”的数据网络?

尽管云计算非常火热,并不是所有的企业都要迁移到云上,事实上目前只有少数企业和组织把他们的IT迁移到云,有很多合理的理由使得企业更愿意采用自主拥有的on-premise(本地部署,即用户自己导入相应的数据给云计算平台)模式,毕竟不少企业希望能够对他们的数据拥有完全的控制权.我们知道,云计算在短暂的发展历程中,已走过了好几个阶段,既有概念培育期的不被人理解,也有风口期时的圈地运动,更有伴随互联网崛起的备受关注. 仔细分析下来,这几个阶段的云计算虽然"光环萦绕",但实际上落地的效率并不高,向

大数据网络诊断系统项目总结

背景 网络数据流格式: 使用wireshark抓包工具,默认存取为pcap文件 Pcap文件格式: 文件头:  24B:Magic:4B 标示文件的开始 + Major:2B 当前文件主要的版本号 + Minor:2B+ThisZone:4B当地的标准时间+SigFigs:4B时间戳的精度+SnapLen:4B最大的存储长度+LinkType:4B链路类型 Packet包头(16B)和Packet数据组成 Timestamp:时间戳高位,精确到seconds Timestamp:时间戳低位,精确

大文件/数据网络传输方法总结(转载)

网络编程中不免会遇到需要传输大数据.大文件的情况,而由于socket本身缓冲区的限制,大概一次只能发送4K左右的数据,所以在传输大数据时客户端就需要进行分包,在目的地重新组包.而实际上已有一些消息/通讯中间件对此进行了封装,提供了直接发送大数据/文件的接口:除此之外,利用共享目录,ftp,ssh等系统命令来实现大文件/数据也不失为一种好的方法. 1.基础的基于socket进行传输 基础的基于socket进行传输关键在于控制,需要自己行分包和组包. ////////////////////////

(转)Android 判断用户2G/3G/4G移动数据网络

在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需(要根据用户当前网络情况来做一些调整的,也可以在 App 的设置模块里,让用户自己选择,在 2G / 3G / 4G 网络条件下,是否允许请求一些流量比较大的数据. 通过 Android 提供的 TelephonyManager 和 ConnectivityManager 都可以获取到 NetworksInfo 对象,可以通过 getType() 获取类型,判断是 wifi 还是 mobile

VFP 的 SPT 起跳 -- 陈纯(BOE数据网络工作室)

细节描述 Visual FoxPro 的 SPT 技术快速入门 说在前面熟悉 Fox 的朋友都知道,在 VFP 里我们可以使用远程视图 (Remote View) 和 SPT(SQL Pass Through) 技术控制远程异构数据库.这些技术其实是 VFP 对 ODBC 的 API 的封装,所以对于用户来说访问远程数据库就像操作传统的DBF一样简单.关于这两种技术的使用,完全可以洋洋洒洒地写下一本书,鉴于本文主题及篇幅,这里仅枚举 SPT 技术访问远程数据的应用. SPT 与远程视图很多人搞不

IP数据网络基础

TCP的连接管理:面向连接的传输需要三个阶段:连接建立.数据传输和连接终止.TCP连接的管理就是使传输连接的建立和释放都能正常地进行. 三次握手过程,采用客户/服务器方式. 服务器告诉自己的TCP已经准备好接受连接,称为被动打开请求.(被动等待连接建立) 客户程序发出请求叫做主动打开.(主动发起连接的建立) 连接建立过程中要解决的三个问题: 要使每一方能够确知对方的存在. 要允许双方协商一些参数. 能够对传输实体资源进行分配. 三次握手过程 主动关闭端发送一个FIN报文段:FIN(seq:x,a