NOIP分数过低的场外选手,一个月之后才有幸膜到这套卷子。感觉题目质量很不错啊,可惜了T1乱搞可过,T2题目出锅非集训队员没有通知到,导致风评大幅被害。

感觉Cu的话随手写两个暴力就稳了,Ag的话T3稍微搞出点性质就稳了,Au的话T1乱搞和T3中搞出一个就比较稳了。

可以发现T1的28分和T3的16分只要读懂题目(会用交互)就能拿到。下面看下这两题的各部分分解法。

T1

Subtask 1(28 pts):直接暴力,倍增LCA即可。$O(n^2 \log n)$

Subtask 2(16 pts):特殊性质0,实际上就是一棵树,直接跑树的直径即可。 $O(n)$

Subtask 3(12 pts):特殊性质12,一棵树加一条链。枚举LCA,问题变成求$d_a+d_b-2*d_{lca}+v_b-v_a$其中v是链上前缀和。

后面还有很多档部分分,但都较复杂,正解则使用了边分治。但是有一种有理有据的乱搞方法可以通过所有官方数据。

重复多次以下操作:

  • 从一个点a出发,找另一个点b使得答案最大
  • 从b出发,找到一个点c使得答案最大,如此反复

先将序列random_shuffle()一下,然后用爬山法,取20次左右的初始值,每次按上面的方法更新,发现答案不更优则停止。

 #include<cstdio>
#include<algorithm>
#define rg register int
#define rep(i,l,r) for (rg i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=;
int pos[N],vis[N],q[N],u,v,n;
ll dis[][N],ans,w; struct Graph{
struct edge{ int nt,to; ll dis; }g[N<<];
int head[N],num;
void insert(rg from,rg to,ll dis){ g[++num]=(edge){head[from],to,dis},head[from]=num; return; }
}G[]; void bfs(rg op,rg S){
rep(i,,n) vis[i]=;
rg h=,t=; q[t]=S,vis[S]=,dis[op][S]=;
while (h<t){
rg x=q[++h],v;
for (rg i=G[op].head[x];i;i=G[op].g[i].nt){
v=G[op].g[i].to; if (vis[v]) continue;
vis[v]=,q[++t]=v,dis[op][v]=dis[op][x]+G[op].g[i].dis;
}
}
return;
} int main(){
freopen("tunnel.in","r",stdin);
freopen("tunnel.out","w",stdout);
srand(); scanf("%d",&n);
rep(j,,)
for (rg i=,u,v;i<n;++i){
ll w; scanf("%d%d%lld",&u,&v,&w);
G[j].insert(u,v,w); G[j].insert(v,u,w);
}
rep(i,,n) pos[i]=i;
random_shuffle(pos+,pos+n+);
for (int T=,rt; T<=; ++T){
rt=pos[T]; ll ret=;
while (){
bfs(,rt); bfs(,rt); bfs(,rt);
ll res=; rg id=;
rep(i,,n)
if (res<dis[][i]+dis[][i]+dis[][i])
res=dis[][i]+dis[][i]+dis[][i],id=i;
if (ret<res) ret=res,rt=id; else break;
}
ans=max(ans,ret);
}
printf("%lld\n",ans);
return ;
}

T3

Subtask 1:(20 pts) $O(n^2)$以上的限制跟没有限制没什么区别,直接$O(n^2)$跑暴力即可。

Subtask 2:(15 pts) 由于是完全二叉树,我们每次随机选一个未知的点,然后径直走过去即可。探寻路径的次数近似于每个点的深度,当然不超过log n,所以可以$O(n \log n)$过。

Subtask 3:(30 pts) 一条链,每次找一个未知点径直走过去。可以证明期望次数是ln n级别的。

设E(n)表示当只有左端点未知时,需要尝试的次数。则有

$$E(n)=1+\frac{1}{n}\sum_{i=0}^{n-1} E(i)$$ $$nE(n)+1+E(n)=(n+1)E(n+1)$$ $$ E(n+1)-E(n)=\frac{1}{n+1}$$ $$E(n)=\sum_{i=1}^{n} \frac{1}{i}\approx \ln n +0.5$$

如果每次从1扩展可能不能过最后一个点,错误次数是2 ln n + 1的,用左右端点尝试的话可以做到ln n +0.5,只有$\frac{144}{100000}$的概率无法通过。

满分做法就非常有趣了。既然已经确定是随机化了,每次随机的点又不能控制,我们只能用最小的代价找到离这个点最近的已知点扩展过去。

可以发现每次扩展都新形成一条链,这就变成了动态树链剖分问题,可以用LCT($O(n \log n)$)或动态点分治($O(n \log^2 n)$)解决。

这样直接把LCT模板拖过来就好了,LCT查询的是左子树和右子树中离这个点最近的点分别是哪个,记得每次新加入链的时候要access()以保证复杂度。

 #include "rts.h"
#include <cstdio>
#include <algorithm>
#define ls ch[x][0]
#define rs ch[x][1]
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii; const int N=;
int n,b[N],t,ch[N][],f[N],l[N],r[N]; int sj(int l,int r){ return rand()%(r-l+)+l; } int isroot(int x) { return (!f[x])||(ch[f[x]][]!=x && ch[f[x]][]!=x);}
void upd(int x){ l[x]=r[x]=x; if (ls) l[x]=l[ls]; if (rs) r[x]=r[rs]; } void rot(int x){
int y=f[x],z=f[y],w=ch[y][]==x;
ch[y][w]=ch[x][w^]; f[ch[x][w^]]=y;
if (!isroot(y)) ch[z][ch[z][]==y]=x;
f[x]=z; f[y]=x; ch[x][w^]=y; upd(y);
} void splay(int x){
while (!isroot(x)){
int y=f[x];
if (!isroot(y)) ((ch[f[y]][]==y)^(ch[y][]==x)) ? rot(x) :rot(y);
rot(x);
}
upd(x);
} void access(int x){ for (int y=; x; y=x,x=f[x]) splay(x),ch[x][]=y,upd(x); } void work(int x){
int now=,v; splay(now);
while (!b[x]){
v=explore(now,x);
if (v==r[ch[now][]]) now=ch[now][];
else if (v==l[ch[now][]]) now=ch[now][];
else if (b[v]) splay(v),now=v;
else b[v]=,f[v]=now,now=v;
}
access(x);
} void work1(){ rep(i,,n) if (!b[i]) work(i); } void work2(){
int l=,r=; int tot=; b[]=;
while (tot<n){
int k=sj(,n); while (b[k]) k=sj(,n);
int p=explore(l,k);
if (b[p])
while (r!=k) r=explore(r,k),b[r]=,tot++;
else{
l=p; b[p]=; tot++;
while (l!=k) l=explore(l,k),b[l]=,tot++;
}
}
} void play(int _n,int _t,int type){ n=_n; t=_t; if(type==) work2(); else work1(); }

总结:一定要提高自己的乱搞技巧,加强码力,不要放过任何一个得分点。会写的就不要写错,学会猜结论。

WC2018伪题解的更多相关文章

  1. APIO2017伪题解

    题目质量还是比较高的,只是当时澳大利亚方面出了一点问题?最后造成了区分度非常迷的局面. 纵观三道题,T1是披着交互外衣的提答题,T2是披着交互外衣的传统题,T3是一道据说近年来APIO最水的一道传统题 ...

  2. 伪题解 洛谷 P1363 幻想迷宫(DFS)

    毒瘤题,做了一晚上抄题解A了 因为是抄题解,我也不好意思说什么了,就发篇博客纪念一下吧 #include<iostream> #include<cstring> #includ ...

  3. [CTSC2017]最长上升自序列(伪题解)(Dilworth's theorem+网络流)

    部分分做法很多,但每想出来一个也就多5-10分.正解还不会,下面是各种部分分做法: Subtask 1:k=1 LCS长度最长为1,也就是说不存在j>i和a[j]>a[i]同时成立.显然就 ...

  4. APIO2018练习赛伪题解

    传送门:https://pcms.university.innopolis.ru/statements/org/apio/2018/practice/statements.pdf 主要就在于后面三道构 ...

  5. 【伪题解】 [Offer收割]编程练习赛58

    [A:最大的K-偏差排列]: 第一次在hiho卡一题,所以暴力了搜索了一下,70分,后面回来打表找规律,规律是有和K有关的周期. 当K<=N/2时,成周期交叉变化,最后尾部部分单独考虑. 当K& ...

  6. 洛谷 P3952时间复杂度 (本地AC测评RE的伪题解)

    [题目描述] 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写 ...

  7. AHOI2018训练日程(3.10~4.12)

    (总计:共90题) 3.10~3.16:17题 3.17~3.23:6题 3.24~3.30:17题 3.31~4.6:21题 4.7~4.12:29题 ZJOI&&FJOI(6题) ...

  8. PKUSC2018训练日程(4.18~5.30)

    (总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...

  9. PAT甲级真题及训练集

    正好这个"水水"的C4来了 先把甲级刷完吧.(开玩笑-2017.3.26) 这是一套"伪题解". wacao 刚才登出账号测试一下代码链接,原来是看不到..有空 ...

随机推荐

  1. centos下搭建YII环境

      第一步:安装lnmp wget -c http://soft.vpser.net/lnmp/lnmp1.4-full.tar.gz 下载完lnmp后,进行解压文档 tar zxf lnmp1.4- ...

  2. 通过cordova将vue项目打包为webapp

    准备工作:需要之前配置好vue-cli脚架构,安装好cordova环境.下面开始对vue.js项目进行打包,打包环境为Android. 可以看下我的github:https://github.com/ ...

  3. Tornado/Python 学习笔记(一)

    1.源代码下载及安装:http://www.tornadoweb.org/en/stable/ 2.python中xmlrpc库官方文档:https://docs.python.org/3/libra ...

  4. 利用Jsoup模拟跳过登录爬虫获取数据

    今天在学习爬虫的时候想着学习一下利用jsoup模拟登录.下面分为有验证码和无验证码的情况进行讨论. ---------------------------无验证码的情况---------------- ...

  5. Metlnfo CMS全版本漏洞收集

    根据https://www.seebug.org/appdir/MetInfo 进行书写. [版本:Metlnfo 4.0] 漏洞标题:Metlnfo cms任意用户密码修改 漏洞文件:member/ ...

  6. Cookie、Session 和 自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  7. 简单实现JS上传图片预览功能

    HTML代码 <div class="upload"> <input type="button" class="btn" ...

  8. 135.Candy---贪心

    题目链接 题目大意:分糖果,每个小朋友都有一个ratings值,且每个小朋友至少都要有一个糖果,而且每个小朋友的ratings值如果比左右邻舍的小朋友的ratings值高,则其糖果数量也比邻舍的小朋友 ...

  9. laravel5.1--数据库操作

    1 配置信息 1.1配置目录: config/database.php 1.2配置多个数据库 //默认的数据库 'mysql' => [ 'driver' => 'mysql', 'hos ...

  10. **[权限控制] 利用CI钩子实现权限认证

    http://codeigniter.org.cn/forums/thread-10877-1-1.html 一直没找到CI的权限认证扩展,以前好像找到过一个老外的扩展,不过不怎么好用,现在记不清了, ...