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. CGI,FastCGI,PHP-CGI与PHP-FPM

    CGI CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上. CGI可以用任何一 ...

  2. 课堂作业二 PAT1025 反转链表

    MyGitHub 终于~奔溃了无数次后,看到这个结果 ,感动得不要不要的::>_<:: 题目在这里 题目简述:该题可大致分为 输入链表 -> 链表节点反转 -> 两个步骤 输入 ...

  3. ios基础篇(二十四)—— 文字、图片的绘制及其自定义Button

    这篇文章我们主要来拿官方的控件来研究一下,我们来仿照官方的控件,自己来实现它提供的控件: 首先来看看基本的图片与文字的绘制,很简单. 一.imageView 所有的视图都是继承自UIView,所以我们 ...

  4. 关于vs调试中kaze时出现的问题

    在kaze程序中,调试时,会出现内存释放出现问题,导致调试失败. 解决方法:将主函数所在的源文件中的所有函数中的vector声明的向量都放在主函数外面,成为全局变量,让系统自己释放,再次调试就不会出现 ...

  5. asp.net js获取控件ID

    ClientID是由ASP.Net生成的服务器控件得客户端标识符,当这个控件生成到客户端页面的时候,在客户端代码访问该控件时就需要通过ClientID来访问. 以文本框为例: 一.未使用母版页 js可 ...

  6. WEB安全性测试

    SQL注入   所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQL命令 ...

  7. MYSQL数据库日志和mysqlbinlog相关

    mysql有4种不同的日志,分别是二进制日志,查询日志,慢查询日志和错误日志,这些日记记录着数据库工作的方方面面,可以帮助我们了解数据库的不同方面的踪迹,下面介绍二进制日志的作用和使用方法. 1.二进 ...

  8. Redux教程3:添加倒计时

    前面的教程里面,我们搭建了一个简单红绿灯示例,通过在console输出当面的倒计时时间:由于界面上不能显示倒计时,用户体验并不良好,本节我们就添加一个简单的倒计时改善一下. 作为本系列的最后一篇文章, ...

  9. Java冒泡随笔

    package homework; import java.util.Scanner; public class ArraySort { /** * @param args */ public sta ...

  10. Linux学习 :移植linux-4.7.4到JZ2440开发板

    一.编译环境搭建: 1.linux源码下载:https://www.kernel.org/2.安装交叉编译工具链: ①手动下载配置工具链: (1):解压 arm-linux-gcc-3.4.1.tar ...