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. 正则表达式:Python 模块 re 简介

    为了使文章更具可读性,本文将正则表达式冗长的 语法介绍 放在了文章的末尾. 一.正则表达式简介 正则表达式(RegExp)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(元字符 ...

  2. NYOJ 814 又见拦截导弹 (模拟)

    题目链接 描述 大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:它的第一发炮弹能够到达任意的高度,但是以 ...

  3. 用C#实现对MSSqlServer数据库的增删改查---DAL层

    说明:本人完成的工作是对传感器--超声波物位计进行硬件集成,上位机通过串口接收传感器数据并将其存到数据库中:在DAL层实现对数据库的增删改查,其中包含两个数据表分别是WaterLevelSet表和Wa ...

  4. ansible安装配置及最佳实践roles

    ansible是什么? ansible是一款轻量级配置管理工具,用于远程批量部署.安装.配置.类似的还有puppet.saltstack,各有所长,任君自选. 官方文档:http://docs.ans ...

  5. Linux阵列 RAID详解 (转)

    原文链接:http://molinux.blog.51cto.com/2536040/516008   一. RAID详解   二. mdadm工具介绍   三. 创建一个RAID的基本过程   四. ...

  6. spring(四)之基于注解(Annotation-based)的配置.md

    注解 这里讲的注解有下面几个 @Autowired @Qualifier(" ") @Genre(" ") @Offline @Resource(name=&q ...

  7. mktime(将时间结构数据转换成经过的秒数)

    mktime(将时间结构数据转换成经过的秒数)表头文件#include<time.h>定义函数time_t mktime(strcut tm * timeptr);函数说明mktime() ...

  8. 基于layui+cropper.js实现上传图片的裁剪功能

    最近因项目需求,需要在上传图片的时候先对图片裁剪,然后在上传,所以就有了本文的出现. 开始正文之前,要提一下这个图片的裁剪:图片的裁剪,有前端裁剪,也可以后端裁剪 前端的裁剪我知道的可以分为这么两种: ...

  9. 洛谷P1339 [USACO09OCT]热浪Heat Wave 题解

    题目传送门 这道题实际非常简单好奇是怎么变黄的... 其实也就是一个SPFA,本人非常懒,不想打邻接表,直接用矩阵就好啦... #include<bits/stdc++.h> using ...

  10. ssh连接远程主机免密登入

    核心思想: 1.本地主机生成公钥私钥,私钥自己存着,公钥传到远程主机.ssh文件夹下authorized_keys文件(默认是这个,用追加的方式) 2.本地连接远程主机,公私钥对上就可以免密登入了. ...