题目:http://uoj.ac/problem/347

   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】通道——随机化的更多相关文章

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

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

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

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

  3. 2018.08.09洛谷P3959 宝藏(随机化贪心)

    传送门 回想起了自己赛场上乱搜的20分. 好吧现在也就是写了一个随机化贪心就水过去了,不得不说随机化贪心大法好. 代码: #include<bits/stdc++.h> using nam ...

  4. UOJ #55 & 洛谷 P3920 紫荆花之恋 —— 动态点分治+替罪羊树

    题目:http://uoj.ac/problem/55 https://www.luogu.org/problemnew/show/P3920 参考博客:https://www.cnblogs.com ...

  5. [uoj#34] [洛谷P3803] 多项式乘法(FFT)

    新技能--FFT. 可在 \(O(nlogn)\) 时间内完成多项式在系数表达与点值表达之间的转换. 其中最关键的一点便为单位复数根,有神奇的折半性质. 多项式乘法(即为卷积)的常见形式: \[ C_ ...

  6. 洛谷 P3825 [NOI2017]游戏 【2-SAT+状压】

    UOJ和洛谷上能A,bzoj 8ms即WA,现在也不是知道为啥--因为我太弱了 先看数据范围发现d非常小,自然想到了状压. 所以先假装都是只能跑两种车的,这显然就是个2-SAT问题了:对于x场没有hx ...

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

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

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

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

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

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

随机推荐

  1. poj3318 Matrix Multiplication

    poj3318 Matrix Multiplication 题意:给定$n*n(n<=500)$的矩阵$A,B,C$,如果$A*B==C$,输出“YES”,否则为“NO”:多组数据,$O(n^{ ...

  2. 谷歌浏览器&360浏览器安装——有道云笔记插件

    谷歌浏览器: 有道云笔记插件:http://hk.chromefor.com/down.php?key=FulQTdJ9In3iXfdVicFW(点击即下载) 在谷歌浏览器里按快捷键:Alt+E  接 ...

  3. 论OI中最大值的选取

    为什么我的Floyd会输出负数啊? 为什么我的代码写对了却全都爆零了啊? 那么很可能是你的INF取大/小了! 那么inf到底应该取什么值呢? 首先,inf应该要比一般的题目中出现的数据要大,但是又不能 ...

  4. pycharm同时使用python2.7版本和python3.6版本

    最近在看爬虫的专题,很多爬虫的教程是python2的,电脑上装的是3.6版本,而且python不向下兼容,这就很麻烦,最简单的print要加括号啊,等等.于是分享一个在windows环境下pychar ...

  5. Codeforces Round #319 (Div. 2) C. Vasya and Petya's Game 数学

    C. Vasya and Petya's Game time limit per test 1 second memory limit per test 256 megabytes input sta ...

  6. install ros-indigo-ecl-build

    -- ==> add_subdirectory(bp_smart_charging/bp_dock_drive) CMake Warning at /opt/ros/indigo/share/c ...

  7. java--Quartz 定时执行

    第一步:引包(Maven) <!-- 定时任务 --> <dependency> <groupId>org.quartz-scheduler</groupId ...

  8. Winform开发常用控件之TreeView菜单导航和权限用法

    TreeView一个很棒的控件,我们在做WEB开发时常常犯困的一个东东.当然这里介绍winform里面的用法唠. 先介绍几个属性吧,CheckBoxes设置为true的话树形节点前面会出现checkb ...

  9. goldendict

    linux下的翻译词典,可以添加在线和离线词典,比window下的有道感觉强的不止100倍. 点击编辑—>dictionary,可以添加在线和离线词典,最好添加离线的把,我添加了好多在线的,go ...

  10. HDU3861The King’s Problem

    HDU3861   kosaraju缩点+最小路径覆盖 为什么是最小路径覆盖呢,我们假设有一个如下DAG图 目前我们1出发到了3处,对于3的儿子4.5.6,肯定是不能彼此到达的.所以最好的情况3只能延 ...