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好像也做不了,在随机化 ...
随机推荐
- Gulp和Webpack对比
在现在的前端开发中,前后端分离.模块化开发.版本控制.文件合并与压缩.mock数据等等一些原本后端的思想开始逐渐渗透到“大前端”的开发中.前端开发过程越来越繁琐,当今越来越多的网站已经从网页模式进化到 ...
- SQLite 自定义函数,聚合,排序规则
SQLite 自定义函数,聚合,排序规则 1.使用自定义函数, 聚合以及排序规则的基本方法是使用回调函数.这些注册的函数的生命周期只存在于应用程序中, 并不存储在数据库文件中, 因此需要在每个连接建立 ...
- IP地址与MAC地址
作者:知乎用户链接:https://www.zhihu.com/question/21546408/answer/28155896来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- Core Java 5
p273~p276: 1.获取异常的更多信息:e.getMessage(). 2.得到异常的实际类型:e.getClass().getName(). 3.当异常之间不存在子类关系,并且异常的处理机制( ...
- TrueCrypt简介及TrueCrypt 7.1a Source.zip源码在VS2008下的编译过程
转载:http://blog.csdn.net/cncrypt/article/details/51565493 转载:http://www.cnblogs.com/shenjieblog/p/521 ...
- HDU6447 网络赛 YJJ's Salesman(DP + 线段树)题解
思路:若用dp[i][j]表示走到(i,j)的最大值,那么dp[i][j] = max(dp[i - 1][j],dp[i][j - 1],dp[i - 1][j - 1] + v),显然O(n^2) ...
- [JS] - level8 kata
https://www.codewars.com/kata/57e3f79c9cb119374600046b function hello(name) { if(name == "" ...
- 使用触发器定义 WPF 控件的行为
Expression Studio 4.0 其他版本 Expression Studio 3.0 Expression Studio 2.0 此主题尚未评级 - 评价此主题 在应用程序的生 ...
- Gitea docker-compose.yaml
docker-compose.yaml version: "2" networks: gitea: external: false services: server: image: ...
- UVA-1601 The Morning after Halloween(BFS或双向BFS)
题目大意:在一张图中,以最少的步数将a,b,c移到对应的A,B,C上去.其中,每个2x2的方格都有障碍并且不能两个小写字母同时占据一个格子. 题目分析:为避免超时,先将图中所有能联通的空格建起一张图, ...