6.18 省选模拟赛 树 倍增 LCT
LINK:树



考虑暴力 保存每个版本的父亲 然后暴力向上跳。得分20.
考虑离线 可以离线那么就可以先把树给搞出来 然后考虑求k级祖先 可以倍增求。
如何判断合法 其实要求路径上的边的时间戳<=当前时间戳 这个也可以倍增做。
当然我脑抽了 把询问版本排序后利用并查集判连通性了。
考虑正解:这下就有两个方向了:
一个是倍增数组的问题 容易想到如果倍增数组可以求出 那么问题迎刃而解 倍增数组每个位置最多被更新一次 所以每次暴力判断是否可以更新 递归来做这个事情。
复杂度不太能证明。
还有一个是 如果可以直接求出k级祖先利用可持久化并查集也可以求出答案。
那么这个k级祖先可以利用LCT来求 access之后暴力在splay上跳。可持久化并查集判定。
第二个询问可以二分一下 然后定位 然后判定。复杂度nlog^2.
这个做法非常不优美。
还是考虑 将判定条件转到 路径上的边的出现时间<当前时间来判断。
LCT维护子树内的最大值 就可以直接在LCT上跳了。
k级祖先也是如此 可以直接跳也可以求出来那部分点再跳。
const int MAXN=100010;
int n,m,T,last,len,now;
int c[MAXN][2],f[MAXN],fa[MAXN],mx[MAXN],sz[MAXN],rev[MAXN],v[MAXN];
inline bool pd(int x){return c[f[x]][0]==x||c[f[x]][1]==x;}
IV pushup(int x)
{
sz[x]=sz[l(x)]+sz[r(x)]+1;
mx[x]=max(v[x],max(mx[l(x)],mx[r(x)]));
}
IV rotate(int x)
{
int old=f[x],oldf=f[old],k=c[old][1]==x;
c[old][k]=c[x][k^1];c[x][k^1]=old;
if(pd(old))c[oldf][c[oldf][1]==old]=x;
if(c[old][k])f[c[old][k]]=old;
f[old]=x;f[x]=oldf;pushup(old);
}
IV splay(int x)
{
while(pd(x))
{
int old=f[x];
if(pd(old))rotate(((c[old][1]==x)^(c[f[old]][1]==old))?x:old);
rotate(x);
}
pushup(x);
}
IV access(int x)
{
for(int y=0;x;x=f[y=x])
splay(x),c[x][1]=y,pushup(x);
}
IV LINK(int x,int y)//这里题目中保证了x没有父亲.
{
access(x);
splay(x);
v[x]=now;
fa[x]=f[x]=y;
pushup(x);
}
inline int get_mx(int x,int b)
{
if(mx[x]<=b)return 0;
while(x)
{
if(r(x)&&mx[r(x)]>b)x=r(x);
else
{
if(v[x]>b)return x;
else x=c[x][0];
}
}
return x;
}
inline int get_Kth(int b,int x,int k)
{
access(x);
splay(x);
int w=get_mx(x,b);
access(fa[w]);
splay(x);
++k;
if(sz[x]<k)return 0;
while(x)
{
if(sz[r(x)]>=k)x=r(x);
else
{
if(sz[r(x)]+1==k)return x;
k=k-sz[r(x)]-1;
x=l(x);
}
}
return x;
}
inline int get_dep(int b,int x)
{
access(x);
splay(x);
int w=get_mx(x,b);
access(fa[w]);
splay(x);
return sz[x]-1;
}
int main()
{
freopen("1.in","r",stdin);
//freopen("tree.out","w",stdout);
get(n);get(m);get(T);
rep(1,m,i)
{
int get(op),u,v,b;now=i;
op=(op+T*last)%3;
if(!op)
{
get(u);get(v);
u=(u+T*last)%n+1;
v=(v+T*last)%n+1;
LINK(u,v);
}
if(op==1)
{
get(b);get(u);int get(k);
b=(b+T*last)%m;
u=(u+T*last)%n+1;
k=(k+T*last)%n;
put(last=get_Kth(b,u,k));
}
if(op==2)
{
get(b);get(u);
b=(b+T*last)%m;
u=(u+T*last)%n+1;
put(last=get_dep(b,u));
}
}
return 0;
}
6.18 省选模拟赛 树 倍增 LCT的更多相关文章
- 6.18 省选模拟赛 字符串 LCT SAM
LINK:字符串 看起来很难做 考虑一种暴力 建立SAM后每次查询暴力扫儿子. 期望得分10分.实际得分10分. 另外一种发现每次扫儿子过于暴力 可以每次儿子向上做贡献 每次都暴力向上跳. 期望得分1 ...
- 5.29 省选模拟赛 树的染色 dp 最优性优化
LINK:树的染色 考场上以为这道题要爆蛋了 没想到 推出正解来了. 反正是先写了爆搜的 爆搜最近越写越熟练了 容易想到dp 容易设出状态 f[i][j]表示以i为根的子树内白色的值为j此时黑色的值怎 ...
- 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.
考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...
- 4.18 省选模拟赛 无聊的计算器 CRT EXBSGS EXLucas
算是一道很毒瘤的题目 考试的时候码+调了3h才搞定. op==1 显然是快速幂. op==2 有些点可以使用BSGS 不过后面的点是EXBSGS. 这个以前学过了 考试的时候还是懵逼.(当时还是看着花 ...
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- 18/9/21模拟赛-Updated
18/9/21模拟赛 期望得分:100:实际得分:0 qwq 拿到题目第一眼,我去,这不是洛谷原题(仓鼠找Sugar)吗 又多看了几眼,嗯,对,除了是有多组数据外,就是原题 然后码码码....自以为 ...
- @省选模拟赛03/16 - T3@ 超级树
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...
- 3.28 省选模拟赛 染色 LCT+线段树
发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...
- 省选模拟赛 4.26 T1 dp 线段树优化dp
LINK:T1 算是一道中档题 考试的时候脑残了 不仅没写优化 连暴力都打挂了. 容易发现一个性质 那就是同一格子不会被两种以上的颜色染.(颜色就三种. 通过这个性质就可以进行dp了.先按照左端点排序 ...
随机推荐
- css3盒子模型中的box-sizing属性的使用_box sizing常用的3种属性
box-sizing属性用来定义元素的width和height所表示的区域,该属性一般有三种值:content-box.border-box.inherit.其中inherit表示box-sizing ...
- html5中contenteditable 光标_如何设置光标位置
在js中,光标是一个对象,当你选中某个元素的时候才会出现光标对象.比如:我们点击一个输入框,实际会产生一个选中对象-selection,这个对象我们可以通过indow.getSelection()来获 ...
- 内嵌iframe页面在IOS下会受内部元素影响自动撑开的问题
IOS下的webview页面,内嵌iframe元素,将其样式指定为宽高100%: .iframe { width: %; height: %; } 在安卓下运行均无问题,但是在IOS下会出现异常. 具 ...
- Html中a标签用法总结:创建email,电话,描点链接等。以及防止链接被搜索引擎收录
<a>标签可以用来创建一个到其他网页.文件.同一页面内的位置.电子邮件地址或任何其他URL的超链接. 是我们常用的一个标签之一,今天就讲讲如何使用a来创建email,电话,描点链接等.以 ...
- day47 数据库进阶
目录 一.select查询扩展 1 几个重要关键字的执行顺序 2 where筛选条件 3 group by分组 4 having 分组之后的筛选条件 5 distinct去重 6 order by 排 ...
- jvm之栈、堆
1. Java Virtual Machine 人群当中,一位叫java的小伙子正向周围一众人群细数着自己取得的荣耀与辉煌.就在此时,c老头和c++老头缓步走来,看着被众人围住的java,c老头感 ...
- (二)学习了解OrchardCore笔记——开篇:OrchardCore的中间件
现在开始看Starpup的中间件.这是一个扩展方法app.UseOrchardCore() public void Configure(IApplicationBuilder app, IHostEn ...
- 简单讲解一下http2的多路复用
在 HTTP/1 中,每次请求都会建立一次HTTP连接,也就是我们常说的3次握手4次挥手,这个过程在一次请求过程中占用了相当长的时间,即使开启了 Keep-Alive ,解决了多次连接的问题,但是依然 ...
- Linux驱动之I2C总线设备以及驱动
[ 导读] 本文通过阅读内核代码,来梳理一下I2C子系统的整体视图.在开发I2C设备驱动程序时,往往缺乏对于系统整体的认识,导致没有一个清晰的思路.所以从高层级来分析一下I2C系统的设计思路,将有助于 ...
- 一文快速掌握华为云IPv6基础知识及使用指南
随着5G.物联网等新兴技术领域的发展,IP空间需求巨大,IPv6成为万物互联的基础,势在必行:华为云作为IPv6成熟商用开拓者,针对金融.广电.媒资等不同行业推出IPv6解决方案,助力企业平滑升级到I ...