这题是学主席树的时候就想写的,,,

但是当时没写(懒)

现在来填坑

= =日常调半天lca(考虑以后背板)

主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分没出问题)

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. struct lis{ int x,id;} li[];
  5. struct nod{ int num,ls,rs;} t[];
  6. int n,m,x,y,z,sum=,N=,lastans=;
  7. int to[],nex[],list[];
  8. int a[],h[],fir[],root[],f[],pos[];
  9. int log[],near[],rmq[][];
  10. bool operator<(lis a,lis b){ return a.x<b.x;}
  11. void add(int x,int y,int z){ to[z]=y;nex[z]=fir[x];fir[x]=z;}
  12. inline int lca(int x,int y){ if(x>y) swap(x,y);
  13. return (h[rmq[log[y-x+]][x]]<h[rmq[log[y-x+]][y-near[y-x+]+]])?
  14. rmq[log[y-x+]][x]:rmq[log[y-x+]][y-near[y-x+]+];}
  15. void build(int now,int fa)
  16. {
  17. f[now]=fa;root[now]=++sum;
  18. int com=root[fa],cha=root[now],l=,r=n;
  19. while(l<r)
  20. if(a[now]>(l+r)/)
  21. l=(l+r)/+,t[cha]=(nod){t[com].num+,t[com].ls,++sum},cha=sum,com=t[com].rs;
  22. else
  23. r=(l+r)/,t[cha]=(nod){t[com].num+,++sum,t[com].rs},cha=sum,com=t[com].ls;
  24. list[++N]=now;pos[now]=N;t[cha]=(nod){t[com].num+,,};h[now]=h[fa]+;
  25. for(int i=fir[now];i;i=nex[i])
  26. if(to[i]!=fa)
  27. build(to[i],now),list[++N]=now;
  28. }
  29. void que(int x,int y,int z)
  30. {
  31. int l=,r=n,lc=lca(pos[x],pos[y]),lcc=f[lc];
  32. x=root[x],y=root[y],lc=root[lc],lcc=root[lcc];
  33. while(l<r)
  34. if(t[t[x].ls].num+t[t[y].ls].num-t[t[lc].ls].num-t[t[lcc].ls].num<z)
  35. l=(l+r)/+,z-=t[t[x].ls].num+t[t[y].ls].num-t[t[lc].ls].num-t[t[lcc].ls].num,
  36. x=t[x].rs,y=t[y].rs,lc=t[lc].rs,lcc=t[lcc].rs;
  37. else
  38. r=(l+r)/,x=t[x].ls,y=t[y].ls,lc=t[lc].ls,lcc=t[lcc].ls;
  39. lastans=li[l].x;
  40. }
  41. int main()
  42. {
  43. scanf("%d%d",&n,&m);
  44. for(int i=;i<=n;i++)
  45. scanf("%d",&li[i].x),li[i].id=i;
  46. sort(li+,li+n+);
  47. for(int i=;i<=n;i++)
  48. a[li[i].id]=i;
  49. for(int i=;i<n;i++)
  50. scanf("%d%d",&x,&y),add(x,y,i),add(y,x,i+n);
  51. build(,);
  52. for(int i=;i<=N;i++)
  53. rmq[][i]=list[i];
  54. for(int i=,j=,k=;i<=N;log[i]=j,near[i]=k,i++)
  55. if(i>k*) j++,k*=;
  56. for(int i=,k=;k<=N;i++,k*=)
  57. for(int j=;j<=N-k+;j++)
  58. rmq[i][j]=(h[rmq[i-][j]]<h[rmq[i-][j+k/]])?rmq[i-][j]:rmq[i-][j+k/];
  59. for(int i=;i<=m;i++)
  60. scanf("%d%d%d",&x,&y,&z),que(/*lastans^*/x,y,z),printf(i<m?"%d\n":"%d",lastans);
  61. return ;
  62. } //lastans^加上以后就是强在,bzoj上的题;不加就是不强在,spoj上的题

顺便吐槽:spoj上内存限制1.5G实在太6,,,

导致我乱开数组,交bzoj的时候MLE了很多发

【填坑向】spoj COT/bzoj2588 Count on a tree的更多相关文章

  1. 洛谷P2633/bzoj2588 Count on a tree (主席树)

    洛谷P2633/bzoj2588 Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K ...

  2. 【BZOJ】【2588】COT(Count On a Tree)

    可持久化线段树 maya……树么……转化成序列……所以就写了个树链剖分……然后每个点保存的是从它到根的可持久化线段树. 然后就像序列一样查询……注意是多个左端点和多个右端点,处理方法类似BZOJ 19 ...

  3. BZOJ2588 Count on a tree 【树上主席树】

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MB Submit: 7577  Solved: 185 ...

  4. 主席树+dfs SPOJ BZOJ2588 Count on a tree

    这道题我由于智障错误导致一直错. 在树上建主席树,加上lca思想,很简单. #include<bits/stdc++.h> using namespace std; ; struct no ...

  5. 【SPOJ】10628. Count on a tree(lca+主席树+dfs序)

    http://www.spoj.com/problems/COT/ (速度很快,排到了rank6) 这题让我明白了人生T_T 我知道我为什么那么sb了. 调试一早上都在想人生. 唉. 太弱. 太弱. ...

  6. [bzoj2588][count on a tree] (主席树+lca)

    Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...

  7. bzoj2588 Count on a tree

    题意:给定一棵树,有点权,不带修改,询问路径点权第K大,强制在线. 这道题建主席树的方法好机智.按照BFS/DFS序建树,对于每个点,建出"这个点到根节点的路径上的点"组成的权值线 ...

  8. bzoj2589【 Spoj 10707】 Count on a tree II

    题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v),你需要回答u xor lastans和v这两个节点间有多少种不同的点权.其中lastans是上一个询问的答案,初始为0,即第一 ...

  9. BZOJ2588:Count on a tree(主席树)

    Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...

随机推荐

  1. git版本控制管理实践-2

    给网站设置一个 "根目录下的logo.ico", 还是很有必要的,比如赶集网,这时在 "历史"搜索时, 就可以根据 网站的 logo.ico 很轻松的就能够找到 ...

  2. C# 使用Silverlight toolkit Chart

    一.基础介绍 Silverlight ToolKit是微软发布的基于Microsoft-Public License(MS-PL)许可协议的控件集.MS-PL许可协议允许商业或非商业的发布,所以我们可 ...

  3. PHP批量清空删除指定文件夹内容

    PHP批量清空删除指定文件夹内容: cleancache.php <?php // 清文件缓存 $dirs = array( realpath(dirname(__FILE__) . '/../ ...

  4. jvm死锁解决

    那我们怎么确定一定是死锁呢?有两种方法. 1>使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开. 1)连接到需要查看的进程.

  5. SpringMVC上传文件的三种方式

    直接上代码吧,大伙一看便知 这时:commonsmultipartresolver 的源码,可以研究一下 http://www.verysource.com/code/2337329_1/common ...

  6. 如何使用Service的Context弹出Dialog对话框,即全局性对话框

    在dialog.show()语句前加入: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 然后在An ...

  7. testng 教程之使用参数的一些tricks配合使用reportng

    前两次的总结:testng annotation生命周期 http://www.cnblogs.com/tobecrazy/p/4579414.html testng.xml的使用和基本配置http: ...

  8. [转]字符编码笔记:ASCII,Unicode和UTF-8

    转自:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 作者: 阮一峰 日期: 2007年10月28日 今天中午, ...

  9. 修改vim的主题风格

    参考网站:https://github.com/yangyangwithgnu/use_vim_as_ide#0.1 molokai源码:https://github.com/tomasr/molok ...

  10. Vitamio

    前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的And ...