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× ...
随机推荐
- 张艾迪(创始人): 整合全新的UIW.AD概念
The World No.1 Girl :Eidyzhang The World No.1 Internet Girl :Eidyzhang AOOOiA.global Founder :Eidyzh ...
- perl基础:传递hash类型参数
1 如果是只有一个参数要传,且是hash,最直接想到的办法就是像传其他类型参数一样直接传, 如: subFuntion(%hash1); 2 如果有多于一个参数要传,这里假设只有一个参数的类型是h ...
- C#中Cookie的概述及应用
1.Cookie简介 Cookie 提供了一种在 Web 应用程序中存储用户特定信息的方法.例如,当用户访问您的站点时,您可以使用 Cookie 存储用户首选项或其他信息.当该用户再次访问您的网站时, ...
- css3过渡
语法格式: transition:属性名 完成时间 速度曲线 何时开始 transition:width 2s ease-in 3s: width 2s 整个过渡效果持续的时间 ease-in 指定了 ...
- html、css基础注意点
之前第一次接触html,一直使用table进行布局,十分麻烦还相当丑陋,造成当初并没有多大的兴趣,直到半年前开始接触到了使用div+css编写页面,才对它有了兴趣.作为一个菜鸟记录自己的点滴教训与收获 ...
- win7系统 .chm文件打不开的解决办法
一.正确操作方法1.鼠标右键单击该CHM文件,在右键快捷窗口中选择“打开方式”-“Microsoft HTML Help Executable”:2.如果出现一个提示窗口,大意是说,该CHM文件的发行 ...
- MRPT笔记——使用编译好的MRPT库建立VS2013项目
接着上一篇<MRPT在VS2013中的配置>,下面接收如何使用编译好的MRPT建立工程项目. 一.设置环境变量 上一篇中,配置MRPT时,使用到了几个相关库,opencv.zlib.wxW ...
- #Deep Learning回顾#之2006年的Science Paper
大家都清楚神经网络在上个世纪七八十年代是着实火过一回的,尤其是后向传播BP算法出来之后,但90年代后被SVM之类抢了风头,再后来大家更熟悉的是SVM.AdaBoost.随机森林.GBDT.LR.FTR ...
- 快速加载DXF、DWG格式文件控件ABViewer
ABViewer是一种高品质,低成本,高效率的多功能设计及工程文档管理应用程序. ABViewer为您提供专业的cad文件浏览和编辑工具. 支持多种格式,如:DWG格式, DXF, DWF, Hewl ...
- Linux 命令 find
find命令的基本格式是:find [路径] [选项] [操作]路径是find命令所查找的范围,如用.来表示当前目录,用/来表示根目录,选项用于指定查找条件,如:可以指定按照文件的属主,更改时间文件类 ...