洛谷 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的,猜测可以三分.于是先二分给第一段路多少能量,然后用上面的方法求第二段路的最短时间.注意剩余 ...
随机推荐
- iptables的用例
iptables书写思路顺序 1.协议 icmp 2.哪个功能和目标:过滤,拒绝 3.数据包流向:外到内 4.哪个链适合:越早越好,INPUT 5.源地址和目标地址 练习1.禁止某些主机或网络访问本机 ...
- AFN多文件进度下载
AFN参考资料 http://www.jianshu.com/p/c36159094e24 http://blog.cnbang.net/tech/2320/http://blog.cnbang.ne ...
- 转载一篇将C/C++ 与lua混合使用入门讲的比较好的文章
转自 http://www.open-open.com/home/space-6246-do-blog-id-1426.html Lua是一个嵌入式的脚本语言,它不仅可以单独使用还能与其它语言混合调用 ...
- Android Interactive Animation
Ref:收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation Ref:界面特效 Ref:BaseAnimation是基于开源的APP,致力于收集各种动画效果( ...
- table control里面各种属性和事件
[转自]http://blog.csdn.net/hackai886/article/details/7935366 SAP中,Table Control是在Screen中用的最广泛的控件之一了,可以 ...
- Spring AspectJ AOP 完整示例
http://outofmemory.cn/java/spring/AOP/aop-aspectj-example-before-after-AfterReturning-afterThrowing- ...
- 1django 视图与网址
创建一个项目,名字叫mysite django-admin startproject mysite(项目名) 成功后,看到如下样式 mysite ├── manage.py └── mysite ├─ ...
- 《C+编程规范 101条规则、准则与最佳实践》笔记
<C+编程规范 101条规则.准则与最佳实践> 0.不要拘泥于小节(了解哪些东西不应该标准化) * 与组织内现有编码规范一致即可 * 包括但不限于: - 缩进 - 行长度 - 命名规范 - ...
- 使用documentFragment
function insertHtml(range, val) { var doc = range.doc, frag = doc.createDocumentFragment(); K('@' + ...
- css属性background
一.background-size 1.具体设定的px值,及北背景图片的具体宽高 2.设定的百分比,相对于容器的宽高 3.设定三个铺设类型: (1)cover: 以宽 / 高 为基本,尽可能的去铺满整 ...