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的更多相关文章

  1. 6.18 省选模拟赛 字符串 LCT SAM

    LINK:字符串 看起来很难做 考虑一种暴力 建立SAM后每次查询暴力扫儿子. 期望得分10分.实际得分10分. 另外一种发现每次扫儿子过于暴力 可以每次儿子向上做贡献 每次都暴力向上跳. 期望得分1 ...

  2. 5.29 省选模拟赛 树的染色 dp 最优性优化

    LINK:树的染色 考场上以为这道题要爆蛋了 没想到 推出正解来了. 反正是先写了爆搜的 爆搜最近越写越熟练了 容易想到dp 容易设出状态 f[i][j]表示以i为根的子树内白色的值为j此时黑色的值怎 ...

  3. 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.

    考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...

  4. 4.18 省选模拟赛 无聊的计算器 CRT EXBSGS EXLucas

    算是一道很毒瘤的题目 考试的时候码+调了3h才搞定. op==1 显然是快速幂. op==2 有些点可以使用BSGS 不过后面的点是EXBSGS. 这个以前学过了 考试的时候还是懵逼.(当时还是看着花 ...

  5. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  6. 18/9/21模拟赛-Updated

    18/9/21模拟赛 期望得分:100:实际得分:0  qwq 拿到题目第一眼,我去,这不是洛谷原题(仓鼠找Sugar)吗 又多看了几眼,嗯,对,除了是有多组数据外,就是原题 然后码码码....自以为 ...

  7. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  8. 3.28 省选模拟赛 染色 LCT+线段树

    发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...

  9. 省选模拟赛 4.26 T1 dp 线段树优化dp

    LINK:T1 算是一道中档题 考试的时候脑残了 不仅没写优化 连暴力都打挂了. 容易发现一个性质 那就是同一格子不会被两种以上的颜色染.(颜色就三种. 通过这个性质就可以进行dp了.先按照左端点排序 ...

随机推荐

  1. Pytorch | 详解Pytorch科学计算包——Tensor

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Pytorch专题的第二篇,我们继续来了解一下Pytorch中Tensor的用法. 上一篇文章当中我们简单介绍了一下如何创建一个Ten ...

  2. call,apply,bind的内部原理实现

    call call 方法使用一个函数执行的时候更改本身 this 指向,并传入一个或者多个参数. var obj = { name: '$call' } function _fun() { conso ...

  3. 调整数组顺序使奇数位于偶数前面(剑指offer-13)

    方法1:新建两个数组,一个数组用来放奇数,一个数组用来放偶数,最后再把它们合并起来. 1 import java.util.*; 2 public class Solution { 3 public ...

  4. 简单的MVC框架

    效果图: 源码下载:https://github.com/doyoulaikeme/DotNetSample/tree/master/DotNetSample4/easyMVCFramework

  5. Java面向对象详解-上

    一.类及对象 1. 类的组成成分 属性(成员变量,Field) 方法(成员方法,函数,Method) 2. 属性 成员变量 vs 局部变量 相同点: 遵循变量声明的格式: 数据类型 变量名 = 初始化 ...

  6. Redis RDB 分析工具 rdbtools 说明

    背景 Redis是基于内存的KV数据库,内存作为存储介质,关注其内存的使用情况是一个重要指标,解析其内部的存储信息是给出优化方法和维护的最基本要求.解析内存有二种方法:第一个是通过scan遍历所有ke ...

  7. pip install scrapy报错:error: Unable to find vcvarsall.bat解决方法

    今天在使用pip install scrapy 命令安装Scrapy爬虫框架时,出现了很让人头疼的错误,错误截图如下: 在网上查找解决方法时,大致知道了问题的原因.是因为缺少C语言的编译环境,其中一种 ...

  8. vue 写h5页面-摇一摇

    依赖的第三方的插件 shake.js github地址: https://github.com/alexgibson/shake.js 提供一个摇一摇音效下载地址:http://aspx.sc.chi ...

  9. Unity安卓共享纹理

    前置知识:安卓集成Unity开发示例 本文的目的是实现以下的流程: Android/iOS native app 操作摄像头 -> 获取视频流数据 -> 人脸检测或美颜 -> 传输给 ...

  10. Mysql数据库搭建集群---实现主从复制,读写分离

    参考博客:https://blog.csdn.net/xlgen157387/article/details/51331244 A.  准备:多台服务器,且都可以互相随意访问root用户,都可以随意进 ...