Description

Input

Output

Data Constraint

分析:
最小连通块可以看作是所有点到他们的 lca l c a lca路径的并集,因为是取最小值,所以重复的不会有贡献。
我们对这棵树建可持久化线段树,每个点的线段树相当于他的父亲加上一条链。然后就相当于在这些线段树上找前驱与后继。
一开始我想到二分答案,再判断,这样做是 O(nlog2n) O ( n l o g 2 n ) O(nlog^2n)的,然后我被卡掉了。然后还有一种直接线段树找前驱的方法,如果当前点小于 mid m i d mid,直接找左半部分,否则先找右半部分,如果没有再找左半部,这样做应该是和k-d tree找最近点对差不多的。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>const int maxn=1e5+7;
const int maxp=1e9;using namespace std;int n,test,m,typ,x,y,cnt,l,r,lastans;
int a[maxn],root[maxn],f[maxn][20],b[maxn*3],ls[maxn],dep[maxn];struct node{int l,r,data;
}t[maxn*50];struct edge{int y,next;
}g[maxn*2];void add(int x,int y)
{g[++cnt]=(edge){y,ls[x]};ls[x]=cnt;
}void ins(int &p,int q,int l,int r,int x,int k)
{if (!p) p=++cnt;t[p].data=t[q].data+k;if (l==r) return;int mid=(l+r)/2;if (x<=mid) t[p].r=t[q].r,ins(t[p].l,t[q].l,l,mid,x,k);else t[p].l=t[q].l,ins(t[p].r,t[q].r,mid+1,r,x,k);
}int getpre(int p,int q,int l,int r,int x)
{if (!(t[p].data-t[q].data)) return 0;if (l==r) return l;int mid=(l+r)/2;if (x<=mid) return getpre(t[p].l,t[q].l,l,mid,x);else{int tmp=getpre(t[p].r,t[q].r,mid+1,r,x);if (tmp) return tmp;return getpre(t[p].l,t[q].l,l,mid,x);}
}int getnext(int p,int q,int l,int r,int x)
{if (!(t[p].data-t[q].data)) return 0;if (l==r) return l;int mid=(l+r)/2;if (x>mid) return getnext(t[p].r,t[q].r,mid+1,r,x);else{int tmp=getnext(t[p].l,t[q].l,l,mid,x);if (tmp) return tmp;return getnext(t[p].r,t[q].r,mid+1,r,x);}
}void dfs(int x,int fa)
{f[x][0]=fa;dep[x]=dep[fa]+1;ins(root[x],root[fa],1,maxp,a[x],1);for (int i=ls[x];i>0;i=g[i].next){int y=g[i].y;if (y==fa) continue;dfs(y,x);}
}int lca(int x,int y)
{if (dep[x]>dep[y]) swap(x,y);int d=dep[y]-dep[x],k=19,t=1<<k;while (d){if (d>=t) d-=t,y=f[y][k];t/=2,k--;}if (x==y) return x;k=19;while (k>=0){if (f[x][k]!=f[y][k]){x=f[x][k];y=f[y][k];}k--;}return f[x][0];
}int main()
{freopen("e.in","r",stdin);freopen("e.out","w",stdout);scanf("%d%d%d",&n,&test,&typ);for (int i=1;i<=n;i++) scanf("%d",&a[i]);for (int i=1;i<n;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);}cnt=0;dfs(1,0);   for (int j=1;j<20;j++){for (int i=1;i<=n;i++){f[i][j]=f[f[i][j-1]][j-1];}}   for (int i=1;i<=test;i++){scanf("%d%d",&x,&m);for (int j=1;j<=m;j++){scanf("%d",&b[j]);b[j]=(b[j]-1+lastans*typ)%n+1;}int d=b[1];for (int j=2;j<=m;j++) d=lca(d,b[j]);d=f[d][0];lastans=2e9;for (int j=1;j<=m;j++){int tmp1=getpre(root[b[j]],root[d],1,maxp,x);int tmp2=getnext(root[b[j]],root[d],1,maxp,x);if (tmp1) lastans=min(lastans,x-tmp1);if (tmp2) lastans=min(lastans,tmp2-x);}printf("%d\n",lastans);}
}

jzoj 5850.【NOIP提高组模拟2018.8.25】e 可持久化线段树+lca相关推荐

  1. JZOJ 5850. 【NOIP提高组模拟2018.8.25】e

    Description Input Output Sample Input 5 7 0 1 2 3 4 5 1 2 2 3 2 4 1 5 1 2 4 5 2 2 4 5 3 2 4 5 4 2 4 ...

  2. 第一届『Citric杯』NOIP提高组模拟赛 题解

    [官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...

  3. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】

    U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...

  4. JZOJ 5281. 【NOIP提高组模拟A组8.15】钦点

    Description Input Output Sample Input 4 4 2 a a b b a a b b c c d d c c d d 1 1 3 3 2 2 3 1 1 3 2 2 ...

  5. JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会

    题目 Description "那么真的有果尔德施坦因这样一个人?"他问道. "是啊,有这样一个人,他还活着.至于在哪里,我就不知道了." "那么那个 ...

  6. 第二届『Citric杯』NOIP提高组模拟赛

    一道防AK的好题 不得不吐槽这个题目背景和算法.这就是一脑筋急转弯啊. Code program hard; CONST FileName='hard'; var n,i,tot:longint;x, ...

  7. JZOJ 5814. 【NOIP提高A组模拟2018.8.14】 树

    梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...

  8. 2018.12.08【NOIP提高组】模拟B组总结(未完成)

    2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...

  9. 5814. 【NOIP提高A组模拟2018.8.14】 树(期望 + 倍增)

    5814. [NOIP提高A组模拟2018.8.14] 树 Problem 给定一棵nnn个点的树,m" role="presentation">mmm次询问,每次 ...

最新文章

  1. 为什么指针被誉为 C 语言灵魂?
  2. Web API With AJAX: Handle Session in Web API
  3. 用区块链变革教育行业?全球首个教育+旅行+区块链平台——Ambertime:让每个人都能够将时间凝结成自己专属的“琥珀”...
  4. java note项目_note(java)
  5. oracle setpage,Oracle Set命令的应用
  6. TCP往返时延的估计和超时
  7. cocos2dx 3.0打包android遇到的错误(持续更新)
  8. CF280C-Game on Tree【数学期望】
  9. 前端学习(3117):react-hello-react的类中的方法
  10. 利用计算机卸载,电脑使用痕迹彻底清理工具(无影无踪WYWZ)
  11. 计算机编程常用指令,加工中心几个常用指令的编程技巧
  12. 计算机电缆国家标准是什么,计算机电缆执行标准是什么
  13. 宝尚网上开户踏准板块轮动节奏的机会
  14. 中国高铁砥砺前行,促进经济腾飞
  15. stm32使用各种传感器的教程
  16. 关于中医把脉的一点想法
  17. ant design vue table 高度自适应_很受欢迎的vue前端UI框架
  18. 在mysql中查询时间最小的一条记录
  19. python爬虫 爬取清纯小姐姐图片
  20. 新签约和新开业酒店 | 华中首家美高梅、广州奥园喜来登、苏州裸心泊度假村、南昌八一广场格雷斯精选等酒店陆续签约和开业...

热门文章

  1. 关于求字体识别不出来
  2. iptables知识点总结
  3. Win10问题篇:解决AMD家CPU机械,固态硬盘混用导致的卡顿(爆音)问题。
  4. Linux 升级glibc-2.18
  5. 对 ArabicRSS APK 应用木马样本的分析
  6. 领域驱动(DDD)设计
  7. 黄灯闪烁c语言程序,模拟交通灯C程序,用定时器0,如何实现黄灯闪烁功能
  8. d610网络计算机,尼康D610评测:机身细节
  9. linux如何设置串口参数,串口通信的参数如何设置
  10. 图片下载_二维码生成