BZOJ 1455 左偏树即可

  1. #include <cstdio>
  2. #define LL long long
  3. const LL Maxn=;
  4. struct Info{LL l,r,v,Dis;}Tree[Maxn];
  5. LL Father[Maxn],n,m,Dead[Maxn],u,v;
  6. inline void Swap(LL &x,LL &y){LL t=x;x=y;y=t;}
  7. LL Get(LL x) {return x==Father[x]?x:Father[x]=Get(Father[x]);}
  8. LL Merge(LL u,LL v)
  9. {
  10. if (u== || v==) return u+v;
  11. if (Tree[u].v>Tree[v].v) Swap(u,v);
  12. Tree[u].r=Merge(Tree[u].r,v);
  13. if (Tree[Tree[u].l].Dis<Tree[Tree[u].r].Dis)
  14. Swap(Tree[u].l,Tree[u].r);
  15. Tree[u].Dis=Tree[Tree[u].l].Dis+;
  16. return u;
  17. }
  18. int main()
  19. {
  20. scanf("%lld",&n);
  21. for (LL i=;i<=n;i++) scanf("%lld",&Tree[i].v),Tree[i].l=Tree[i].r=;
  22. for (LL i=;i<=n;i++) Father[i]=i;
  23. scanf("%lld",&m);
  24. for (LL i=;i<=m;i++)
  25. {
  26. char ch=getchar();
  27. while (ch!='M' && ch!='K') ch=getchar();
  28. if (ch=='M')
  29. {
  30. scanf("%lld%lld",&u,&v);
  31. LL fu=Get(u);
  32. LL fv=Get(v);
  33. if (fu==fv || Dead[u] || Dead[v]) continue;
  34. LL Tmp=Merge(fu,fv);
  35. Father[fu]=Father[fv]=Tmp;
  36. }
  37. if (ch=='K')
  38. {
  39. scanf("%lld",&u);
  40. if (Dead[u]) {puts(""); continue;}
  41. LL fu=Get(u); Dead[fu]=true;
  42. printf("%lld\n",Tree[fu].v);
  43. LL Tmp=Merge(Tree[fu].l,Tree[fu].r);
  44. Father[fu]=Tmp;
  45. Father[Tmp]=Tmp;
  46. }
  47. }
  48. return ;
  49. }

BZOJ 1455

BZOJ 1803 用主席树维护Dfs序就可以了

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cstdio>
  5. using namespace std;
  6. const int Maxn=;
  7. const int Maxm=;
  8. inline void Get_Int(int &x)
  9. {
  10. x=; register char ch=getchar(); int f=;
  11. while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
  12. while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();} x*=f;
  13. }
  14. inline void Put_Int(int x)
  15. {
  16. char ch[]; register int top=;
  17. if (x<) putchar('-'),x=-x;
  18. if (x==) ch[++top]='';
  19. while (x) ch[++top]=x%+'',x/=;
  20. while (top) putchar(ch[top--]); putchar('\n');
  21. }
  22. struct Node {int Sum; Node * l,* r;};
  23. Node Memory[Maxm],*port=Memory,* Root[Maxn],* null;
  24. inline void Init() {null=port++;null->Sum=;null->l=null->r=null;}
  25. inline Node* NewNode(Node * last=NULL)
  26. {
  27. Node * ret=port++;
  28. if (last==NULL) {ret->Sum=; ret->l=ret->r=null;}
  29. else {ret->Sum=last->Sum+; ret->l=last->l; ret->r=last->r;}
  30. return ret;
  31. }
  32. //======================================
  33. int Begin[Maxn],End[Maxn],Dfn[Maxn],head[Maxn];
  34. int cnt,Stamp,u,v,Rank[Maxn],n,C[Maxn],a[Maxn],num;
  35. struct Info{int v,id;}Data[Maxn];
  36. struct EDGE{int to,next;}edge[Maxn<<];
  37. inline bool Cmp(Info A,Info B) {return A.v<B.v;}
  38. inline void Add(int u,int v) {edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}
  39. void Dfs(int u,int fa)
  40. {
  41. Dfn[Begin[u]=++Stamp]=u;
  42. for (int i=head[u];i!=-;i=edge[i].next)
  43. if (edge[i].to!=fa) Dfs(edge[i].to,u);
  44. Dfn[End[u]=++Stamp]=u;
  45. }
  46. Node * Update(int l,int r,Node *x,int v)
  47. {
  48. Node * Ret=NewNode(x);
  49. if (l==r) return Ret;
  50. int mid=(l+r)>>;
  51. if (v<=mid)Ret->l=Update(l,mid,x->l,v); else
  52. Ret->r=Update(mid+,r,x->r,v);
  53. return Ret;
  54. }
  55. void Query(int L,int R,int K)
  56. {
  57. Node * x=Root[L-],*y=Root[R];
  58. int P=,Q=num;
  59. while (P!=Q)
  60. {
  61. int mid=(P+Q)>>;
  62. if (P==Q)
  63. {
  64. printf("%d\n",C[P]);
  65. return;
  66. }
  67. if (y->l->Sum-x->l->Sum<K)
  68. {
  69. K-=(y->l->Sum-x->l->Sum);
  70. x=x->r,y=y->r;
  71. P=mid+;
  72. } else
  73. {
  74. x=x->l,y=y->l;
  75. Q=mid;
  76. }
  77. }
  78. printf("%d\n",C[P]);
  79. return;
  80. }
  81. int main()
  82. {
  83. // freopen("c.in","r",stdin);
  84. scanf("%d",&n); Init(); Root[]=NewNode();
  85. for (int i=;i<=n;i++)
  86. scanf("%d",&a[i]),Data[i].v=a[i],Data[i].id=i;
  87. sort(Data+,Data+n+,Cmp);
  88. for (int i=;i<=n;i++)
  89. C[++num]=Data[i].id,Rank[Data[i].id]=num;
  90. memset(head,-,sizeof(head));
  91. for (int i=;i<n;i++)
  92. {
  93. scanf("%d%d",&u,&v);
  94. Add(u,v),Add(v,u);
  95. }
  96. Dfs(,);
  97.  
  98. for (int i=;i<=Stamp;i++)
  99. Root[i]=Update(,num,Root[i-],Rank[Dfn[i]]);
  100. int m,x,k;
  101. scanf("%d",&m);
  102. for (int i=;i<=m;i++)
  103. {
  104. scanf("%d%d",&x,&k); k=k*;
  105. Query(Begin[x],End[x],k);
  106. }
  107. return ;
  108. }

POJ1803

BZOJ 3364 LCA

  1. #include <cstdio>
  2. #include <cstring>
  3. const int Maxn=;
  4. struct EDGE{int to,next,w;}edge[Maxn<<];
  5. int head[Maxn],Size[Maxn],Dep[Maxn],Top[Maxn],Dis[Maxn],Fa[Maxn],n,m,u,v,w,cnt,Q;
  6. inline void Add(int u,int v,int w) {edge[cnt].to=v;edge[cnt].next=head[u];edge[cnt].w=w;head[u]=cnt++;}
  7. void Dfs1(int u,int fa)
  8. {
  9. Size[u]=;
  10. for (int i=head[u];i!=-;i=edge[i].next)
  11. {
  12. if (edge[i].to==fa) continue;
  13. Dep[edge[i].to]=Dep[u]+; Fa[edge[i].to]=u;
  14. Dis[edge[i].to]=Dis[u]+edge[i].w;
  15. Dfs1(edge[i].to,u);
  16. Size[u]+=Size[edge[i].to];
  17. }
  18. }
  19. void Dfs2(int u,int fa,int chain)
  20. {
  21. int k=; Top[u]=chain;
  22. for (int i=head[u];i!=-;i=edge[i].next)
  23. {
  24. if (edge[i].to==fa) continue;
  25. if (Size[edge[i].to]>Size[k] || k==) k=edge[i].to;
  26. }
  27. if (k==) return;
  28. Dfs2(k,u,chain);
  29. for (int i=head[u];i!=-;i=edge[i].next)
  30. if (edge[i].to!=fa && edge[i].to!=k)
  31. Dfs2(edge[i].to,u,edge[i].to);
  32. }
  33. int Lca(int u,int v)
  34. {
  35. while (true)
  36. {
  37. if (Top[u]==Top[v]) return Dep[u]>Dep[v]?v:u;
  38. if (Dep[Top[u]]>Dep[Top[v]]) u=Fa[Top[u]]; else v=Fa[Top[v]];
  39. }
  40. }
  41. int main()
  42. {
  43. // freopen("c.in","r",stdin);
  44. while (scanf("%d%d",&n,&m)!=EOF)
  45. {
  46. memset(head,-,sizeof(head));
  47. char Str[];
  48. for (int i=;i<=m;i++)
  49. {
  50. scanf("%d%d%d%s",&u,&v,&w,Str);
  51. Add(u,v,w),Add(v,u,w);
  52. }
  53. Dep[]=; Fa[]=; Dis[]=;
  54. Dfs1(,);
  55. Dfs2(,,);
  56. scanf("%d",&Q);
  57. for (int i=;i<=Q;i++)
  58. {
  59. scanf("%d%d",&u,&v);
  60. printf("%d\n",Dis[u]+Dis[v]-*Dis[Lca(u,v)]);
  61. }
  62. }
  63. return ;
  64. }

树链剖分 LCA

  1. #include <cstdio>
  2. #include <cstring>
  3. const int Maxn=;
  4. struct EDGE{int to,next,w;}edge[Maxn<<];
  5. int head[Maxn],Dep[Maxn],Dis[Maxn],Fa[Maxn][],n,m,u,v,w,cnt,Q;
  6. inline void Add(int u,int v,int w) {edge[cnt].to=v;edge[cnt].next=head[u];edge[cnt].w=w;head[u]=cnt++;}
  7. inline void Swap(int &x,int &y){int t=x;x=y;y=t;}
  8. void Dfs(int u,int fa)
  9. {
  10. for (int i=head[u];i!=-;i=edge[i].next)
  11. {
  12. if (edge[i].to==fa) continue;
  13. Dep[edge[i].to]=Dep[u]+; Fa[edge[i].to][]=u;
  14. Dis[edge[i].to]=Dis[u]+edge[i].w;
  15. Dfs(edge[i].to,u);
  16. }
  17. }
  18. inline void Init()
  19. {
  20. for (int i=;i<=;i++)
  21. for (int j=;j<=n;j++) Fa[j][i]=Fa[Fa[j][i-]][i-];
  22. }
  23. inline int Lca(int u,int v)
  24. {
  25. if (Dep[u]>Dep[v]) Swap(u,v);
  26. int Len=Dep[v]-Dep[u];
  27. for (int i=;i<=;i++)
  28. if (Len&(<<i)) v=Fa[v][i];
  29. for (int i=;i>=;i--)
  30. if (Fa[u][i]!=Fa[v][i]) u=Fa[u][i],v=Fa[v][i];
  31. if (u!=v) return Fa[u][];
  32. return u;
  33. }
  34. int main()
  35. {
  36. // freopen("c.in","r",stdin);
  37. while (scanf("%d%d",&n,&m)!=EOF)
  38. {
  39. memset(head,-,sizeof(head));
  40. char Str[];
  41. for (int i=;i<=m;i++)
  42. {
  43. scanf("%d%d%d%s",&u,&v,&w,Str);
  44. Add(u,v,w),Add(v,u,w);
  45. }
  46. Dep[]=; Fa[][]=; Dis[]=;
  47. Dfs(,); Init();
  48. scanf("%d",&Q);
  49. for (int i=;i<=Q;i++)
  50. {
  51. scanf("%d%d",&u,&v);
  52. printf("%d\n",Dis[u]+Dis[v]-*Dis[Lca(u,v)]);
  53. }
  54. }
  55. return ;

倍增 LCA

BZOJ 1699 RMQ

  1. #include <cstdio>
  2. #include <cmath>
  3. const int Maxn=;
  4. int FMax[Maxn][],FMin[Maxn][],n,q,l,r,x;
  5. inline int Min(int x,int y) {return x>y?y:x;}
  6. inline int Max(int x,int y) {return x>y?x:y;}
  7. inline void Init()
  8. {
  9. for (int i=;i<=;i++)
  10. for (int j=;j+(<<(i-))<=n;j++)
  11. {
  12. FMax[j][i]=Max(FMax[j+(<<(i-))][i-],FMax[j][i-]);
  13. FMin[j][i]=Min(FMin[j+(<<(i-))][i-],FMin[j][i-]);
  14. }
  15. }
  16. inline int Query(int l,int r)
  17. {
  18. int Len=(int)log2(r-l+);
  19.  
  20. return Max(FMax[l][Len],FMax[r-(<<Len)+][Len])-Min(FMin[l][Len],FMin[r-(<<Len)+][Len]);
  21. }
  22. int main()
  23. {
  24. // freopen("c.in","r",stdin);
  25. scanf("%d%d",&n,&q);
  26. for (int i=;i<=n;i++) scanf("%d",&x),FMax[i][]=x,FMin[i][]=x;
  27. Init();
  28. for (int i=;i<=q;i++)
  29. {
  30. scanf("%d%d",&l,&r);
  31. printf("%d\n",Query(l,r));
  32. }
  33. return ;
  34. }

RMQ

NOIP 考前 数据结构复习的更多相关文章

  1. noip考前模板复习

    网络流 Dinic(搭配飞行员) //Serene #include<algorithm> #include<iostream> #include<cstring> ...

  2. NOIP 考前 队列复习

    BZOJ 1127 #include <cstdio> #include <cstring> #include <iostream> #include <al ...

  3. NOIP 考前 数论复习

    POJ 2891 x=r1 (mod a1) x=r2 (mod a2) x=a1*x+r1,x=a2*y+r2; a1*x-a2*y=r2-r1; 用Extend_Gcd求出m1*x+m2*y=d; ...

  4. NOIP 考前DP 复习

    POJ 2533 最长不降子序列 #include <cstdio> ; int a[Maxn],Pos[Maxn],F[Maxn],n,Ans; inline int Max(int x ...

  5. NOIP 考前 Tarjan复习

    POJ 1236 给定一个有向图,求: 1) 至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点 2) 至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点 第一个就是缩点之后有多少 ...

  6. Noip前的大抱佛脚----Noip真题复习

    Noip前的大抱佛脚----Noip真题复习 Tags: Noip前的大抱佛脚 Noip2010 题目不难,但是三个半小时的话要写四道题还是需要码力,不过按照现在的实力应该不出意外可以AK的. 机器翻 ...

  7. NOIP考前划水

    NOIP考前划水 君指先跃动の光は.私の一生不変の信仰に.唯私の超電磁砲永世生き! 要开始背配置了? 3行不谢. (setq c-default-style "awk") (glo ...

  8. NOIP 考前 并查集复习

    POJ 1182 把一个点拆成x,x+n,x+2*n,x吃y可以表示认为x,y+n是一类的,x+n,y+2*n是一类,x+2*n,y是一类. #include <cstdio> ; ],n ...

  9. NOIP考前复习-数制转换,数论模板与文件读写

    数制转换有两种题型,一般一题,分值1.5分. 题型一:R进制转十进制 解法就是:按权展开,但要注意各个位的权,最低位(最右边)的权是0次方,权值为1. 纯整数的情况: (11010110)2 = 1× ...

随机推荐

  1. iOS沙盒(sandbox)

    iOS沙盒 每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,默认下iOS应用只能访问自己的沙盒 extenaion是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补 ...

  2. [原创]WinForm分页控件制作

    先简单说一下思路: 1.做一个分页控件的导航类,即记录总页数.当前页.每页记录数,下一页.上一页.跳转等操作的页数变更. class PageNavigation{/// <summary> ...

  3. Proxy Pattern(Java动态代理和cglib的实现)

    代理模式:给某一个对象提供代理对象,由代理对象控制具体对象的引用. 代理,指的就是一个角色对表另一个角色采取行动,就生活中,一个红酒厂商,是不会直接把红酒零销给客户的,都是通过代理完成他的销售业务.而 ...

  4. php基础_变量和比较符

    本人php菜鸟一枚,初读<php和mysql web开发>,把其中的比较基础的一些东西列举出来,方便和自己一样的菜鸟快速入门,并且方便自己以后复习理解. ①变量 1.比较有特色的应该是变量 ...

  5. pwnable.kr-random

    题目 首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数) 表头文件: #include 定义函数 :int ...

  6. 设立点击ProgressDialog外的区域对话框不消失

    设置点击ProgressDialog外的区域对话框不消失ProgressDialog mpDialog = new ProgressDialog(OrderTable.this);  mpDialog ...

  7. linux 系统负载高 如何检查

    1:load Average 1.1:什么是Load?什么是Load Average?    Load 就是对计算机干活多少的度量(WikiPedia:the system Load is a mea ...

  8. stm8s103 PWM

    stm8s103 PWM的设置不难,但是很多人不注意选项字节这个问题,PWM是IO口的第二功能,要用ST Visual Programmer 修改选项字节. 只需要修改AFR0的功能就可以了

  9. C#之Lock

    lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁. class Program { static void Main(string[] args) { Thre ...

  10. 关于ssh上传文件

    今天用ssh传项目到公司总部的服务器上,报了错误: encountered 1 errors during the transfer 重启ssh再次上传还是一样的错误,然后我让公司那里重启一下服务器, ...