「题解」:$e$
问题 B: $e$
时间限制: 2 Sec 内存限制: 512 MB
题面
题面谢绝公开。
题解
话说一天考两个主席树这回事……
正解可以叫树上主席树??(脸哥说也叫主席树上树???)
对于树上的每一条链建主席树,支持链上查询前驱和后继。
对于所有的$p[i]$,他说怎么得到就按他说的做就好,然后求所有$p[i]$的$LCA$。
对于每个$p[i]$到$LCA$的链上查一次$r$的前驱和后继更新答案即可。
注意:参数不要传反、别一个特判把自己判掉、pre和nxt的代码不要粘贴,粘贴了不要忘记改掉内部递归函数……
(昨天下午大概帮3、4个人调这题代码???RP++)
#include<bits/stdc++.h>
#define rint register int
using namespace std;
const int N=,M=;
inline void read(int &A)
{
A=;int B=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')B=-;ch=getchar();}
while(ch>=''&&ch<=''){A=(A<<)+(A<<)+ch-'';ch=getchar();}
A=A*B;
}
int n,q,tp,ans,a[N],p[N];
int v[N<<],nxt[N<<],first[N<<],tot;
int root[N],ls[N<<],rs[N<<],val[N<<],cnt;
int dep[N],f[N][];
inline void build_line(int uu,int vv)
{
v[++tot]=vv,nxt[tot]=first[uu];
first[uu]=tot;return ;
}
inline void insert(int &k,int l,int r,int his,int dat)
{
k=++cnt;val[k]=val[his]+;
if(l==r)return ;
ls[k]=ls[his],rs[k]=rs[his];
int mid=(l+r)>>;
if(dat<=mid)insert(ls[k],l,mid,ls[his],dat);
else insert(rs[k],mid+,r,rs[his],dat);
}
inline int get_pre(int k1,int k2,int l,int r,int dat)
{
if(!(val[k2]-val[k1]))return ;
if(l==r)return l;int mid=(l+r)>>;
if(dat<=mid)return get_pre(ls[k1],ls[k2],l,mid,dat);
int lin=get_pre(rs[k1],rs[k2],mid+,r,dat);
if(!lin)return get_pre(ls[k1],ls[k2],l,mid,dat);
return lin;
}
inline int get_nxt(int k1,int k2,int l,int r,int dat)
{
if(!(val[k2]-val[k1]))return ;
if(l==r)return l;int mid=(l+r)>>;
if(dat>mid)return get_nxt(rs[k1],rs[k2],mid+,r,dat);
int lin=get_nxt(ls[k1],ls[k2],l,mid,dat);
if(!lin)return get_nxt(rs[k1],rs[k2],mid+,r,dat);
return lin;
}
inline void bfs()
{
queue <int> q;
q.push();dep[]=;
while(!q.empty())
{
int x=q.front();q.pop();
for(rint i=first[x];i;i=nxt[i])
{
int y=v[i];if(dep[y])continue;
dep[y]=dep[x]+;f[y][]=x;
for(rint i=;i<=;++i)
f[y][i]=f[f[y][i-]][i-];
q.push(y);
}
}
return ;
}
inline int get_lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(rint i=;i>=;--i)
if(dep[f[x][i]]>=dep[y])x=f[x][i];
if(x==y)return x;
for(rint i=;i>=;--i)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return f[x][];
}
inline void dfs_build(int x,int fa)
{
insert(root[x],,M,root[fa],a[x]);
for(rint i=first[x];i;i=nxt[i])
if(v[i]!=fa)dfs_build(v[i],x);
return ;
}
int main()
{
read(n),read(q),read(tp);
for(rint i=;i<=n;++i)read(a[i]);
for(rint i=,ST,EN;i<n;++i)
read(ST),read(EN),build_line(ST,EN),build_line(EN,ST);
dfs_build(,);bfs();
for(rint i=,r,k;i<=q;++i)
{
read(r),read(k);
for(rint j=,x;j<=k;++j)
read(x),p[j]=(x-+ans*tp)%n+;
int lca=p[];
for(rint j=;j<=k;++j)
lca=get_lca(lca,p[j]);
ans=0x7fffffff;
for(rint j=;j<=k;++j)
{
int pre=get_pre(root[f[lca][]],root[p[j]],,M,r);
int nxt=get_nxt(root[f[lca][]],root[p[j]],,M,r);
if(pre)ans=min(r-pre,ans);
if(nxt)ans=min(nxt-r,ans);
}
printf("%d\n",ans);
}
}
「题解」:$e$的更多相关文章
- 「题解」「美团 CodeM 资格赛」跳格子
目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...
- 「题解」「HNOI2013」切糕
文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...
- 「题解」JOIOI 王国
「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...
- 「题解报告」 P3167 [CQOI2014]通配符匹配
「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...
- Linux 小知识翻译 - 「RAID」
最近术语「RAID」变得比较有名.「RAID」是指将多个HDD组合起来使用,从而提高存储可靠性的一种技术. 那么,关于 RAID 中的 「RAID 0」「RAID 1」「RAID 5」等各种「RAID ...
- 正则表达式从入门到放弃「Java」
正则表达式能做什么? 正则表达式可以用来搜索.编辑或处理文本. 「都懂它可以处理文本,可到底是怎么回事?」 正则表达式的定义 百度百科:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特 ...
- 「题解」:[loj2763][JOI2013]现代豪宅
问题 A: 现代豪宅 时间限制: 1 Sec 内存限制: 256 MB 题面 题目描述 (题目译自 $JOI 2013 Final T3$「現代的な屋敷」) 你在某个很大的豪宅里迷路了.这个豪宅由东 ...
- Scala 学习(10)之「集合 」
数组 定长数组 Array:采用()访问,而不是[],下标从 0 开始. val array1 = new Array[String](5) //创建数组 println(array1) //返回数组 ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- Facebook 发布「流程」
时不时就会在面试过程中碰到有候选人问 Facebook 是否采用 Scrum 之类的敏捷方法,偶尔也会有中国的朋友问及 Facebook 上线流程.我通常会简单说几句,然后说「如果你真感兴趣的话,去搜 ...
随机推荐
- 22-3concat
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 生成对抗网络(GAN)的18个绝妙应用
https://juejin.im/post/5d3fb44e6fb9a06b2e3ccd4e 生成对抗网络(GAN)是生成模型的一种神经网络架构. 生成模型指在现存样本的基础上,使用模型来生成新案例 ...
- vue之axios的使用
一.环境安装 1.axios的安装 进入到对应工程目录执行: npm install axios 2.启动测试数据的API 测试项目地址:https://github.com/ShenJianPing ...
- 在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr。
在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr. $("#checkAll").prop("checked", true ...
- windows10,nodejs安装步骤
系统: windows10 1.下载: https://nodejs.org/en/ 2.下载最新版本,根据你的系统选择32位或者64位: 3.建议选择源码源码安装,不选择编译后的安装 如: 4.进行 ...
- Dart编程循环
有时,某些指令需要重复执行.循环是一种理想的方法.循环表示必须重复的一组指令.在循环的上下文中,重复被称为迭代 . 下图说明了循环的分类 让我们开始讨论确定循环.迭代次数是确定/固定的循环称为确定循环 ...
- thinkphp PATH_INFO支持
如果发生在本地测试正常,但是一旦部署到服务器环境后会发生只能访问首页的情况,很有可能是你的服务器或者空间不支持PATH_INFO所致. 系统内置提供了对PATH_INFO的兼容判断处理,但是不能确保在 ...
- bzoj1012题解
[解题思路] 强制在线线段树/树状数组,没什么好说的..复杂度O(mlog2m)(线段树)或O(mlog22m)(树状数组). [参考代码] (还naive的时候写的zkw真是翔..) #includ ...
- Lua的控制流程
一.条件语句 if语句 if语句是由一个布尔表达式作为条件判断,或者紧跟其他语句组成. if else语句 if语句可以是else搭配使用,在if条件表达式为false时执行else语句代码 if嵌套 ...
- 全局唯一标识符(GUID,Globally Unique Identifier)
全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想情况 ...