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. 【CodeForces】913 C. Party Lemonade

    [题目]C. Party Lemonade [题意]给定n个物品,第i个物品重量为2^(i-1)价值为ci,每个物品可以无限取,求取总重量>=L的最小代价.1<=30<=n,1< ...

  2. Go语言 5 函数

    文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ 今天,我们来学习Go语言编程的第五章,函数.首先简单说一下函数的概念和作用.函数是一 ...

  3. ORA-01552 非系统表空间不能使用系统回滚段处理

    今天新搭建了一个10g的测试数据库,运行都很正常,但是在打开autotrace功能后执行语句,报错 SQL> set autotrace on SQL> select username,s ...

  4. layui的模块化和非模块化使用

    非模块化和模块化的区别是 非模块化不用每次都调用layui.use([],fun...)引入对应模块,引入的JS是/layui/layui.all.js 模块化必须每次都调用layui.use([], ...

  5. cin循环输入控制问题

    之前写一个简单的输入节点值自动生成链表的测试程序,发现cin的输入控制好像在VC++6.0和VS2010中不一样,特此记录. 现在有以下代码: vector<int> ivec; int ...

  6. windows下制作debian U盘启动

    制作平台:Windows 7 制作debian版本:debian 7.4 wheezy 1.下载引导镜像,包含三个文件:boot.img.gz(解压备用).initrd.gz 和 vmlinuz. h ...

  7. CentOS7 安装python库(numpy、scipy、matplotlib、scikit-learn、tensorflow)

    0.1准备工作 安装好CentOS7,配置好网络,确保网络畅通. 0.2root授权 首先:当前用户为kaid # vim /etc/sudoers 在root ALL=(ALL) ALL之后添加: ...

  8. 响应式设计:根据不同设备引不同css样式

    <link rel="stylesheet" media="screen and (max-width:600px)" href="small. ...

  9. Weex Workshop 挑战赛,等你来战!

    一个颠覆性的移动开发方式,一个匠心打造的跨平台移动开发工具,一个后App时代的生产力解放者—Weex,针对App Native开发频繁发版和多端研发的痛点,H5开发的页面稳定性.性能体验等问题,提供了 ...

  10. fedora下中文输入fcitx4.0

    fedora12,14下使用fcitx输入法可用,切换ctrl+space