靠!这道题TM搞了我好几天,真是烦死人!!!早上打了一个倍增的TM只有95分QAQ。。。

然后一气之下开始不断卡常,各种玄学优化,可是就是T。。TAT。。

可恶!晚上我就直接打了个tarjan,还好跑过了,可是打的我身心俱残!!!仿佛想起了打splay的岁月,各个代码3000+。。。

不过一次就打成功了,还算比较好吧。。。

先上95分的代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. #include<cstring>
  5. #define maxn 600500
  6. #define ll long long
  7. using namespace std;
  8. struct st{
  9. ll u,v,next,val;
  10. }s[maxn];
  11.  
  12. struct qu{
  13. ll a,b,lca,len;
  14. }quest[maxn];
  15.  
  16. ll n,m,u,v,root,tot,val,head[maxn],ceng[maxn],fa[maxn][],len[maxn],fedge[maxn],zou[maxn],cf[maxn],maxlen,l,r,ma;
  17.  
  18. inline void add(ll u,ll v,ll val)
  19. {
  20. tot++;
  21. s[tot].val = val;
  22. s[tot].u = u;
  23. s[tot].v = v;
  24. s[tot].next = head[u];
  25. head[u] = tot;
  26. }
  27.  
  28. inline void dfs(ll f,ll now)
  29. {
  30. fa[now][] = f;
  31. ceng[now] = ceng[f] + ;
  32. for(ll i = head[now];i;i = s[i].next)
  33. {
  34. v = s[i].v;
  35. if(!ceng[v])
  36. {
  37. fedge[v] = s[i].val;
  38. len[v] = len[now] + s[i].val;
  39. dfs(now,v);
  40. }
  41. }
  42. }
  43.  
  44. inline void init()
  45. {
  46. for(ll j=;(<<j)<=n;j++)
  47. {
  48. for(ll i=;i<=n;i++)
  49. {
  50. fa[i][j]=fa[fa[i][j-]][j-];
  51. }
  52. }
  53. }
  54.  
  55. inline ll lca(ll a,ll b)
  56. {
  57. if(ceng[a] > ceng[b]) swap(a,b);
  58. ll cha = ceng[b] - ceng[a];
  59. for(ll i = ;( << i) <= cha;i++)
  60. {
  61. if(( << i) & cha) b = fa[b][i];
  62. }
  63. if(a!=b)
  64. {
  65. for(ll i=(ll)log2(n);i>=;i--)
  66. {
  67. if(fa[a][i]!=fa[b][i])
  68. {
  69. a=fa[a][i];
  70. b=fa[b][i];
  71. }
  72. }
  73. a = fa[a][];
  74. }
  75. return a;
  76. }
  77.  
  78. inline ll find(ll pos,ll num)
  79. {
  80. ll val = cf[pos];
  81. zou[pos] = ;
  82. for(ll i=head[pos];i;i=s[i].next)
  83. {
  84. if(zou[s[i].v]) continue;
  85. val += find(s[i].v,num);
  86. }
  87. if(val >= num) ma = max(ma,fedge[pos]);
  88. return val;
  89. }
  90.  
  91. inline ll check(ll ans)
  92. {
  93. memset(zou,,sizeof(zou));
  94. memset(cf,,sizeof(cf));
  95. ll ce = ;
  96. for(ll i=;i<=m;i++)
  97. {
  98. if(quest[i].len > ans)
  99. {
  100. cf[quest[i].a]++;
  101. cf[quest[i].b]++;
  102. cf[quest[i].lca] -= ;
  103. ce++;
  104. }
  105. }
  106. ma = -;
  107. find(,ce);
  108. if(ma == -) return ;
  109. if(ans + ma >= maxlen) return ;
  110. return ;
  111. }
  112.  
  113. int main(){
  114. scanf("%lld%lld%",&n,&m);
  115. for(ll i=;i<n;i++)
  116. {
  117. scanf("%lld%lld%lld",&u,&v,&val);
  118. add(u,v,val);
  119. add(v,u,val);
  120. }
  121.  
  122. dfs(,);
  123. init();
  124. for(ll i=;i<=m;i++)
  125. {
  126. scanf("%lld%lld",&u,&v);
  127. quest[i].a = u;
  128. quest[i].b = v;
  129. quest[i].lca = lca(u,v);
  130. quest[i].len = len[u] + len[v] - * len[quest[i].lca];
  131. maxlen = max(maxlen , quest[i].len);
  132. }
  133. r = maxlen;
  134. while(l < r)
  135. {
  136. ll mid = l + r >> ;
  137. if(check(mid)) r = mid;
  138. else l = mid + ;
  139. }
  140. printf("%lld",l);
  141. }

然后上个100 的!!!

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define maxn 300300 << 1
  4. using namespace std;
  5. int head_edge[maxn],head_quest[maxn],fedge[maxn],f[maxn],len[maxn],vis[maxn],cf[maxn],n,m,ma,maxlen,tot,u,v,val,l,r;
  6.  
  7. struct st{
  8. int v,val,next;
  9. }s[maxn];
  10.  
  11. struct que{
  12. int u,v,lca,len,next;
  13. que *es;
  14. }quest[maxn];
  15.  
  16. inline int find(int x)
  17. {
  18. if(f[x] == x) return x;
  19. f[x] = find(f[x]);
  20. return f[x];
  21. }
  22.  
  23. inline void add_edge(int u,int v,int val)
  24. {
  25. tot++;
  26. s[tot].v = v;
  27. s[tot].val = val;
  28. s[tot].next = head_edge[u];
  29. head_edge[u] = tot;
  30. }
  31.  
  32. inline void add_quest(int u,int v)
  33. {
  34. tot++;
  35. quest[tot].u = u;
  36. quest[tot].v = v;
  37. if(tot & ) quest[tot].es = &quest[tot + ];
  38. else quest[tot].es = &quest[tot - ];
  39. quest[tot].next = head_quest[u];
  40. head_quest[u] = tot;
  41. }
  42.  
  43. inline void dfs_tarjan(int father,int now)
  44. {
  45. for(int i=head_edge[now];i;i=s[i].next)
  46. {
  47. if(father == s[i].v) continue;
  48. fedge[s[i].v] = s[i].val;
  49. len[s[i].v] = len[now] + s[i].val;
  50. dfs_tarjan(now,s[i].v);
  51. }
  52. }
  53.  
  54. inline void lca_tarjan(int father,int now)
  55. {
  56. for(int i=head_edge[now];i;i=s[i].next)
  57. {
  58. if(s[i].v == father) continue;
  59. lca_tarjan(now,s[i].v);
  60. }
  61. for(int i=head_quest[now];i;i=quest[i].next)
  62. {
  63. if(vis[quest[i].v])
  64. {
  65. quest[i].lca = find(quest[i].v);
  66. quest[i].len = len[quest[i].u] + len[quest[i].v] - * len[quest[i].lca];
  67. quest[i].es -> lca = quest[i].lca;
  68. quest[i].es -> len = quest[i].len;
  69. maxlen = max(maxlen,quest[i].len);
  70. }
  71. }
  72. vis[now] = ;
  73. f[now] = father;
  74. }
  75.  
  76. inline int dfs_check(int pos,int num)
  77. {
  78. vis[pos] = ;
  79. int val = cf[pos];
  80. for(int i=head_edge[pos];i;i=s[i].next)
  81. {
  82. if(vis[s[i].v]) continue;
  83. val += dfs_check(s[i].v,num);
  84. }
  85. if(val >= num) ma = max(ma,fedge[pos]);
  86. return val;
  87. }
  88.  
  89. inline int check(int ans)
  90. {
  91. for(int i=;i<=n;i++)
  92. {
  93. vis[i] = ;
  94. cf[i] = ;
  95. }
  96. int num = ;
  97. ma = -;
  98. for(int i=;i<=m;i++)
  99. {
  100. if(quest[i].len > ans)
  101. {
  102. cf[quest[i].u]++;
  103. cf[quest[i].v]++;
  104. cf[quest[i].lca] -= ;
  105. num++;
  106. }
  107. }
  108. if(!num) return ;
  109. dfs_check(,num);
  110. if(ma == - || ans + ma < maxlen) return ;
  111. return ;
  112. }
  113.  
  114. int main(){
  115. scanf("%d%d",&n,&m);
  116.  
  117. for(int i=;i<n;i++)
  118. {
  119. scanf("%d%d%d",&u,&v,&val);
  120. add_edge(u,v,val);
  121. add_edge(v,u,val);
  122. }
  123. dfs_tarjan(,);
  124. tot = ;
  125. for(int i=;i<=n;i++) f[i] = i;
  126. for(int i=;i<=m;i++)
  127. {
  128. scanf("%d%d",&u,&v);
  129. add_quest(u,v);
  130. add_quest(v,u);
  131. }
  132.  
  133. lca_tarjan(,);
  134. for(int i=;i<=m;i++) quest[i] = quest[i * ];
  135.  
  136. r = maxlen;
  137. l = max(,r - );
  138. while(l < r)
  139. {
  140. int mid = l + r >> ;
  141. if(check(mid)) r = mid;
  142. else l = mid + ;
  143. }
  144. printf("%d",l);
  145. }

运输计划noip的更多相关文章

  1. 4632 NOIP[2015] 运输计划

    4632 NOIP[2015] 运输计划  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master 题解       题目描述 Description 公元 2044 ...

  2. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

  3. Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)

    Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...

  4. cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分

    2109. [NOIP 2015] 运输计划 ★★★☆   输入文件:transport.in   输出文件:transport.out   简单对比时间限制:3 s   内存限制:256 MB [题 ...

  5. NOIP 2015 BZOJ 4326 运输计划 (树链剖分+二分)

    Description 公元 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n− 条双向航道,每条航道建立在两个星球之间,这 n− 条航道连通了 L 国的所有星球. 小 P 掌管一家物流公司, ...

  6. 【NOIP 2015 DAY2 T3】 运输计划 (树链剖分-LCA)

    题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...

  7. NOIP[2015] 运输计划

    传送门 题目描述 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球 ...

  8. [noip 2015]运输计划 [LCA][树链剖分]

    用了luogu上的题目描述 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的 ...

  9. NOIP 2015运输计划

    题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...

随机推荐

  1. LeetCode算法题-Positions of Large Groups(Java实现)

    这是悦乐书的第323次更新,第346篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第193题(顺位题号是830).在由小写字母组成的字符串S中,那些相同的连续字符会组成集 ...

  2. 重载Prometheus配置

    发送SIGHUP信号给应用程序的主进程: pid ‘’-1‘’是指“终端断线” 发送post请求给指定端点: curl -XPOST http://ip:9090/-/reload 对于此种方法要注意 ...

  3. Java实验3与第五周总结

    1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码.结果截图.) •统计该字符串中字母s出现的次数. •统计该字符串中子串" ...

  4. 2019 java学习 第二周总结

    新学期,新气象,新老师,不同的语言学习. 我已经荒废了大一,感觉自己在大一根本没学啥,可能是自己太贪玩了,导致自己学的不精,自己对其他的见解很少. 也有自大的原因,导致自己一直浮在水平面,有实力,有耐 ...

  5. UrlConnection发送http请求 中文乱码解决

    中文乱码 DataOutputStream dos = new DataOutputStream(httpConn.getOutputStream()); //dos.writeBytes(jsonD ...

  6. [Git] 025 标签命令

    0. 前言 小时候看<剑花-烟雨-江南>,惊讶于那个多重身份的"小侯爷" 后来发现,现实中拥有比小侯爷更多身份的人多如牛毛 其实,在 "Git" 中 ...

  7. 【监控笔记】【2.3】扩展事件——慢查询SQL(执行超过3S的SQL)

    --sql server 2008及以上才支持,2012及以上才支持GUI界面 msdn 扩展事件:点击打开链接 [1]T-SQL实现 基于 rpc_completed(远程过程调用已完成时发生) 事 ...

  8. 剑指Offer编程题(Java实现)——链表中环的入口结点

    题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 思路一 迭代遍历链表,利用HashSet将每个结点添加到哈希表中,如果添加失败(重复遍历了这个结点即遇到环),输出 ...

  9. [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块)

    [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块) 题面 给出一个长度为n的数组,问有多少三元组\((i,j,k)\)满足\(i<j<k,a_j-a_i=a_ ...

  10. bootstrap使用总结(carousel设置大小。item设置大小,img设置大小)

    在bootstrap中使用carousel,先要给.carousel一个大小, 要想使carousel和item和img随着浏览器大小而变,就要设置 .carousel .item { height: ...