这道在没加读入优化时间在20s左右的题终于在大米饼两天的死缠烂打、鬼混、乱整乱撞后艰难地AC了。但惋惜的是,大米饼一号代码其实更加简洁,但至今找不出BUG,我将它放在下面,也许有一天从远方来的另一个大米饼会拯救它。让我们一起念出这道题的关键字:

Kurskal,LCA倍增,Kurskal重构树,dfs序,主席树。

比较新鲜的是重构树,它有一些美妙性质。

红色的是由边化成的节点。用Kurskal建出这棵树,在这一棵树上进行DFS序处理,并且在DFS序上进行主席树(可持久化线段树)处理。有趣的是,这道题读入优化可以加速5s,是不是很美妙!

  1. 1 #include<stdio.h>
  2. 2 #include<algorithm>
  3. 3 #include<cstring>
  4. 4 #define ro(i,a,b) for(int i=a;i>=b;i--)
  5. 5 #define go(i,a,b) for(int i=a;i<=b;i++)
  6. 6 using namespace std;
  7. 7 const int inf=2147483646;const int logp=18;const int N=1e5+233;
  8. 8 const int M=5e5+233;const int P=N<<1;const int E=P<<1;const int S=P*logp ;
  9. 9 int n,m,q,p,num,cnt,K,d[N],h[N],dad[P],val[P],rt[P],lc[S],rc[S],sum[S];
  10. 10 int si[P],dep[P],dfn[P],pos[P],head[P],nex[E],ver[E],fa[logp+1][P],pr[logp+1],lg[P];
  11. 11 struct edge{int x,y,z;};edge a[M];
  12. 12 bool cmp(edge a, edge b){return a.z<b.z;}
  13. 13 int find(int x){return dad[x]!=x?dad[x]=find(dad[x]):x;}
  14. 14 void ADD(int u, int v){nex[++K]=head[u];head[u]=K;ver[K]=v;}
  15. 15 void dfs(int u)
  16. 16 {
  17. 17 si[u]=1;dfn[u]=++num;pos[num]=u;
  18. 18 for(int i=head[u];i;i=nex[i])
  19. 19 {int v=ver[i];fa[0][v]=u;dep[v]=dep[u]+1;dfs(v);si[u]+=si[v];}
  20. 20 }
  21. 21 void Kruskal()
  22. 22 {
  23. 23 p=n;sort(a+1,a+1+m,cmp);
  24. 24 go(i,1,m){int x=find(a[i].x),y=find(a[i].y);
  25. 25 if(x!=y){dad[++p]=p;val[p]=a[i].z;dad[x]=dad[y]=p;
  26. 26 ADD(p,x),ADD(p,y);if(p==(n<<1)-1)break;}}
  27. 27 }
  28. 28 void Rmq()
  29. 29 {
  30. 30 go(k,1,lg[p])go(i,1,p){if(dep[i]<pr[k])continue;
  31. 31 fa[k][i]=fa[k-1][fa[k-1][i]];}
  32. 32 }
  33. 33 int Add(int p,int l,int r,int x)
  34. 34 {
  35. 35 int k=++cnt;sum[k]=sum[p]+1;if(l==r)return k;int mid=l+r>>1;
  36. 36 if(x<=mid)lc[k]=Add(lc[p],l,mid,x),rc[k]=rc[p];
  37. 37 else rc[k]=Add(rc[p],mid+1,r,x),lc[k]=lc[p];return k;
  38. 38 }
  39. 39 void prepare()
  40. 40 {
  41. 41 Kruskal();num=0;go(i,1,p)if(!dfn[i])dfs(find(i));pr[0]=1;
  42. 42 go(i,1,logp){pr[i]=pr[i-1]<<1;if(pr[i]>p)break;lg[pr[i]]=1;}
  43. 43 go(i,1,p)lg[i]+=lg[i-1];Rmq();go(i,1,num)
  44. 44 {int x=pos[i];if(x>n)rt[i]=rt[i-1];else rt[i]=Add(rt[i-1],1,n,h[x]);}
  45. 45 }
  46. 46 int Jump(int x, int v){
  47. 47 int len=lg[dep[x]];ro(i,len,0)if(val[fa[i][x]]<=v)x=fa[i][x];return x;
  48. 48 }
  49. 49 int Query(int a, int b, int l, int r, int k)
  50. 50 {
  51. 51 if(l==r)return l;int amo=sum[rc[b]]-sum[rc[a]];
  52. 52 int mi=l+r>>1;if(amo<k)return Query(lc[a],lc[b],l,mi,k-amo);
  53. 53 return Query(rc[a],rc[b],mi+1,r,k);
  54. 54 }
  55. 55 int Ask(int x, int v, int k)
  56. 56 {
  57. 57 int anc=Jump(x,v),beg=rt[dfn[anc]-1],end=rt[dfn[anc]+si[anc]-1];
  58. 58 if(sum[end]-sum[beg]<k)return -1;
  59. 59 int hi=Query(beg,end,1,n,k);return d[hi];
  60. 60 }
  61. 61 int main()
  62. 62 {
  63. 63 scanf("%d%d%d",&n,&m,&q);val[0]=inf;
  64. 64 go(i,1,n)scanf("%d",&h[i]),d[i]=h[i],dad[i]=i;
  65. 65 sort(d+1,d+1+n);go(i,1,n)h[i]=lower_bound(d+1,d+1+n,h[i])-d;
  66. 66 go(i,1,m)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
  67. 67 prepare();int ans=-1;while(q--)
  68. 68 {
  69. 69 int x,v,k;scanf("%d%d%d",&x,&v,&k);
  70. 70 if(ans != -1)x^=ans,v^=ans,k^=ans;
  71. 71 ans=Ask(x,v,k);printf("%d\n",ans);
  72. 72 }
  73. 73 }

【大米饼代码】

下面是暂时RE的代码:

  1. 1 #include<stdio.h>
  2. 2 #include<algorithm>
  3. 3 #define go(i,a,b) for(int i=a;i<=b;i++)
  4. 4 #define ro(i,a,b) for(int i=a;i>=b;i--)
  5. 5 #define rule 1000000000
  6. 6 using namespace std;const int N=100003;struct TT{int siz,l,r;}t[N*20];
  7. 7 struct G{int u,v,w;bool operator<(const G&X)const{return w<X.w;};}g[N*20];
  8. 8 int n,m,q,fa[N],ch[N][2],SZ,sz,val[N],root,v,x,k,ans=0,T[N];
  9. 9 int up[N][20],dis[N][20],start[N],end[N],dfs_clock,DFS[N],ROOT[N];
  10. 10 int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
  11. 11 int get_root(int x,int val){ro(j,19,0)if(up[x][j]&&dis[x][j]<=val)x=up[x][j];return x;}
  12. 12 void dfs(int u){if(!u)return;start[u]=dfs_clock;
  13. 13 if(ch[u][1]+ch[u][0]<1)DFS[++dfs_clock]=val[u];
  14. 14 go(i,0,1)dfs(ch[u][i]);end[u]=dfs_clock;
  15. 15 }
  16. 16 void insert(int& x,int Val,int l,int r){
  17. 17 t[++sz]=t[x];x=sz;++t[x].siz;if(l==r)return;
  18. 18 int mid=(l+r)/2;if(Val<=mid)insert(t[x].l,Val,l,mid);
  19. 19 else insert(t[x].r,Val,mid+1,r);
  20. 20 }
  21. 21 void Que(int i,int j,int k,int l,int r){
  22. 22 if( l==r ){ans=l;return;}
  23. 23 int tmp=t[t[j].l].siz-t[t[i].l].siz,mid=(r+l)/2;
  24. 24 if(k<=tmp)Que(t[i].l,t[j].l,k,l,mid);else Que(t[i].r,t[j].r,k-tmp,mid+1,r);
  25. 25 }
  26. 26 int main(){
  27. 27 freopen("in.in","r",stdin);
  28. 28 scanf("%d%d%d",&n,&m,&q);SZ=n;
  29. 29 go(i,1,n)scanf("%d",&val[i]),fa[i]=i;
  30. 30 go(i,1,m)scanf("%d%d%d",&g[i].u,&g[i].v,&g[i].w);
  31. 31 sort(g+1,g+m+1);int tot=n;go(i,1,m)
  32. 32 {
  33. 33 int Fa=find(g[i].u),Fb=find(g[i].v);
  34. 34 if(Fa==Fb)continue;if(!--tot)break;
  35. 35 int u=++SZ;fa[u]=fa[Fa]=fa[Fb]=u;
  36. 36 ch[u][0]=Fa,ch[u][1]=Fb;
  37. 37 up[Fa][0]=up[Fb][0]=u;
  38. 38 dis[Fa][0]=dis[Fb][0]=g[i].w;
  39. 39 }
  40. 40
  41. 41 dfs(SZ);go(i,1,n)ROOT[i]=ROOT[i-1],insert(ROOT[i],DFS[i],0,rule);
  42. 42 go(j,1,19)go(i,1,SZ)up[i][j]=up[up[i][j-1]][j-1],
  43. 43 dis[i][j]=max(dis[i][j-1],dis[up[i][j-1]][j-1]);
  44. 44
  45. 45 go(i,1,q)
  46. 46 {
  47. 47 scanf("%d%d%d",&v,&x,&k);x^=ans;v^=ans;k^=ans;
  48. 48 root=get_root(x,v);
  49. 49 int gap=end[root]-start[root];
  50. 50 if(gap<k){puts("-1");ans=0;continue;}
  51. 51 Que(ROOT[start[root]],ROOT[end[root]],gap-k+1,0,rule);
  52. 52 if(!ans){puts("-1");ans=0;continue;}printf("%d\n",ans);
  53. 53 }
  54. 54 return 0;
  55. 55 }//Paul_Guderian

【大米饼一号代码】

 

你没有达到顶尖!但记得给我买杯柠檬汁。

【Peaks加强版 BZOJ 3551】你被坑了吗?的更多相关文章

  1. Peaks BZOJ 3545 / Peaks加强版 BZOJ 3551

    Peaks [问题描述] 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问 ...

  2. 【BZOJ 3545】【ONTAK 2010】Peaks & 【BZOJ 3551】【ONTAK 2010】Peaks加强版 Kruskal重构树

    sunshine的A题我竟然调了一周!!! 把循环dfs改成一个dfs就可以,,,我也不知道为什么这样就不会RE,但它却是A了,,, 这周我一直在调这个题,总结一下智障错误: 1.倍增的范围设成了n而 ...

  3. bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 635  Solved: 177[Submit][Stat ...

  4. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

  5. 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Sta ...

  6. 3551: [ONTAK2010]Peaks加强版

    3551: [ONTAK2010]Peaks加强版 https://www.lydsy.com/JudgeOnline/problem.php?id=3551 分析: kruskal重构树 +  倍增 ...

  7. 【BZOJ3551】 [ONTAK2010]Peaks加强版

    BZOJ3551 [ONTAK2010]Peaks加强版 Solution Kruscal重构树后发现可以对于小于的离散化然后倍增+主席树找到上一个的可行解. 然后就可以了. 如果数组开的不好,容易在 ...

  8. 【BZOJ3551】Peaks加强版(Kruskal重构树,主席树)

    [BZOJ3551]Peaks加强版(Kruskal重构树,主席树) 题面 BZOJ Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相 ...

  9. 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树

    [BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...

随机推荐

  1. JAVA中最容易让人忽视的基础。

    可能很多找编程工作的人在面试的时候都有这种感受,去到一个公司填写面试试题的时候,多数人往往死在比较基础的知识点上.不要奇怪,事实就是如此一般来说,大多数公司给出的基础题大概有122道,代码题19道左右 ...

  2. faster-rcnn 结构杂谈

    faster-rcnn结构图: (只截取了最难理解的部分) 这个网络看似很复杂,但是理解了其中关键的层,就基本可以掌握这个结构了.要看源码!!要看源码!!要看源码 !!重要的事情说三遍. 关键的层: ...

  3. php函数var_dump() 、print_r()、echo()

    var_dump() 能打印出类型 print_r() 只能打出值 echo() 是正常输出... 需要精确调试的时候用 var_dump(); 一般查看的时候用 print_r() 另外 , ech ...

  4. JAVA_SE基础——72.自定义线程

    进程 :  正在执行的程序称作为一个进程.  进程负责了内存空间的划分.   问题: windows号称是多任务的操作系统,那么windows是同时运行多个应用程序吗?从宏观的角度: windows确 ...

  5. 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...

  6. Nginx+Tomcat高性能负载均衡集群搭建

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/8745794.html Nginx是一个高性能的HTTP服务器/反向代理服务器及电子邮件(IMAP/POP3) ...

  7. OrientDB入门(1)Getting Started

    Running OrientDB the First Time First, download and extract OrientDB by selecting the appropriate pa ...

  8. kafka---broker 保存消息

    1 .存储方式 物理上把 topic 分成一个或多个 patition(对应 server.properties 中的 num.partitions=3 配置),每个 patition 物理上对应一个 ...

  9. java中的引用类型的对象存放在哪里

    根据上下文来确定.比如void func(){    Object obj = new Object();//这个obj在函数的栈里.}class Test{   private Object obj ...

  10. Django 框架介绍

    Django 框架介绍 MVC框架和MTV框架 简单了解一下什么是MVC框架.MVC(Model View Controller),是模型(model)-视图(view)-控制器(controller ...