UOJ 347(洛谷4220) 【WC2018】通道——随机化
https://www.luogu.org/problemnew/show/P4220
先写了暴力分的44分。那个两棵树、其中一棵是编号连续的链、边权都是1的点好像可以线段树合并,但没写。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll rdn()
{
ll ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
ll Mx(ll a,ll b){return a>b?a:b;}
const int N=1e5+,M=,K=;
int n,hd[][N],xnt,to[][N<<],nxt[][N<<];
ll w[][N<<],dis[N],ans,ds2[M][M]; bool flag;
void add(int t,int x,int y,ll z){to[t][++xnt]=y;nxt[t][xnt]=hd[t][x];hd[t][x]=xnt;w[t][xnt]=z;}
void chk(int cr,int fa)
{
for(int i=hd[][cr],v;i;i=nxt[][i])
if((v=to[][i])!=fa)
{
bool fg=;ll tw;
for(int j=hd[][cr];j;j=nxt[][j])
if(to[][j]==v){fg=;tw=w[][j];break;}
if(!fg||tw!=w[][i]){flag=;return;}
for(int j=hd[][cr];j;j=nxt[][j])
if(to[][j]==v){fg=;tw=w[][j];break;}
if(!fg||tw!=w[][i]){flag=;return;}
chk(v,cr);if(flag)return;
}
}
void dfs1(int cr,int fa)
{
ll mx=,mx2=;
for(int i=hd[][cr],v;i;i=nxt[][i])
if((v=to[][i])!=fa)
{
dfs1(v,cr);ll tp=dis[v]+w[][i];
if(tp>mx)mx2=mx,mx=tp;
else if(tp>mx2)mx2=tp;
}
ans=Mx(ans,mx+mx2);dis[cr]=mx;
}
void dfs2(int cr,int fa,ll lj,int t,int rt)
{
ds2[rt][cr]+=lj;
for(int i=hd[t][cr],v;i;i=nxt[t][i])
if((v=to[t][i])!=fa)dfs2(v,cr,lj+w[t][i],t,rt);
}
void solve2()
{
for(int t=;t<;t++)
for(int i=;i<=n;i++)dfs2(i,,,t,i);
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)ans=Mx(ans,ds2[i][j]);
printf("%lld\n",ans);
}
int main()
{
n=rdn();
for(int t=;t<;t++)
{
ll z;xnt=;
for(int i=,u,v;i<n;i++)
u=rdn(),v=rdn(),z=rdn(),add(t,u,v,z),add(t,v,u,z);
}
if(n<=){solve2();return ;}
chk(,);if(!flag){dfs1(,);printf("%lld\n",ans*);return ;}
return ;
}
正解要边分治和虚树,现在还不会。所以用了随机化。
卡时间可以调用 clock() ,返回的是 CPU 周期,CLOCKS_PER_SEC 返回的是一秒运行了几个 CPU 周期,所以 clock() / CLOCKS_PER_SEC 可以算出运行了几秒。
随机一个根,暴力算每个点到这个根的距离(3个距离求和),把距离当前根最远的那个点设为新的根,同时更新答案。做几次之后就再随机一个根。这个间隙可以小一些,10或者8之类的。
可以打 vis[ ] 标记,作过根的点就不再作根了。
还是通不过 UOJ 的 hack 数据。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
#define ll long long
#define db double
using namespace std;
ll rdn()
{
ll ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
ll Mx(ll a,ll b){return a>b?a:b;}
const int N=1e5+,TL=;
int n,hd[][N],xnt,to[][N<<],nxt[][N<<];
ll w[][N<<],dis[N],ds1[][],ans;
bool vis[N];
void add(int t,int x,int y,ll z){to[t][++xnt]=y;nxt[t][xnt]=hd[t][x];hd[t][x]=xnt;w[t][xnt]=z;}
int clk(){return (db)clock()/CLOCKS_PER_SEC*;}//ms
void dfs1(int cr,int fa,ll lj,int t,int rt)
{
ds1[rt][cr]+=lj;
for(int i=hd[t][cr],v;i;i=nxt[t][i])
if((v=to[t][i])!=fa)dfs1(v,cr,lj+w[t][i],t,rt);
}
void solve1()
{
for(int t=;t<;t++)
for(int i=;i<=n;i++)dfs1(i,,,t,i);
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)ans=Mx(ans,ds1[i][j]);
printf("%lld\n",ans);
}
void dfs(int cr,int fa,ll lj,int t)
{
dis[cr]+=lj;
for(int i=hd[t][cr],v;i;i=nxt[t][i])
if((v=to[t][i])!=fa)dfs(v,cr,lj+w[t][i],t);
}
int cz(int rt)
{
for(int i=;i<=n;i++)dis[i]=;
for(int t=;t<;t++)dfs(rt,,,t);
int ret=;
for(int i=;i<=n;i++)
{
if(dis[i]>ans)ans=dis[i];
if(!vis[i]&&dis[i]>dis[ret])ret=i;
}
return ret;
}
int main()
{
n=rdn();ll z;
for(int t=;t<;t++,xnt=)
for(int i=,u,v;i<n;i++)
u=rdn(),v=rdn(),z=rdn(),add(t,u,v,z),add(t,v,u,z);
if(n<=){solve1();return ;}
int st=clk(); srand(time());srand(rand());
int rt=rand()%n+,T=;
while(clk()-st<TL)
{
T++; if(T==)rt=rand()%n+,T=;
if(vis[rt]){T=;continue;}vis[rt]=;
rt=cz(rt);if(!rt)break;
}
printf("%lld\n",ans);
return ;
}
UOJ 347(洛谷4220) 【WC2018】通道——随机化的更多相关文章
- uoj#348/洛谷P4221 [WC2018]州区划分(FWT)
传送门(uoj) 传送门(洛谷) 全世界都会子集卷积就咱不会--全世界都在写\(FMT\)就咱只会\(FWT\)-- 前置芝士 或运算\(FWT\)或者\(FMT\) 左转洛谷模板区,包教包会 子集卷 ...
- 洛谷P4220 [WC2018]通道(边分治+虚树)
题面 传送门 题解 代码不就百来行么也不算很长丫 虽然这题随机化贪心就可以过而且速度和正解差不多不过我们还是要好好学正解 前置芝士 边分治 米娜应该都知道点分治是个什么东西,而边分治,顾名思义就是对边 ...
- 2018.08.09洛谷P3959 宝藏(随机化贪心)
传送门 回想起了自己赛场上乱搜的20分. 好吧现在也就是写了一个随机化贪心就水过去了,不得不说随机化贪心大法好. 代码: #include<bits/stdc++.h> using nam ...
- UOJ #55 & 洛谷 P3920 紫荆花之恋 —— 动态点分治+替罪羊树
题目:http://uoj.ac/problem/55 https://www.luogu.org/problemnew/show/P3920 参考博客:https://www.cnblogs.com ...
- [uoj#34] [洛谷P3803] 多项式乘法(FFT)
新技能--FFT. 可在 \(O(nlogn)\) 时间内完成多项式在系数表达与点值表达之间的转换. 其中最关键的一点便为单位复数根,有神奇的折半性质. 多项式乘法(即为卷积)的常见形式: \[ C_ ...
- 洛谷 P3825 [NOI2017]游戏 【2-SAT+状压】
UOJ和洛谷上能A,bzoj 8ms即WA,现在也不是知道为啥--因为我太弱了 先看数据范围发现d非常小,自然想到了状压. 所以先假装都是只能跑两种车的,这显然就是个2-SAT问题了:对于x场没有hx ...
- 洛谷P3688/uoj#291. [ZJOI2017]树状数组
传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...
- 洛谷 P2827 BZOJ 4721 UOJ #264 蚯蚓
题目描述 本题中,我们将用符号表示对c向下取整,例如:. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现在共有n只蚯蚓(n为正整数).每只 ...
- 洛谷 P2503 [HAOI2006]均分数据 随机化贪心
洛谷P2503 [HAOI2006]均分数据(随机化贪心) 现在来看这个题就是水题,但模拟赛时想了1个小时贪心,推了一堆结论,最后发现贪心做 不了, 又想了半个小时dp 发现dp好像也做不了,在随机化 ...
随机推荐
- bzoj1606 / P2925 [USACO08DEC]干草出售Hay For Sale(01背包)
P2925 [USACO08DEC]干草出售Hay For Sale 简化版01背包(连价值都免了) 直接逆推解决 #include<iostream> #include<cstdi ...
- 20145302张薇 《网络对抗技术》逆向及BOF基础实践
20145302张薇 <网络对抗技术>逆向及BOF基础实践 实验内容 实践对象:名为20145302的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单 ...
- 辅助模块应用(auxiliary/scanner/portscan/tcp)
实验步骤 创建msf所需的数据库 之前我们开启msf时下面总会出现一个红色的小减号,原来是因为没有和数据库键连接,于是首先我们要手动建立一个数据库... 使用命令来实现: service postgr ...
- Duilib 创建不规则窗口(转载)
方法一: 转载:http://blog.csdn.net/chenlycly/article/details/46447297 转载:http://blog.csdn.net/harvic880925 ...
- Thread.Start和Delegate.BeginInvoke 以及Control.BeginInvoke
Thread.Start starts a new OS thread to execute the delegate. When the delegate returns, the thread i ...
- Bootstrap and Angular
- Visualization data using R and bioconductor.--NCBI
- python 读取位于包中的数据文件
假设你的包中的文件组织成如下: mypackage/ __init__.py somedata.dat spam.py 现在假设spam.py文件需要读取somedata.dat文件中的内容.你可以用 ...
- JAVA模块以及未来(转)
Java 9,OSGi以及模块化的未来 Java 9.OSGi以及模块化的未来(第二部分) Java 9终于要包含Jigsaw项目了
- python模块之ConfigParser: 用python解析配置文件
在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是ConfigParser,这里简单的做一些介 ...