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

  1. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  2. 「题解」「HNOI2013」切糕

    文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...

  3. 「题解」JOIOI 王国

    「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...

  4. 「题解报告」 P3167 [CQOI2014]通配符匹配

    「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...

  5. Linux 小知识翻译 - 「RAID」

    最近术语「RAID」变得比较有名.「RAID」是指将多个HDD组合起来使用,从而提高存储可靠性的一种技术. 那么,关于 RAID 中的 「RAID 0」「RAID 1」「RAID 5」等各种「RAID ...

  6. 正则表达式从入门到放弃「Java」

    正则表达式能做什么? 正则表达式可以用来搜索.编辑或处理文本. 「都懂它可以处理文本,可到底是怎么回事?」 正则表达式的定义 百度百科:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特 ...

  7. 「题解」:[loj2763][JOI2013]现代豪宅

    问题 A: 现代豪宅 时间限制: 1 Sec  内存限制: 256 MB 题面 题目描述 (题目译自 $JOI 2013 Final T3$「現代的な屋敷」) 你在某个很大的豪宅里迷路了.这个豪宅由东 ...

  8. Scala 学习(10)之「集合 」

    数组 定长数组 Array:采用()访问,而不是[],下标从 0 开始. val array1 = new Array[String](5) //创建数组 println(array1) //返回数组 ...

  9. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  10. Facebook 发布「流程」

    时不时就会在面试过程中碰到有候选人问 Facebook 是否采用 Scrum 之类的敏捷方法,偶尔也会有中国的朋友问及 Facebook 上线流程.我通常会简单说几句,然后说「如果你真感兴趣的话,去搜 ...

随机推荐

  1. 一个服务io占满,服务器无响应

    (1).服务器io占满,服务无响应, sar -q -f  /var/log/sa/sa28 上图显示plist-sz 增加了一倍 plist-sz 说明:进程列表中的进程(processes)和线程 ...

  2. python_django_中间件

    什么是中间件? 可以介入django的请求和响应的轻量级的底层插件,它其实就是一个python类,我们在settings配置文件中的↓↓↓↓,都是中间件 MIDDLEWARE = [ 'django. ...

  3. rest framework之APIView

    一.rest framework配置 1.安装rest framework 在django环境中安装rest-framework框架: (automatic) C:\Users\Administrat ...

  4. leetcood学习笔记-206-反转链表

    题目描述: 最佳解: class Solution(object): def reverseList(self, head): """ :type head: ListN ...

  5. ubuntu 16.04 jdk-8u201-linux-x64.tar.gz 安装部署

    都是在普通用户加sudo代替root 1.sudo tar -zxvf jdk-8u201-linux-x64.tar.gz2.sudo chown make:make jdk1.8.0/3.sudo ...

  6. CRI 与 ShimV2:一种 Kubernetes 集成容器运行时的新思路

    摘要: 关于 Kubernetes 接口化设计.CRI.容器运行时.shimv2.RuntimeClass 等关键技术特性的设计与实现.     Kubernetes 项目目前的重点发展方向,是为开发 ...

  7. 2019 hdu多校1

    A:一类线性dp,时间卡的有点紧 /* 定义 dp[t][i][j][k]代表填完前 t 个位置后,{0, 1, 2, 3} 这 4 个数字最后一次出现的位置, 排序后为 t, i, j, k(t & ...

  8. dfs套异或的包含性——cf986C好

    很好的题,想了半天,官方题解的解法更好 这种异或问题的包含性在北邮的校赛里就出现过,需要认真学习一下 /* y和所有合法的x合并,如果没有剪枝,那么复杂度爆炸总共要判(2^n*2^n) 可以考虑如下优 ...

  9. 37 VTK中的坐标系系统

    0 引言 在利用PCL的交互功能解决尺寸关联几何的指定问题时,涉及到一些显示上的操作.目前的需求是:将投影到注释平面上的点云,以与屏幕平齐的方式,显示在屏幕正中,这样方便用户进行操作.但是,在运用se ...

  10. DELPHI 让子窗体显示在任务栏上

    重载 CreateParams 方法即可 声明: procedure CreateParams(var Params: TCreateParams);override; procedure TForm ...