[CTSC2017]网络

连一条长度为len的边,使得基环树的直径最小

结论:一定连在某条直径两个点上(否则更靠近不劣)

然后二分答案判定。

dp[i]:链上一个点往下延伸的最大深度

考虑对于任意两个点对最短路径都不能大于mid

就是:任意的(i<j),min(sum[j]-sum[i]+dp[i]+dp[j],len+|sumb-sumj|+|sumi-suma|+dp[i]+dp[j])<mid

前面的min比较好处理,直接按照sum+dp,dp-sum排序,双指针搞一下

不能满足前面的min的点对i,j,必然要满足后面的。

把绝对值拆开成4个,对于任意的i,j,选择的a,b都要使得这些4*k个不等式成立。

suma,sumb移项,所以4个不等式右边都要取最大的(任意转化为最值)

所以双指针的时候可以再用树状数组(为了i<j)找到4个lim

然后移项。

枚举b,sum升序降序排序,四指针维护。

每次看区间的交是否为空。

  1. #include<bits/stdc++.h>
  2. #define reg register int
  3. #define il inline
  4. #define fi first
  5. #define se second
  6. #define mk(a,b) make_pair(a,b)
  7. #define numb (ch^'0')
  8. using namespace std;
  9. typedef long long ll;
  10. template<class T>il void rd(T &x){
  11. char ch;x=;bool fl=false;
  12. while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
  13. for(x=numb;isdigit(ch=getchar());x=x*+numb);
  14. (fl==true)&&(x=-x);
  15. }
  16. template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
  17. template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
  18. template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
  19.  
  20. namespace Miracle{
  21. const int N=1e5+;
  22. const ll inf=0x3f3f3f3f3f3f3f3f;
  23. int n;
  24. struct node{
  25. int nxt,to;
  26. int val;
  27. }e[*N];
  28. int hd[N],cnt;
  29. void add(int x,int y,int z){
  30. e[++cnt].nxt=hd[x];
  31. e[cnt].to=y;
  32. e[cnt].val=z;
  33. hd[x]=cnt;
  34. }
  35. ll ans,len;
  36. ll L,R;
  37. int mem[N],fa[N],vf[N];
  38. int on[N];
  39. ll sum[N];
  40. struct po{
  41. ll v;
  42. int id;
  43. po(){}
  44. po(ll vv,int dd){
  45. v=vv;id=dd;
  46. }
  47. };
  48. struct qs{
  49. po p[N];
  50. int sz;
  51. void push(ll v,int d){
  52. p[++sz]=po(v,d);
  53. }
  54. void clear(){
  55. sz=;
  56. }
  57. il po &operator[](const int &x){return p[x];}
  58. il const po &operator[](const int &x) const {return p[x];}
  59. }su,sd,up,dw;//member's number is num
  60.  
  61. bool cmpu(po a,po b){//sheng
  62. return a.v<b.v;
  63. }
  64. bool cmpd(po a,po b){//jiang
  65. return a.v>b.v;
  66. }
  67. int st,nd,num;
  68. ll mx;
  69. struct tr{
  70. ll f[N];
  71. void clear(){
  72. memset(f,-0x3f,sizeof f);
  73. }
  74. void ins(int x,ll v){
  75. for(;x<=n;x+=x&(-x)) f[x]=max(f[x],v);
  76. }
  77. ll query(int x){
  78. ll ret=-inf;
  79. for(;x;x-=x&(-x)) ret=max(ret,f[x]);
  80. return ret;
  81. }
  82. }t[];
  83. //t[0]:dp-sum
  84. //t[1]:dp+sum
  85. void dfs1(int x,ll dis){
  86. if(dis>mx) {
  87. mx=dis;st=x;
  88. }
  89. for(reg i=hd[x];i;i=e[i].nxt){
  90. int y=e[i].to;
  91. if(y==fa[x]) continue;
  92. fa[y]=x;
  93. dfs1(y,dis+e[i].val);
  94. }
  95. }
  96. void dfs2(int x,ll dis){
  97. if(dis>mx){
  98. mx=dis;nd=x;
  99. }
  100. for(reg i=hd[x];i;i=e[i].nxt){
  101. int y=e[i].to;
  102. if(y==fa[x]) continue;
  103. fa[y]=x;
  104. vf[y]=e[i].val;
  105. dfs2(y,dis+e[i].val);
  106. }
  107. }
  108. ll dp[N];
  109. void fin(int x){
  110. dp[x]=;
  111. for(reg i=hd[x];i;i=e[i].nxt){
  112. int y=e[i].to;
  113. if(y==fa[x]||on[y]) continue;
  114. fa[y]=x;
  115. fin(y);
  116. L=max(L,dp[x]+dp[y]+e[i].val);
  117. dp[x]=max(dp[x],dp[y]+e[i].val);
  118. }
  119. }
  120. struct pointer{
  121. int ptr;
  122. ll lim;
  123. void clear(){
  124. ptr=;lim=-inf;
  125. }
  126. void upda(ll v){
  127. lim=max(lim,v);
  128. }
  129. }p[];
  130. pair<int,int>tp;
  131. void con(int l,int r){
  132. tp.fi=max(tp.fi,l);
  133. tp.se=min(tp.se,r);
  134. }
  135. bool che(ll mid){
  136. ///warning!!!! dp[mem[...[].id]]
  137. t[].clear();t[].clear();
  138. for(reg i=;i<=;++i) p[i].clear();
  139. int ptr=;
  140. for(reg j=;j<=num;++j){
  141. while(ptr<num&&dw[ptr+].v+up[j].v>mid) {
  142. ++ptr;
  143. t[].ins(dw[ptr].id,dw[ptr].v);
  144. t[].ins(dw[ptr].id,sum[dw[ptr].id]+dp[mem[dw[ptr].id]]);
  145. }
  146. if(ptr){
  147. ll djss=dp[mem[up[j].id]]-sum[up[j].id],djas=up[j].v;
  148. ll diss=t[].query(up[j].id-),dias=t[].query(up[j].id-);
  149. p[].upda(len-mid+djss+dias);
  150. p[].upda(len-mid+diss+djas);
  151. p[].upda(len-mid+dias+djas);
  152. p[].upda(len-mid+diss+djss);
  153. }
  154. }
  155. p[].ptr=p[].ptr=;
  156. for(reg b=;b<=num;++b){
  157. while(p[].ptr<=num&&su[p[].ptr].v-p[].lim<su[b].v) ++p[].ptr;
  158. while(p[].ptr<num&&su[p[].ptr+].v+p[].lim<=su[b].v) ++p[].ptr;
  159. while(p[].ptr<num&&-sd[p[].ptr+].v+p[].lim<=su[b].v) ++p[].ptr;
  160. while(p[].ptr<=num&&-sd[p[].ptr].v-p[].lim<su[b].v) ++p[].ptr;
  161. tp.fi=;tp.se=num;
  162. con(p[].ptr,num);
  163. con(,p[].ptr);
  164. con(num-p[].ptr+,num);
  165. con(,num-p[].ptr+);
  166. if(tp.fi<=tp.se) return true;
  167. }
  168. return false;
  169. ///warning!!!! dp[mem[...[].id]]
  170. }
  171. void clear(){
  172. ans=inf;num=;st=nd=;
  173. memset(sum,,sizeof sum);
  174. memset(fa,,sizeof fa);
  175. memset(vf,,sizeof vf);
  176. memset(on,,sizeof on);
  177. memset(hd,,sizeof hd);
  178. su.clear();sd.clear();up.clear();dw.clear();
  179. cnt=;
  180. L=,R=;
  181. }
  182. int main(){
  183. while(){
  184. clear();
  185. rd(n);rd(len);
  186. if(n==&&len==) break;
  187. mx=-;
  188. int x,y,z;
  189. for(reg i=;i<n;++i){
  190. rd(x);rd(y);rd(z);
  191. add(x,y,z);add(y,x,z);
  192. }
  193. if(n==){
  194. puts("");continue;
  195. }
  196. dfs1(,);
  197. fa[st]=;
  198. mx=-;
  199. dfs2(st,);
  200. /*RRR*/ R=mx;
  201. num=;
  202. x=nd;
  203. while(x){
  204. mem[++num]=x;
  205. on[x]=;
  206. sum[num]=sum[num-]+vf[mem[num-]];
  207. x=fa[x];
  208. }
  209. memset(fa,,sizeof fa);
  210. /*LLL*/ for(reg i=;i<=num;++i){
  211. fin(mem[i]);
  212. }
  213.  
  214. for(reg i=;i<=num;++i){
  215. su.push(sum[i],i);
  216. sd.push(sum[i],i);
  217. up.push(dp[mem[i]]+sum[i],i);
  218. dw.push(dp[mem[i]]-sum[i],i);
  219. }
  220. sort(su.p+,su.p+num+,cmpu);
  221. sort(sd.p+,sd.p+num+,cmpd);
  222. sort(up.p+,up.p+num+,cmpu);
  223. sort(dw.p+,dw.p+num+,cmpd);
  224.  
  225. while(L<=R){
  226. ll mid=(L+R)/;
  227. if(che(mid)){
  228. ans=mid;R=mid-;
  229. }else L=mid+;
  230. }
  231. printf("%lld\n",ans);
  232. }
  233. return ;
  234. }
  235.  
  236. }
  237. signed main(){
  238. Miracle::main();
  239. return ;
  240. }
  241.  
  242. /*
  243. Author: *Miracle*
  244. */

二分判定突破口

判定min的或关系。不涉及a,b的先去掉,对于剩下的任意变成最值,纯粹解不等式了。

大量运用排序+双指针。

[CTSC2017]网络的更多相关文章

  1. BZOJ 4901 [CTSC2017]网络

    题解: 只会O(n log^2 n) O(n log n)先留坑 不开long long 0 分!!!! #include<iostream> #include<cstdio> ...

  2. uoj #298. 【CTSC2017】网络

    #298. [CTSC2017]网络 一个一般的网络系统可以被描述成一张无向连通图.图上的每个节点为一个服务器,连接服务器与服务器的数据线则看作图上的一条边,边权为该数据线的长度.两个服务器之间的通讯 ...

  3. 【loj2262】【CTSC2017】网络

    题目 一颗\(n\)个点的树,求加入一条边点之后两点间最长距离的最小值 : \(n \le 100000\) ; 题解 首先加入边的两个端点一定在直径上面,先\(dfs\)拎出直径来讨论(下标只代表直 ...

  4. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  5. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  6. 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法

    如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件.本文主要讨论在不变更 ...

  7. Virtual Box配置CentOS7网络(图文教程)

    之前很多次安装CentOS7虚拟机,每次配置网络在网上找教程,今天总结一下,全图文配置,方便以后查看. Virtual Box可选的网络接入方式包括: NAT 网络地址转换模式(NAT,Network ...

  8. 前端网络、JavaScript优化以及开发小技巧

    一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...

  9. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

随机推荐

  1. 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)

    观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...

  2. SAP MM 明明已经扩展供应商到采购组织下,采购订单里还是报错?

    SAP MM 明明已经扩展供应商到采购组织下,采购订单里还是报错? 如下的PO 4400000069,处于HELD状态.ME22N试图保存它为一个正式的采购订单,报错说供应商没有在采购组织下维护, 使 ...

  3. Git - git status - 查看当前仓库状态

    索引: 目录索引 参看代码 GitHub: git.txt 一.示例: git status 二.说明: 1."status" 部分 该命令可以查出当前分支文件变更状态, 可以查出 ...

  4. 自托管websocket和webapi部署云服务器域名及远程访问

    当写完websocket和webapi服务端时,在本地测试时是没有问题的,因为是通过本地IP及端口号访问(例:127.0.0.1:8080\api\test),也就没有防火墙等安全限制,但当部署到云服 ...

  5. linux安装windows启动盘

    安装gparted

  6. 对css盒模型的理解

    介绍一下标准css的盒子模型?低版本IE的盒子模型有什么不同的? 1.有两种:IE盒子模型(怪异模式).W3c盒子模型(标准模式). 2.盒模型组成:内容(content).内边距(padding). ...

  7. SQL SERVER 2012 AlwaysOn - 操作系统层面 01

    搭建 AlwaysOn 是件非常繁琐的工作,需要从两方面考虑,操作系统层面和数据库层面,AlwaysOn 非常依赖于操作系统,域控,群集,节点等概念: DBA 不但要熟悉数据库也要熟悉操作系统的一些概 ...

  8. java倒计时三种简单实现方式

    写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时: 二:设置时间戳的倒计时: 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: package ...

  9. CMake与Make最简单直接的区别 [转]

    写程序大体步骤为: 1.用编辑器编写源代码,如.c文件. 2.用编译器编译代码生成目标文件,如.o. 3.用链接器连接目标代码生成可执行文件,如.exe. 但如果源文件太多,一个一个编译时就会特别麻烦 ...

  10. Vue中循环的反人类设计

    今天学习Vue到循环那里,表示真是不能理解Vue的反人类设计 具体看代码吧! <!DOCTYPE html> <html> <head> <meta char ...