「题解」:$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 上线流程.我通常会简单说几句,然后说「如果你真感兴趣的话,去搜 ...
随机推荐
- 01_ESP8266 NONO_SDK 创建工程模板
参考:https://wiki.ai-thinker.com/ai_ide_use , 仅作为学习笔记. 一.关于报错 注意:Eclipse 只是一个代码编写工具,它并不能读取 makefile 里 ...
- 提升方法(boosting)详解
提升方法(boosting)详解 提升方法(boosting)是一种常用的统计学习方法,应用广泛且有效.在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性 ...
- Spring Boot 2.X 实现文件上传(三)
使用 SpringBoot 项目完成单个.多个文件的上传处理,并将上传的文件保存到指定目录下. 代码演示案例 所有的 HTML 页面文件 index.html <!DOCTYPE html> ...
- leetcood学习笔记-203-移除链表元素
题目描述: 方法:#在改pre链表时 head中的值也改变 class Solution(object): def removeElements(self, head, val): "&qu ...
- mysql 删除同样记录只保留一条
delete from fa_order_account ) as a) ) as b)
- bzoj1070题解
[解题思路] 考虑拆点,得到一个二分图:左边点<i,j>表示第i个技师按顺序第j辆修的车,右边点k表示第k个车主,连接左右的边表示第k个车主可能成为第i个技师的第j个客户. 因为是二分图, ...
- NX-二次开发创建圆弧(三点圆弧)UF_CURVE_create_arc_3point
NX9+VS2012 #include <uf.h> #include <uf_curve.h> UF_initialize(); //起点 ]; ArcStartPoint[ ...
- NX二次开发-UFUN链表UF_MODL_create_list等用法
NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_curve.h> #include < ...
- ubuntu 12.04系统黑屏,登录界面黑屏
ubuntu 12.04系统黑屏,登录界面黑屏 原文链接:http://www.2cto.com/os/201305/213737.html 1.硬件环境 Intel® Core™ i5- ...
- 剑指offer——24链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点. 题解: 1.普通解法,先遍历一遍计算链表长度,然后遍历到倒数第k个节点: 2.只遍历一遍,使用双指针,使得头尾指针位差为k,那么当尾指针为空时 ...