这个题就是把区间第k大搬到了树上、、

于是想到链剖、但链剖是要支持区间合并的,第k大显然不可以合并,那怎么办呢

所以就可以容斥,,把所有重链起点终点用两个rt截下来,再把每个+和每个-离散下来,然后由于主席树查找是logn的,离散的点最多有logn对,

所以复杂度是(2*nlog^2n)  可以卡过、

网上的题解是dfs序。。感觉dfs序好想比较神奇,,但已经不知道用多少链剖水过dfs了、

虽然很难写,但写完了比较好调,毕竟难点不在分类讨论、终于1A主席树+链剖辣



码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#define N 100005
#include<map>
using namespace std;
int fu[N],sz[N],a,syg[N],cnt,zj[100],sd[100],b,m,n,c,d[N],siz[N*30],sta1[100][100],sta2[100][100],ch[N*30][2],dui[N],ans,fd[N],tot,top[N],rt[N],hson[N];
vector<int>v[N];
void dfs1(int o,int fa,int dis)
{int i;fu[o]=fa;sz[o]=1;d[o]=dis;for(i=0;i<v[o].size();i++){int nd=v[o][i];if(nd==fa)continue;dfs1(nd,o,dis+1);if(sz[hson[o]]<sz[nd])hson[o]=nd;sz[o]+=sz[nd];           }
}
void up(int o)
{siz[o]=siz[ch[o][0]]+siz[ch[o][1]];
}
void jia(int o,int l,int r,int last)
{if(l==r){siz[o]=1;      return ;}int mid=(l+r)>>1;if(c<=mid){ch[o][0]=++tot;jia(ch[o][0],l,mid,ch[last][0]);ch[o][1]=ch[last][1];}if(c>mid){ch[o][1]=++tot;jia(ch[o][1],mid+1,r,ch[last][1]);ch[o][0]=ch[last][0];}up(o);
}
int wr;
void dfs2(int o,int tap)
{int i;top[o]=tap;syg[o]=wr;rt[o]=++tot;//cout<<o<<" --> "<<rt[o]<<endl;c=dui[o];jia(rt[o],1,n,rt[wr]);wr=o;if(hson[o]!=0)dfs2(hson[o],tap);for(i=0;i<v[o].size();i++){int nd=v[o][i];if(nd==fu[o]||nd==hson[o])continue;dfs2(nd,nd);}
}
void cha(int l,int r)
{if(l==r){ans=fd[l];return;  }int mid=(l+r)>>1;int i,lin=0;for(i=1;i<=cnt;i++)lin+=siz[ch[sta1[tot][i]][0]];for(i=1;i<=cnt;i++)lin-=siz[ch[sta2[tot][i]][0]];if(lin<c)
{c-=lin;++tot;for(i=1;i<=cnt;i++)sta1[tot][i]=ch[sta1[tot-1][i]][1],sta2[tot][i]=ch[sta2[tot-1][i]][1];cha(mid+1,r);}else
{++tot;for(i=1;i<=cnt;i++)sta1[tot][i]=ch[sta1[tot-1][i]][0],sta2[tot][i]=ch[sta2[tot-1][i]][0];cha(l,mid);
}--tot;}
void work(int x,int y)
{ans=0;cnt=0;while(top[x]!=top[y]){if(d[top[x]]<d[top[y]])swap(x,y);sd[++cnt]=syg[top[x]];zj[cnt]=x;x=fu[top[x]];}   if(d[x]>d[y])swap(x,y);sd[++cnt]=syg[x];zj[cnt]=y;   //  cout<<cnt;tot=0;++tot;int i;for(i=1;i<=cnt;i++)sta1[tot][i]=rt[zj[i]],sta2[tot][i]=rt[sd[i]];cha(1,n);
}
struct woc
{int a,id;
}s[N];
bool cmp(woc a,woc b)
{return a.a<b.a;
}
int main()
{int i,x,y,z;scanf("%d%d",&n,&m);for(i=1;i<=n;i++)
{
scanf("%d",&s[i].a);s[i].id=i;
}
sort(s+1,s+1+n,cmp);
for(i=1;i<=n;i++)
{
dui[s[i].id]=i;
fd[i]=s[i].a;
}for(i=1;i<n;i++){scanf("%d%d",&a,&b);v[a].push_back(b);v[b].push_back(a);  }dfs1(1,0,1);dfs2(1,1);for(i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&c);x=x^ans;work(x,y);
if(i!=m)printf("%d\n",ans);
else printf("%d",ans);}
}

2017.9.23 Count on a tree 思考记录相关推荐

  1. 2017.4.23 税收与补贴问题 思考记录

    题目理解起来很坑,对了好几遍才明白 听说搜索就可以过,所以我用了数学方法. 设增量为x则对于每一个非政府要求价,都有: f(要求)-f(非要求)>=0 f(x)=(价+x)*件数=价*件数+x* ...

  2. 2017.3.6~2017.3.7 Harry And Magic Box 思考记录(特别不容易)

    英文题,看翻译做 看到这个题竟然一下找到了思路:    组合数+容斥:: 但是容斥不太懂 好像要做这个题必须先推容斥.... 试一试吧. 然并卵,花了一个晚上,还是求不出来. 根据题目的重复关系,确实 ...

  3. 2017.9.2 最大半联通子图 思考记录

    这个题一看上去似乎很难,,   半联通子图根本就没听说过啊 但经过一段时间的思考之后似乎模型挺直接的. 但是其实,他就是问你一个选点最多的路径. 因为如果这些点如果不能能构成一条路径的话,不在路径上的 ...

  4. 2017.10.17 CF#441 F题 思考记录

    .果然没有题解做题感觉是不一样的. 这个F题可能是最像往常B题的题了(往常B题就是dp,还一般都不难) 首先这个是|,所以|的数越多,它一定是不降的 那么合法的一定是一个数到一个数往后的数所构成的所有 ...

  5. 2017.10.8 球形空间产生器sphere 思考记录

    圆心上的点到各点之间的距离相等,所以根据距离公式  sqrt (  (x-x1)^2  +(y-y1)^2 + (z-z1)^2)  可以由相邻两个式子列等式拆平方得到一元一次方程 然后消元求方程的解 ...

  6. 2017.10.7 最长上升子序列 思考记录

    由于他添加的数字单调上升,所以答案只会在插入的那个数的f值上更新.. 由于之前插入的数都比这个数小,所以直接找区间f最大值.. 这题splay比上个play题好写太多了 不调不试1A  splay辣 ...

  7. 2017.8.9 老C的键盘 思考记录

    这个题一开始想错了.  一开始本来打算每个点存三个值,一个比它大的数的个数,一个不确定的个数,一个比他小的个数.但这是把不同形态拆成不相关的几部分强行存到数组里,不能反映不同排列形态的关系,而且不确定 ...

  8. 2017.6.12 crash的数字表格 思考记录

    很坑的一个题.就是让你求: 可以显然化为: 然后这个gcd就是突破口了,可以考虑gcd的约数. 注:这里的贡献不算1/gcd 这里有个小技巧,就是在设计F和f时,注意是几个互斥的f值相加,并保证相加后 ...

  9. 2017.5.12 校门外的区间 思考记录

    这题很裸,只要维护单点1,0就行了.. 不同运算表示  : u  : 全1 d  : 全0 i  : 以外全0 c  : 取反,以外取0 s  :取反 线段树标记记得下传时当前点标记清零 ,然后就没了 ...

最新文章

  1. plsql数据库异常---plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致 .
  2. navicat存储过程返回值为空_Excel VBA解读(128):Function过程详解——枯燥的语法...
  3. Delphi实现文件下载UrlDownloadToFile
  4. matlab更改类型,matlab数据类型和转换
  5. VB.NET 强制删除文件
  6. iOS13beta2版描述文件,修复了,修复了,修复了,可以用描述文件更新了
  7. vid在c语言中的作用,——PVID的作用及和VID的区别
  8. Atitit 圣阿提拉克斯阿克巴仁波切诗歌集 1. 诗歌集分类 1 1.1. 国王颂歌 1 1.2. 爱情类(相逢 赞美 相识 思念 离去 分分离离 忘记) 1 1.3. 其他 1 1.4. 大
  9. DBveaver的一些使用心得
  10. 手机翻书效果html,移动端实现翻书效果
  11. [读书笔记]《程序员代码面试指南》
  12. 9*9数独问题——深度搜索算法
  13. 如何基于数据分析精准定位你的用户群?
  14. 特斯拉产业的几个问题
  15. 衡水中学计算机老师,河北衡水中学|高三榜样教师风采展
  16. MyBatisPlus--多数据源
  17. llama是什么动物_美洲驼(Llama)——欧美最佳动物果酱动物
  18. 『NLP学习笔记』Sklearn计算准确率、精确率、召回率及F1 Score
  19. MYSQL:查询年龄最大的5个学生(包括年龄并列第5名的所有学生)的姓名、年龄及所在系。
  20. java实现qlearning,DQN(Deep Q-learning)入门教程(一)之强化学习介绍

热门文章

  1. java.util.PropertyPermission“ “org.graalvm.nativeimage.imagecode“ “read“
  2. Python加权图的邻接表邻接矩阵之转换
  3. M1芯片Mac使用原生brew安装软件速度过慢的解决办法
  4. 问题:如何将多个文件里内容都提取出来
  5. python路径规划仿真实验_【python实战】批量获得路径规划——高德地图API
  6. MongoDB数据库操作---终端操作
  7. mongodb的条件查询笔记
  8. python抽奖程序_Python编写抽奖式随机提问程序
  9. flume数据采集_大数据采集系统Flume集群部署
  10. handler机制的原理_Handler机制竟然可以这样解释,我惊呆了!