BZOJ 1455 左偏树即可

 #include <cstdio>
#define LL long long
const LL Maxn=;
struct Info{LL l,r,v,Dis;}Tree[Maxn];
LL Father[Maxn],n,m,Dead[Maxn],u,v;
inline void Swap(LL &x,LL &y){LL t=x;x=y;y=t;}
LL Get(LL x) {return x==Father[x]?x:Father[x]=Get(Father[x]);}
LL Merge(LL u,LL v)
{
if (u== || v==) return u+v;
if (Tree[u].v>Tree[v].v) Swap(u,v);
Tree[u].r=Merge(Tree[u].r,v);
if (Tree[Tree[u].l].Dis<Tree[Tree[u].r].Dis)
Swap(Tree[u].l,Tree[u].r);
Tree[u].Dis=Tree[Tree[u].l].Dis+;
return u;
}
int main()
{
scanf("%lld",&n);
for (LL i=;i<=n;i++) scanf("%lld",&Tree[i].v),Tree[i].l=Tree[i].r=;
for (LL i=;i<=n;i++) Father[i]=i;
scanf("%lld",&m);
for (LL i=;i<=m;i++)
{
char ch=getchar();
while (ch!='M' && ch!='K') ch=getchar();
if (ch=='M')
{
scanf("%lld%lld",&u,&v);
LL fu=Get(u);
LL fv=Get(v);
if (fu==fv || Dead[u] || Dead[v]) continue;
LL Tmp=Merge(fu,fv);
Father[fu]=Father[fv]=Tmp;
}
if (ch=='K')
{
scanf("%lld",&u);
if (Dead[u]) {puts(""); continue;}
LL fu=Get(u); Dead[fu]=true;
printf("%lld\n",Tree[fu].v);
LL Tmp=Merge(Tree[fu].l,Tree[fu].r);
Father[fu]=Tmp;
Father[Tmp]=Tmp;
}
}
return ;
}

BZOJ 1455

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

 #include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int Maxn=;
const int Maxm=;
inline void Get_Int(int &x)
{
x=; register char ch=getchar(); int f=;
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();} x*=f;
}
inline void Put_Int(int x)
{
char ch[]; register int top=;
if (x<) putchar('-'),x=-x;
if (x==) ch[++top]='';
while (x) ch[++top]=x%+'',x/=;
while (top) putchar(ch[top--]); putchar('\n');
}
struct Node {int Sum; Node * l,* r;};
Node Memory[Maxm],*port=Memory,* Root[Maxn],* null;
inline void Init() {null=port++;null->Sum=;null->l=null->r=null;}
inline Node* NewNode(Node * last=NULL)
{
Node * ret=port++;
if (last==NULL) {ret->Sum=; ret->l=ret->r=null;}
else {ret->Sum=last->Sum+; ret->l=last->l; ret->r=last->r;}
return ret;
}
//======================================
int Begin[Maxn],End[Maxn],Dfn[Maxn],head[Maxn];
int cnt,Stamp,u,v,Rank[Maxn],n,C[Maxn],a[Maxn],num;
struct Info{int v,id;}Data[Maxn];
struct EDGE{int to,next;}edge[Maxn<<];
inline bool Cmp(Info A,Info B) {return A.v<B.v;}
inline void Add(int u,int v) {edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}
void Dfs(int u,int fa)
{
Dfn[Begin[u]=++Stamp]=u;
for (int i=head[u];i!=-;i=edge[i].next)
if (edge[i].to!=fa) Dfs(edge[i].to,u);
Dfn[End[u]=++Stamp]=u;
}
Node * Update(int l,int r,Node *x,int v)
{
Node * Ret=NewNode(x);
if (l==r) return Ret;
int mid=(l+r)>>;
if (v<=mid)Ret->l=Update(l,mid,x->l,v); else
Ret->r=Update(mid+,r,x->r,v);
return Ret;
}
void Query(int L,int R,int K)
{
Node * x=Root[L-],*y=Root[R];
int P=,Q=num;
while (P!=Q)
{
int mid=(P+Q)>>;
if (P==Q)
{
printf("%d\n",C[P]);
return;
}
if (y->l->Sum-x->l->Sum<K)
{
K-=(y->l->Sum-x->l->Sum);
x=x->r,y=y->r;
P=mid+;
} else
{
x=x->l,y=y->l;
Q=mid;
}
}
printf("%d\n",C[P]);
return;
}
int main()
{
// freopen("c.in","r",stdin);
scanf("%d",&n); Init(); Root[]=NewNode();
for (int i=;i<=n;i++)
scanf("%d",&a[i]),Data[i].v=a[i],Data[i].id=i;
sort(Data+,Data+n+,Cmp);
for (int i=;i<=n;i++)
C[++num]=Data[i].id,Rank[Data[i].id]=num;
memset(head,-,sizeof(head));
for (int i=;i<n;i++)
{
scanf("%d%d",&u,&v);
Add(u,v),Add(v,u);
}
Dfs(,); for (int i=;i<=Stamp;i++)
Root[i]=Update(,num,Root[i-],Rank[Dfn[i]]);
int m,x,k;
scanf("%d",&m);
for (int i=;i<=m;i++)
{
scanf("%d%d",&x,&k); k=k*;
Query(Begin[x],End[x],k);
}
return ;
}

POJ1803

BZOJ 3364 LCA

 #include <cstdio>
#include <cstring>
const int Maxn=;
struct EDGE{int to,next,w;}edge[Maxn<<];
int head[Maxn],Size[Maxn],Dep[Maxn],Top[Maxn],Dis[Maxn],Fa[Maxn],n,m,u,v,w,cnt,Q;
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++;}
void Dfs1(int u,int fa)
{
Size[u]=;
for (int i=head[u];i!=-;i=edge[i].next)
{
if (edge[i].to==fa) continue;
Dep[edge[i].to]=Dep[u]+; Fa[edge[i].to]=u;
Dis[edge[i].to]=Dis[u]+edge[i].w;
Dfs1(edge[i].to,u);
Size[u]+=Size[edge[i].to];
}
}
void Dfs2(int u,int fa,int chain)
{
int k=; Top[u]=chain;
for (int i=head[u];i!=-;i=edge[i].next)
{
if (edge[i].to==fa) continue;
if (Size[edge[i].to]>Size[k] || k==) k=edge[i].to;
}
if (k==) return;
Dfs2(k,u,chain);
for (int i=head[u];i!=-;i=edge[i].next)
if (edge[i].to!=fa && edge[i].to!=k)
Dfs2(edge[i].to,u,edge[i].to);
}
int Lca(int u,int v)
{
while (true)
{
if (Top[u]==Top[v]) return Dep[u]>Dep[v]?v:u;
if (Dep[Top[u]]>Dep[Top[v]]) u=Fa[Top[u]]; else v=Fa[Top[v]];
}
}
int main()
{
// freopen("c.in","r",stdin);
while (scanf("%d%d",&n,&m)!=EOF)
{
memset(head,-,sizeof(head));
char Str[];
for (int i=;i<=m;i++)
{
scanf("%d%d%d%s",&u,&v,&w,Str);
Add(u,v,w),Add(v,u,w);
}
Dep[]=; Fa[]=; Dis[]=;
Dfs1(,);
Dfs2(,,);
scanf("%d",&Q);
for (int i=;i<=Q;i++)
{
scanf("%d%d",&u,&v);
printf("%d\n",Dis[u]+Dis[v]-*Dis[Lca(u,v)]);
}
}
return ;
}

树链剖分 LCA

 #include <cstdio>
#include <cstring>
const int Maxn=;
struct EDGE{int to,next,w;}edge[Maxn<<];
int head[Maxn],Dep[Maxn],Dis[Maxn],Fa[Maxn][],n,m,u,v,w,cnt,Q;
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++;}
inline void Swap(int &x,int &y){int t=x;x=y;y=t;}
void Dfs(int u,int fa)
{
for (int i=head[u];i!=-;i=edge[i].next)
{
if (edge[i].to==fa) continue;
Dep[edge[i].to]=Dep[u]+; Fa[edge[i].to][]=u;
Dis[edge[i].to]=Dis[u]+edge[i].w;
Dfs(edge[i].to,u);
}
}
inline void Init()
{
for (int i=;i<=;i++)
for (int j=;j<=n;j++) Fa[j][i]=Fa[Fa[j][i-]][i-];
}
inline int Lca(int u,int v)
{
if (Dep[u]>Dep[v]) Swap(u,v);
int Len=Dep[v]-Dep[u];
for (int i=;i<=;i++)
if (Len&(<<i)) v=Fa[v][i];
for (int i=;i>=;i--)
if (Fa[u][i]!=Fa[v][i]) u=Fa[u][i],v=Fa[v][i];
if (u!=v) return Fa[u][];
return u;
}
int main()
{
// freopen("c.in","r",stdin);
while (scanf("%d%d",&n,&m)!=EOF)
{
memset(head,-,sizeof(head));
char Str[];
for (int i=;i<=m;i++)
{
scanf("%d%d%d%s",&u,&v,&w,Str);
Add(u,v,w),Add(v,u,w);
}
Dep[]=; Fa[][]=; Dis[]=;
Dfs(,); Init();
scanf("%d",&Q);
for (int i=;i<=Q;i++)
{
scanf("%d%d",&u,&v);
printf("%d\n",Dis[u]+Dis[v]-*Dis[Lca(u,v)]);
}
}
return ;

倍增 LCA

BZOJ 1699 RMQ

 #include <cstdio>
#include <cmath>
const int Maxn=;
int FMax[Maxn][],FMin[Maxn][],n,q,l,r,x;
inline int Min(int x,int y) {return x>y?y:x;}
inline int Max(int x,int y) {return x>y?x:y;}
inline void Init()
{
for (int i=;i<=;i++)
for (int j=;j+(<<(i-))<=n;j++)
{
FMax[j][i]=Max(FMax[j+(<<(i-))][i-],FMax[j][i-]);
FMin[j][i]=Min(FMin[j+(<<(i-))][i-],FMin[j][i-]);
}
}
inline int Query(int l,int r)
{
int Len=(int)log2(r-l+); return Max(FMax[l][Len],FMax[r-(<<Len)+][Len])-Min(FMin[l][Len],FMin[r-(<<Len)+][Len]);
}
int main()
{
// freopen("c.in","r",stdin);
scanf("%d%d",&n,&q);
for (int i=;i<=n;i++) scanf("%d",&x),FMax[i][]=x,FMin[i][]=x;
Init();
for (int i=;i<=q;i++)
{
scanf("%d%d",&l,&r);
printf("%d\n",Query(l,r));
}
return ;
}

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. Android studio下gradle Robolectric单元测试配置

    android studio下gradle Robolectric单元测试配置 1.Robolectric Robolectric是一个基于junit之上的单元测试框架.它并不依赖于Android提供 ...

  2. MEF的学习笔记

    为什么要使用MEF 在商业应用软件开发过程中,对于各个软件项目,都需要建立相应的系统框架,为了更好的规范系统的开发,提高生产效率,应该在公司级别制定相应的API标准.这些API标准将站在系统架构层次, ...

  3. iOS开发中关于像素的几个概念

    DPI与PPI DPI(Dots Per Inch)是印刷行业中用来度量空间点密度用的,这个值是打印机每英寸可以喷的墨汁点数. 计算机显示设备从打印机中借鉴了DPI的概念,由于计算机显示设备中的原子单 ...

  4. canvas绘图

    1.//获取canvas容器var can = document.getElementById('canvas');//创建一个画布var ctx = can.getContext('2d');2.绘 ...

  5. C#精髓 第四讲 GridView 72般绝技

    http://blog.csdn.net/21aspnet/article/details/1540301

  6. Sql语句复习

    1.两张表A,B 其中A表中字段1,字段2,字段3要迁移到B表中字段4,字段5,字段6,迁移后B表的字段7 全赋值为123: insert into B(字段4,字段5,字段6,字段7) select ...

  7. Office2010与vs2008不兼容导致的一系列问题(vs设计视图打不开,无法启动Asp.Net Development Server)

    vs2008打开aspx文件时设计界面死机的解决 一.突然有一天,在使用vs2008从源视图向设计视图切换时,界面出现了假死现象,重装后亦无效.我从网上搜索原因,发现很多朋友都有类似的问题,但解决方案 ...

  8. Struts2 Result 类型和对应的用法详解

  9. Ajax实现原理

    Ajax的工作 Ajax直觉认识:我们发送一个请求,但是这个请求比较特殊它是异步的,也就是说客户端是不会感觉到的.在发送这个请求的时候我们绑定了一个事件,这个事件会监控我们发送请求的状态,并且每次状态 ...

  10. MongoDB入门

    安装 安装MongoDB 从官网下载 安装 测试连接 启用 安装MongoDB Windows服务 > d:\mongodb\bin>mongod --dbpath "d:\mo ...