NOIP 考前 数据结构复习
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 考前 数据结构复习的更多相关文章
- noip考前模板复习
网络流 Dinic(搭配飞行员) //Serene #include<algorithm> #include<iostream> #include<cstring> ...
- NOIP 考前 队列复习
BZOJ 1127 #include <cstdio> #include <cstring> #include <iostream> #include <al ...
- 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; ...
- NOIP 考前DP 复习
POJ 2533 最长不降子序列 #include <cstdio> ; int a[Maxn],Pos[Maxn],F[Maxn],n,Ans; inline int Max(int x ...
- NOIP 考前 Tarjan复习
POJ 1236 给定一个有向图,求: 1) 至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点 2) 至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点 第一个就是缩点之后有多少 ...
- Noip前的大抱佛脚----Noip真题复习
Noip前的大抱佛脚----Noip真题复习 Tags: Noip前的大抱佛脚 Noip2010 题目不难,但是三个半小时的话要写四道题还是需要码力,不过按照现在的实力应该不出意外可以AK的. 机器翻 ...
- NOIP考前划水
NOIP考前划水 君指先跃动の光は.私の一生不変の信仰に.唯私の超電磁砲永世生き! 要开始背配置了? 3行不谢. (setq c-default-style "awk") (glo ...
- 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 ...
- NOIP考前复习-数制转换,数论模板与文件读写
数制转换有两种题型,一般一题,分值1.5分. 题型一:R进制转十进制 解法就是:按权展开,但要注意各个位的权,最低位(最右边)的权是0次方,权值为1. 纯整数的情况: (11010110)2 = 1× ...
随机推荐
- iOS沙盒(sandbox)
iOS沙盒 每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,默认下iOS应用只能访问自己的沙盒 extenaion是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补 ...
- [原创]WinForm分页控件制作
先简单说一下思路: 1.做一个分页控件的导航类,即记录总页数.当前页.每页记录数,下一页.上一页.跳转等操作的页数变更. class PageNavigation{/// <summary> ...
- Proxy Pattern(Java动态代理和cglib的实现)
代理模式:给某一个对象提供代理对象,由代理对象控制具体对象的引用. 代理,指的就是一个角色对表另一个角色采取行动,就生活中,一个红酒厂商,是不会直接把红酒零销给客户的,都是通过代理完成他的销售业务.而 ...
- php基础_变量和比较符
本人php菜鸟一枚,初读<php和mysql web开发>,把其中的比较基础的一些东西列举出来,方便和自己一样的菜鸟快速入门,并且方便自己以后复习理解. ①变量 1.比较有特色的应该是变量 ...
- pwnable.kr-random
题目 首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数) 表头文件: #include 定义函数 :int ...
- 设立点击ProgressDialog外的区域对话框不消失
设置点击ProgressDialog外的区域对话框不消失ProgressDialog mpDialog = new ProgressDialog(OrderTable.this); mpDialog ...
- linux 系统负载高 如何检查
1:load Average 1.1:什么是Load?什么是Load Average? Load 就是对计算机干活多少的度量(WikiPedia:the system Load is a mea ...
- stm8s103 PWM
stm8s103 PWM的设置不难,但是很多人不注意选项字节这个问题,PWM是IO口的第二功能,要用ST Visual Programmer 修改选项字节. 只需要修改AFR0的功能就可以了
- C#之Lock
lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁. class Program { static void Main(string[] args) { Thre ...
- 关于ssh上传文件
今天用ssh传项目到公司总部的服务器上,报了错误: encountered 1 errors during the transfer 重启ssh再次上传还是一样的错误,然后我让公司那里重启一下服务器, ...