题目:https://www.luogu.org/problemnew/show/P4220

http://uoj.ac/problem/347

先写了一下 n^2 和三棵树一样的情况,n^2 还写了ST表O(1)求 lca,其实做 n 遍 dfs 就好了...

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. ll rd()
  7. {
  8. ll ret=,f=; char ch=getchar();
  9. while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
  10. while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
  11. return f?ret:-ret;
  12. }
  13. int const xn=1e5+;
  14. int n,hd[][xn],ct[],to[][xn<<],nxt[][xn<<],in[][xn],st[][xn<<][],id[][xn<<][],bin[],bit[xn],tim[],dep[][xn];
  15. ll w[][xn<<],dis[][xn];
  16. ll Min(ll x,ll y){return x<y?x:y;}
  17. ll Max(ll x,ll y){return x>y?x:y;}
  18. void add(int t,int x,int y,ll z){to[t][++ct[t]]=y; nxt[t][ct[t]]=hd[t][x]; hd[t][x]=ct[t]; w[t][ct[t]]=z;}
  19. void dfs(int t,int x,int fa)
  20. {
  21. in[t][x]=++tim[t]; id[t][tim[t]][]=x;
  22. dep[t][x]=dep[t][fa]+; st[t][tim[t]][]=dep[t][x];
  23. for(int i=hd[t][x],u;i;i=nxt[t][i])
  24. {
  25. if((u=to[t][i])==fa)continue;
  26. dis[t][u]=dis[t][x]+w[t][i];
  27. dfs(t,u,x);
  28. st[t][++tim[t]][]=dep[t][x]; id[t][tim[t]][]=x;
  29. }
  30. }
  31. void work(int t)
  32. {
  33. for(int i=;i<;i++)
  34. for(int j=;j<=tim[t]&&j+bin[i]-<=tim[t];j++)
  35. {
  36. if(st[t][j][i-]<st[t][j+bin[i-]][i-])
  37. st[t][j][i]=st[t][j][i-],id[t][j][i]=id[t][j][i-];
  38. else st[t][j][i]=st[t][j+bin[i-]][i-],id[t][j][i]=id[t][j+bin[i-]][i-];
  39. }
  40. }
  41. int lca(int t,int x,int y)
  42. {
  43. int l=in[t][x],r=in[t][y];
  44. if(l>r)swap(l,r); int d=bit[r-l+];
  45. if(st[t][l][d]<st[t][r-bin[d]+][d])return id[t][l][d];
  46. return id[t][r-bin[d]+][d];
  47. }
  48. ll dist(int t,int x,int y){return dis[t][x]+dis[t][y]-*dis[t][lca(t,x,y)];}
  49. void work1()
  50. {
  51. for(int t=;t<;t++)dfs(t,,),work(t);
  52. ll ans=;
  53. for(int i=;i<=n;i++)
  54. for(int j=i+;j<=n;j++)
  55. ans=Max(ans,dist(,i,j)+dist(,i,j)+dist(,i,j));
  56. printf("%lld\n",ans);
  57. }
  58. ll ans=;
  59. ll dfsx(int x,int fa)
  60. {
  61. ll mx=,nmx=;
  62. for(int i=hd[][x],u;i;i=nxt[][i])
  63. {
  64. if((u=to[][i])==fa)continue;
  65. ll tmp=dfsx(u,x);
  66. if(tmp+w[][i]>mx)nmx=mx,mx=tmp+w[][i];
  67. else if(tmp+w[][i]>nmx)nmx=tmp+w[][i];
  68. }
  69. ans=Max(ans,mx+nmx); return mx;
  70. }
  71. int main()
  72. {
  73. n=rd(); ll z;
  74. bin[]=; for(int i=;i<;i++)bin[i]=bin[i-]*;
  75. bit[]=; for(int i=;i<xn;i++)bit[i]=bit[i>>]+;//not n!
  76. for(int t=;t<;t++)
  77. for(int i=,x,y;i<n;i++)
  78. x=rd(),y=rd(),z=rd(),add(t,x,y,z),add(t,y,x,z);
  79. if(n<=){work1(); return ;}
  80. dfsx(,); printf("%lld\n",ans*);
  81. return ;
  82. }

44分

然后就用了随机化算法,用 clock() 和 CLOCKS_PER_SEC 卡时间,过了官方数据。

代码如下:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<ctime>
  5. using namespace std;
  6. typedef long long ll;
  7. ll rd()
  8. {
  9. ll ret=,f=; char ch=getchar();
  10. while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
  11. while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
  12. return f?ret:-ret;
  13. }
  14. ll Min(ll x,ll y){return x<y?x:y;}
  15. ll Max(ll x,ll y){return x>y?x:y;}
  16. int const xn=1e5+;
  17. int n,hd[][xn],ct[],to[][xn<<],nxt[][xn<<];
  18. ll w[][xn<<],dis[][xn];
  19. void add(int t,int x,int y,ll z){to[t][++ct[t]]=y; nxt[t][ct[t]]=hd[t][x]; hd[t][x]=ct[t]; w[t][ct[t]]=z;}
  20. void dfs(int t,int x,int fa)
  21. {
  22. for(int i=hd[t][x],u;i;i=nxt[t][i])
  23. if((u=to[t][i])!=fa)dis[t][u]=dis[t][x]+w[t][i],dfs(t,u,x);
  24. }
  25. void work1()
  26. {
  27. ll ans=;
  28. for(int i=;i<=n;i++)
  29. {
  30. dis[][i]=dis[][i]=dis[][i]=;
  31. for(int t=;t<;t++)dfs(t,i,);
  32. for(int j=;j<=n;j++)ans=Max(ans,dis[][j]+dis[][j]+dis[][j]);
  33. }
  34. printf("%lld\n",ans);
  35. }
  36. bool vis[xn];
  37. int clk(){return (double)clock()/CLOCKS_PER_SEC*;}
  38. int main()
  39. {
  40. int st=clk();
  41. n=rd(); ll z;
  42. for(int t=;t<;t++)
  43. for(int i=,x,y;i<n;i++)
  44. x=rd(),y=rd(),z=rd(),add(t,x,y,z),add(t,y,x,z);
  45. if(n<=){work1(); return ;}
  46. srand(time()); srand(rand());
  47. ll ans=;
  48. for(int rt;clk()-st<=;)
  49. {
  50. rt=rand()%n+;
  51. if(vis[rt])continue; vis[rt]=;
  52. int cnt=;
  53. while(cnt--)
  54. {
  55. vis[rt]=;
  56. for(int t=;t<;t++)dis[t][rt]=,dfs(t,rt,);
  57. ll mx=; int id=rt;
  58. for(int i=;i<=n;i++)
  59. {
  60. ll tmp=dis[][i]+dis[][i]+dis[][i];
  61. if(mx<tmp)mx=tmp;
  62. if(!vis[i]&&dis[][id]+dis[][id]+dis[][id]<tmp)id=i;
  63. }
  64. ans=Max(ans,mx); if(id==rt)break; rt=id;
  65. }
  66. }
  67. printf("%lld\n",ans);
  68. return ;
  69. }

洛谷 P4220 & UOJ #347 通道 —— 随机化的更多相关文章

  1. 洛谷 P2503 [HAOI2006]均分数据 随机化贪心

    洛谷P2503 [HAOI2006]均分数据(随机化贪心) 现在来看这个题就是水题,但模拟赛时想了1个小时贪心,推了一堆结论,最后发现贪心做 不了, 又想了半个小时dp 发现dp好像也做不了,在随机化 ...

  2. 洛谷P4220 [WC2018]通道(边分治+虚树)

    题面 传送门 题解 代码不就百来行么也不算很长丫 虽然这题随机化贪心就可以过而且速度和正解差不多不过我们还是要好好学正解 前置芝士 边分治 米娜应该都知道点分治是个什么东西,而边分治,顾名思义就是对边 ...

  3. 洛谷P3688/uoj#291. [ZJOI2017]树状数组

    传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...

  4. BZOJ3675 & 洛谷3648 & UOJ104:[Apio2014]序列分割——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3675 https://www.luogu.org/problemnew/show/P3648 ht ...

  5. uoj#348/洛谷P4221 [WC2018]州区划分(FWT)

    传送门(uoj) 传送门(洛谷) 全世界都会子集卷积就咱不会--全世界都在写\(FMT\)就咱只会\(FWT\)-- 前置芝士 或运算\(FWT\)或者\(FMT\) 左转洛谷模板区,包教包会 子集卷 ...

  6. 洛谷 P2827 BZOJ 4721 UOJ #264 蚯蚓

    题目描述 本题中,我们将用符号表示对c向下取整,例如:. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现在共有n只蚯蚓(n为正整数).每只 ...

  7. 洛谷 P7450 - [THUSCH2017] 巧克力(斯坦纳树+随机化)

    洛谷题面传送门 9.13 补之前 8.23 做的题,不愧是鸽子 tzc( 首先我们先来探讨一下如果 \(c_{i,j}\le k\) 怎么做,先考虑第一问.显然一个连通块符合条件当且仅当它能够包含所有 ...

  8. 洛谷 P1224 - [NOI2013] 向量内积(随机化)

    洛谷题面传送门 一道很神的随机化. 首先由于我们要求向量点乘 \(\bmod k\) 的值,因此我们可以将所有 \(x_{i,j}\) 都模上 \(k\),显然该操作不影响结果正确性. 注意到这里的 ...

  9. 洛谷P2179 骑行川藏

    什么毒瘤... 解:n = 1的,发现就是一个二次函数,解出来一个v的取值范围,选最大的即可. n = 2的,猜测可以三分.于是先二分给第一段路多少能量,然后用上面的方法求第二段路的最短时间.注意剩余 ...

随机推荐

  1. 摘要: CentOS 6.5搭建Redis3.2.8伪分布式集群

    from https://my.oschina.net/ososchina/blog/856678     摘要: CentOS 6.5搭建Redis3.2.8伪分布式集群 前言 最近在服务器上搭建了 ...

  2. POJ 2092 Grandpa is Famous【水---找出现第二多的数】

    链接: http://poj.org/problem?id=2092 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27454#probl ...

  3. S-形函数广泛应用于ANN 的激活函数

    Logistic function hyperbolic tangent   arctangent function   Gudermannian function   Error function ...

  4. 【python】-- 函数、无参/有参参数、全局变量/局部变量

    函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函 ...

  5. Django之表单验证

    对于前端的表单进行验证的方法,从最简单的js到基于XML传输的Ajax,再到cookie的免认证,现在Django为我们提供了自带的表单验证方法. views.py: from django impo ...

  6. centos7安装 go

    1    下载 - Golang中国 2:解压 tar -xzf go1.0.3.linux-amd64.tar.gz 3:环境 变量 : 把 /usr/local/go/bin 增加到 PATH 环 ...

  7. scala如何解决类型强转问题

    scala如何解决类型强转问题 scala属于强类型语言,在指定变量类型时必须确定数据类型,即便scala拥有引以为傲的隐式推到,这某些场合也有些有心无力. 例如: java同属强类型语言,但java ...

  8. SAP 物料 移动类型

    [转自 http://blog.sina.com.cn/s/blog_494f9a6b0102edf7.html] SAP 物料 移动类型 (2013-12-03 10:15:01) 转载▼   分类 ...

  9. hive查询注意及优化tips

    Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具.使用Hive尽量按照分布式计算的一些特点来设计sql,和传统关系型数据库有区别, 所以需要去掉原有关系型数 ...

  10. mybatis中查询结果进行分组

    在用mybatis进行数据库查询时,对查询结果进行自动分组,在mapper.xml中的配置有些注意的地方,下面是实际项目中一个例子.在数据库中查询中如下: 在结果集中需要对alarmDate进行分组, ...