洛谷 P4220 & UOJ #347 通道 —— 随机化
题目:https://www.luogu.org/problemnew/show/P4220
先写了一下 n^2 和三棵树一样的情况,n^2 还写了ST表O(1)求 lca,其实做 n 遍 dfs 就好了...
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll rd()
{
ll ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int const xn=1e5+;
int n,hd[][xn],ct[],to[][xn<<],nxt[][xn<<],in[][xn],st[][xn<<][],id[][xn<<][],bin[],bit[xn],tim[],dep[][xn];
ll w[][xn<<],dis[][xn];
ll Min(ll x,ll y){return x<y?x:y;}
ll Max(ll x,ll y){return x>y?x:y;}
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;}
void dfs(int t,int x,int fa)
{
in[t][x]=++tim[t]; id[t][tim[t]][]=x;
dep[t][x]=dep[t][fa]+; st[t][tim[t]][]=dep[t][x];
for(int i=hd[t][x],u;i;i=nxt[t][i])
{
if((u=to[t][i])==fa)continue;
dis[t][u]=dis[t][x]+w[t][i];
dfs(t,u,x);
st[t][++tim[t]][]=dep[t][x]; id[t][tim[t]][]=x;
}
}
void work(int t)
{
for(int i=;i<;i++)
for(int j=;j<=tim[t]&&j+bin[i]-<=tim[t];j++)
{
if(st[t][j][i-]<st[t][j+bin[i-]][i-])
st[t][j][i]=st[t][j][i-],id[t][j][i]=id[t][j][i-];
else st[t][j][i]=st[t][j+bin[i-]][i-],id[t][j][i]=id[t][j+bin[i-]][i-];
}
}
int lca(int t,int x,int y)
{
int l=in[t][x],r=in[t][y];
if(l>r)swap(l,r); int d=bit[r-l+];
if(st[t][l][d]<st[t][r-bin[d]+][d])return id[t][l][d];
return id[t][r-bin[d]+][d];
}
ll dist(int t,int x,int y){return dis[t][x]+dis[t][y]-*dis[t][lca(t,x,y)];}
void work1()
{
for(int t=;t<;t++)dfs(t,,),work(t);
ll ans=;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
ans=Max(ans,dist(,i,j)+dist(,i,j)+dist(,i,j));
printf("%lld\n",ans);
}
ll ans=;
ll dfsx(int x,int fa)
{
ll mx=,nmx=;
for(int i=hd[][x],u;i;i=nxt[][i])
{
if((u=to[][i])==fa)continue;
ll tmp=dfsx(u,x);
if(tmp+w[][i]>mx)nmx=mx,mx=tmp+w[][i];
else if(tmp+w[][i]>nmx)nmx=tmp+w[][i];
}
ans=Max(ans,mx+nmx); return mx;
}
int main()
{
n=rd(); ll z;
bin[]=; for(int i=;i<;i++)bin[i]=bin[i-]*;
bit[]=; for(int i=;i<xn;i++)bit[i]=bit[i>>]+;//not n!
for(int t=;t<;t++)
for(int i=,x,y;i<n;i++)
x=rd(),y=rd(),z=rd(),add(t,x,y,z),add(t,y,x,z);
if(n<=){work1(); return ;}
dfsx(,); printf("%lld\n",ans*);
return ;
}
44分
然后就用了随机化算法,用 clock() 和 CLOCKS_PER_SEC 卡时间,过了官方数据。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
using namespace std;
typedef long long ll;
ll rd()
{
ll ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
ll Min(ll x,ll y){return x<y?x:y;}
ll Max(ll x,ll y){return x>y?x:y;}
int const xn=1e5+;
int n,hd[][xn],ct[],to[][xn<<],nxt[][xn<<];
ll w[][xn<<],dis[][xn];
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;}
void dfs(int t,int x,int fa)
{
for(int i=hd[t][x],u;i;i=nxt[t][i])
if((u=to[t][i])!=fa)dis[t][u]=dis[t][x]+w[t][i],dfs(t,u,x);
}
void work1()
{
ll ans=;
for(int i=;i<=n;i++)
{
dis[][i]=dis[][i]=dis[][i]=;
for(int t=;t<;t++)dfs(t,i,);
for(int j=;j<=n;j++)ans=Max(ans,dis[][j]+dis[][j]+dis[][j]);
}
printf("%lld\n",ans);
}
bool vis[xn];
int clk(){return (double)clock()/CLOCKS_PER_SEC*;}
int main()
{
int st=clk();
n=rd(); ll z;
for(int t=;t<;t++)
for(int i=,x,y;i<n;i++)
x=rd(),y=rd(),z=rd(),add(t,x,y,z),add(t,y,x,z);
if(n<=){work1(); return ;}
srand(time()); srand(rand());
ll ans=;
for(int rt;clk()-st<=;)
{
rt=rand()%n+;
if(vis[rt])continue; vis[rt]=;
int cnt=;
while(cnt--)
{
vis[rt]=;
for(int t=;t<;t++)dis[t][rt]=,dfs(t,rt,);
ll mx=; int id=rt;
for(int i=;i<=n;i++)
{
ll tmp=dis[][i]+dis[][i]+dis[][i];
if(mx<tmp)mx=tmp;
if(!vis[i]&&dis[][id]+dis[][id]+dis[][id]<tmp)id=i;
}
ans=Max(ans,mx); if(id==rt)break; rt=id;
}
}
printf("%lld\n",ans);
return ;
}
洛谷 P4220 & UOJ #347 通道 —— 随机化的更多相关文章
- 洛谷 P2503 [HAOI2006]均分数据 随机化贪心
洛谷P2503 [HAOI2006]均分数据(随机化贪心) 现在来看这个题就是水题,但模拟赛时想了1个小时贪心,推了一堆结论,最后发现贪心做 不了, 又想了半个小时dp 发现dp好像也做不了,在随机化 ...
- 洛谷P4220 [WC2018]通道(边分治+虚树)
题面 传送门 题解 代码不就百来行么也不算很长丫 虽然这题随机化贪心就可以过而且速度和正解差不多不过我们还是要好好学正解 前置芝士 边分治 米娜应该都知道点分治是个什么东西,而边分治,顾名思义就是对边 ...
- 洛谷P3688/uoj#291. [ZJOI2017]树状数组
传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...
- BZOJ3675 & 洛谷3648 & UOJ104:[Apio2014]序列分割——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3675 https://www.luogu.org/problemnew/show/P3648 ht ...
- uoj#348/洛谷P4221 [WC2018]州区划分(FWT)
传送门(uoj) 传送门(洛谷) 全世界都会子集卷积就咱不会--全世界都在写\(FMT\)就咱只会\(FWT\)-- 前置芝士 或运算\(FWT\)或者\(FMT\) 左转洛谷模板区,包教包会 子集卷 ...
- 洛谷 P2827 BZOJ 4721 UOJ #264 蚯蚓
题目描述 本题中,我们将用符号表示对c向下取整,例如:. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现在共有n只蚯蚓(n为正整数).每只 ...
- 洛谷 P7450 - [THUSCH2017] 巧克力(斯坦纳树+随机化)
洛谷题面传送门 9.13 补之前 8.23 做的题,不愧是鸽子 tzc( 首先我们先来探讨一下如果 \(c_{i,j}\le k\) 怎么做,先考虑第一问.显然一个连通块符合条件当且仅当它能够包含所有 ...
- 洛谷 P1224 - [NOI2013] 向量内积(随机化)
洛谷题面传送门 一道很神的随机化. 首先由于我们要求向量点乘 \(\bmod k\) 的值,因此我们可以将所有 \(x_{i,j}\) 都模上 \(k\),显然该操作不影响结果正确性. 注意到这里的 ...
- 洛谷P2179 骑行川藏
什么毒瘤... 解:n = 1的,发现就是一个二次函数,解出来一个v的取值范围,选最大的即可. n = 2的,猜测可以三分.于是先二分给第一段路多少能量,然后用上面的方法求第二段路的最短时间.注意剩余 ...
随机推荐
- Dire Wolf(区间DP)
Dire Wolf Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others)Total ...
- 合唱队形(LIS)
合唱队形 OpenJ_Bailian - 2711 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. 合唱队形是指这样的一种队形:设K位同 ...
- thinkphp5, 省略index.php
Apache:1. httpd.conf配置文件中加载了mod_rewrite.so模块2. AllowOverride None 将None改为 All3. 把下面的内容保存为.htaccess文件 ...
- Linux根目录下重要文件夹
bin存放系统命令的目录,普通用户和超级用户都可以执行,不过放在这里的命令在单用户模式下也可以执行 sbin保存和系统环境设置相关的命令,只有超级用户可以使用这些命令进行系统环境的设置,但有些命令可以 ...
- postgres=# psql -U postgres -h 127.0.0.1 -p 5432 -d dreamstart_dev -w
postgres=# psql -U postgres -h 127.0.0.1 -p 5432 -d dreamstart_dev -wpostgres-# \dNo relations found ...
- Windows平台下搭建Git服务器的图文教程(转发)
Git没有客户端服务器端的概念,但是要共享Git仓库,就需要用到SSH协议(FTP , HTTPS , SFTP等协议也能实现Git共享,此文档不讨论),但是SSH有客户端服务器端,所以在window ...
- urllib2下载网页的三种方法
1.最直接的方法 #-*- coding: utf-8 -*- import urllib2 #直接请求 response = urllib2.urlopen('https://www.baidu.c ...
- Linux 下 Crontab 命令使用详解 定时任务
一. Crontab 介绍 crontab命令的功能是在一定的时间间隔调度一些命令的运行. 1.1 /etc/crontab 文件 在/etc文件夹下有一个crontab文件,这里存放有系统运行的一 ...
- Java多线程系列 JUC锁07 ConditionObject分析
ConditionObject ConditionObject是AQS中的内部类,提供了条件锁的同步实现,实现了Condition接口,并且实现了其中的await(),signal(),signalA ...
- [原创]java WEB学习笔记39:EL中的运算符号(算术运算符,关系运算符,逻辑运算符,empty运算符,条件运算符,括号运算符)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...