【BZOJ 3545】【ONTAK 2010】Peaks & 【BZOJ 3551】【ONTAK 2010】Peaks加强版 Kruskal重构树
sunshine的A题我竟然调了一周!!!
把循环dfs改成一个dfs就可以,,,我也不知道为什么这样就不会RE,但它却是A了,,,
这周我一直在调这个题,总结一下智障错误:
1.倍增的范围设成了n而不是n*2-1,,,
2.重构树的顶点是n*2-1,而我一开始设成了n,,,
3.define里的for3和for4的i--打成i++,,,,,,,,,,,,
4.dfs爆栈了,找CA爷问的编译命令里手动扩栈,真是愚蠢的问题,,,,
比赛时绝不会有太多时间,在这么犯逗就得滚粗了QAQ
3545:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define for1(i,a,n) for(int i=(a);i<=(n);i++)
#define for2(i,a,n) for(int i=(a);i<(n);i++)
#define for3(i,a,n) for(int i=(a);i>=(n);i--)
#define for4(i,a,n) for(int i=(a);i>(n);i--)
#define CC(i,a) memset(i,a,sizeof(i));
#define read(x) x=getint()
using namespace std;
inline const int getint(){char c=getchar();int k=1,r=0;for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;}
inline const int max(const int &a,const int &b){return a>b?a:b;}
inline const int min(const int &a,const int &b){return a<b?a:b;}
const int N=1E5+10;
const int M=5*1E5+10;
struct node{int x,y,z;}E[M];
struct snnn{int l,r,s;}T[N*30];
int n,m,fa[N<<1],num[N<<1],HH[N],id[N],H[N],cnt,f[N<<1][20];
int root[N],L[N<<1],R[N<<1],lch[N<<1],rch[N<<1],ST[N];
inline bool cmp(node X,node Y){return X.z<Y.z;}
inline bool cmp2(int X,int Y){return HH[X]<HH[Y];}
inline void init(){CC(fa,0);CC(num,0);CC(HH,0);CC(id,0);CC(H,0);CC(f,0);CC(root,0);CC(L,0);CC(R,0);CC(lch,0);CC(rch,0);CC(ST,0);}
inline int find(int x){
if (x==fa[x]) return x;
else{fa[x]=find(fa[x]);return fa[x];}
}
inline void LCA(int dd){
for1(j,1,19)
for1(i,1,dd)
f[i][j]=f[f[i][j-1]][j-1];
}
inline void dfs(int x){
if (lch[x]&&rch[x]){
L[x]=cnt+1;
dfs(lch[x]);
dfs(rch[x]);
R[x]=cnt;
}else{
cnt++; ST[cnt]=x;
L[x]=cnt; R[x]=cnt;
}
}
inline void update(int l,int r,int &pos,int key){
T[++cnt]=T[pos]; pos=cnt; T[pos].s++;
if (l==r) return;
int mid=(l+r)>>1;
if (key<=mid) update(l,mid,T[pos].l,key); else update(mid+1,r,T[pos].r,key);
}
inline int LCA_find(int x,int y){
for3(i,19,0)
if ((f[x][i]!=0)&&(num[f[x][i]]<=y))
x=f[x][i];
return x;
}
inline int query(int LL,int RR,int key){
int mid,s,x=root[LL],y=root[RR],l=1,r=n;
while (l<r){
mid=(l+r)>>1; s=T[T[y].l].s-T[T[x].l].s;
if (key<=s) r=mid,x=T[x].l,y=T[y].l;
else l=mid+1,key-=s,x=T[x].r,y=T[y].r;
}return l;
}
int main(){
init();
read(n); read(m); int Q; read(Q);
for1(i,1,n) read(HH[i]),id[i]=i;
sort(id+1,id+n+1,cmp2);
for1(i,1,n) H[id[i]]=i;
for1(i,1,m){read(E[i].x);read(E[i].y);read(E[i].z);}
sort(E+1,E+m+1,cmp);
cnt=n+1;
for2(i,1,n<<1) fa[i]=i;
for1(i,1,m){
int fx=find(E[i].x),fy=find(E[i].y);
if (fx!=fy){
fa[fx]=cnt; fa[fy]=cnt;
f[fx][0]=cnt; f[fy][0]=cnt;
lch[cnt]=fx; rch[cnt]=fy;
num[cnt]=E[i].z;
cnt++;
if (cnt>((n<<1)-1)) break;
}
}
int dd=cnt-1;
LCA(dd);
cnt=0;
//for2(i,1,n<<1) if (L[i]==0) dfs(find(i));
dfs(dd);
cnt=0;
for1(i,1,n){
root[i]=root[i-1];
update(1,n,root[i],H[ST[i]]);
}
int a,b,c,la=0;
for1(i,1,Q){
read(a); read(b); read(c);
//a^=la; b^=la; c^=la;
int rt=LCA_find(a,b),nn;
if (R[rt]-L[rt]+1<c) nn=-1;
else nn=HH[id[query(L[rt]-1,R[rt],R[rt]-L[rt]+2-c)]],la=nn;
printf("%d\n",nn);
}
return 0;
}
3551:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define for1(i,a,n) for(int i=(a);i<=(n);i++)
#define for2(i,a,n) for(int i=(a);i<(n);i++)
#define for3(i,a,n) for(int i=(a);i>=(n);i--)
#define for4(i,a,n) for(int i=(a);i>(n);i--)
#define CC(i,a) memset(i,a,sizeof(i));
#define read(x) x=getint()
using namespace std;
inline const int getint(){char c=getchar();int k=1,r=0;for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;}
inline const int max(const int &a,const int &b){return a>b?a:b;}
inline const int min(const int &a,const int &b){return a<b?a:b;}
const int N=1E5+10;
const int M=5*1E5+10;
struct node{int x,y,z;}E[M];
struct snnn{int l,r,s;}T[N*30];
int n,m,fa[N<<1],num[N<<1],HH[N],id[N],H[N],cnt,f[N<<1][20];
int root[N],L[N<<1],R[N<<1],lch[N<<1],rch[N<<1],ST[N];
inline bool cmp(node X,node Y){return X.z<Y.z;}
inline bool cmp2(int X,int Y){return HH[X]<HH[Y];}
inline void init(){CC(fa,0);CC(num,0);CC(HH,0);CC(id,0);CC(H,0);CC(f,0);CC(root,0);CC(L,0);CC(R,0);CC(lch,0);CC(rch,0);CC(ST,0);}
inline int find(int x){
if (x==fa[x]) return x;
else{fa[x]=find(fa[x]);return fa[x];}
}
inline void LCA(int dd){
for1(j,1,19)
for1(i,1,dd)
f[i][j]=f[f[i][j-1]][j-1];
}
inline void dfs(int x){
if (lch[x]&&rch[x]){
L[x]=cnt+1;
dfs(lch[x]);
dfs(rch[x]);
R[x]=cnt;
}else{
cnt++; ST[cnt]=x;
L[x]=cnt; R[x]=cnt;
}
}
inline void update(int l,int r,int &pos,int key){
T[++cnt]=T[pos]; pos=cnt; T[pos].s++;
if (l==r) return;
int mid=(l+r)>>1;
if (key<=mid) update(l,mid,T[pos].l,key); else update(mid+1,r,T[pos].r,key);
}
inline int LCA_find(int x,int y){
for3(i,19,0)
if ((f[x][i]!=0)&&(num[f[x][i]]<=y))
x=f[x][i];
return x;
}
inline int query(int LL,int RR,int key){
int mid,s,x=root[LL],y=root[RR],l=1,r=n;
while (l<r){
mid=(l+r)>>1; s=T[T[y].l].s-T[T[x].l].s;
if (key<=s) r=mid,x=T[x].l,y=T[y].l;
else l=mid+1,key-=s,x=T[x].r,y=T[y].r;
}return l;
}
int main(){
init();
read(n); read(m); int Q; read(Q);
for1(i,1,n) read(HH[i]),id[i]=i;
sort(id+1,id+n+1,cmp2);
for1(i,1,n) H[id[i]]=i;
for1(i,1,m){read(E[i].x);read(E[i].y);read(E[i].z);}
sort(E+1,E+m+1,cmp);
cnt=n+1;
for2(i,1,n<<1) fa[i]=i;
for1(i,1,m){
int fx=find(E[i].x),fy=find(E[i].y);
if (fx!=fy){
fa[fx]=cnt; fa[fy]=cnt;
f[fx][0]=cnt; f[fy][0]=cnt;
lch[cnt]=fx; rch[cnt]=fy;
num[cnt]=E[i].z;
cnt++;
if (cnt>((n<<1)-1)) break;
}
}
int dd=cnt-1;
LCA(dd);
cnt=0;
//for2(i,1,n<<1) if (L[i]==0) dfs(find(i));
dfs(dd);
cnt=0;
for1(i,1,n){
root[i]=root[i-1];
update(1,n,root[i],H[ST[i]]);
}
int a,b,c,la=0;
for1(i,1,Q){
read(a); read(b); read(c);
a^=la; b^=la; c^=la;
int rt=LCA_find(a,b),nn;
if (R[rt]-L[rt]+1<c) nn=-1,la=0;
else nn=HH[id[query(L[rt]-1,R[rt],R[rt]-L[rt]+2-c)]],la=nn;
printf("%d\n",nn);
}
return 0;
}
然后就可以了O(∩_∩)O~~
【BZOJ 3545】【ONTAK 2010】Peaks & 【BZOJ 3551】【ONTAK 2010】Peaks加强版 Kruskal重构树的更多相关文章
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
- [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)
3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2438 Solved: 763[Submit][ ...
- BZOJ3551 Peaks加强版 [Kruskal重构树,主席树]
BZOJ 思路 我觉得这题可持久化线段树合并也可以做 我觉得这题建出最小生成树之后动态点分治+线段树也可以做 还是学习一下Kruskal重构树吧-- Kruskal重构树,就是在做最小生成树的时候,如 ...
- BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)
题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. 强制在线. \ ...
- 【BZOJ 3551】[ONTAK2010] Peaks加强版 Kruskal重构树+树上倍增+主席树
这题真刺激...... I.关于Kruskal重构树,我只能开门了,不过补充一下那玩意还是一棵满二叉树.(看一下内容之前请先进门坐一坐) II.原来只是用树上倍增求Lca,但其实树上倍增是一种方法,L ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 Kruskal重构树+dfs序+主席树+倍增
建出来 $Kruskal$ 重构树. 将询问点向上跳到深度最小,且合法的节点上. 那么,得益于重构树优美的性质,这个最终跳到的点为根的所有子节点都可以与询问点互达. 对于子树中求点权第 $k$ 大的问 ...
- bzoj 3551 kruskal重构树dfs序上的主席树
强制在线 kruskal重构树,每两点间的最大边权即为其lca的点权. 倍增找,dfs序对应区间搞主席树 #include<cstdio> #include<cstring> ...
- 【BZOJ 3732】 Network Kruskal重构树+倍增LCA
Kruskal重构树裸题, Sunshine互测的A题就是Kruskal重构树,我通过互测了解到了这个神奇的东西... 理解起来应该没什么难度吧,但是我的Peaks连WA,,, 省选估计要滚粗了TwT ...
随机推荐
- MIT jos 6.828 Fall 2014 训练记录(lab 1)
注: 源代码参见我的github:https://github.com/YaoZengzeng/jos Part 1: PC Bootstrap +------------------+ <- ...
- Android 多线程----AsyncTask异步任务详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- JMeter学习(五)检查点
JMeter也有像LR中的检查点,本篇就来介绍下JMeter的检查点如何去实现. JMeter里面的检查点通过添加断言来完成. 检查点:上一章讲到,我们对用户名和密码进行了参数化,那么怎样来判断jme ...
- linux下批量替换文件内容
1.网络上现成的资料 格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径` linux sed 批量替换多个文件中的字符串: (此命令很强大) ...
- 用yo命令创建项目
1,npm install -g yo 安装yeoman 2,npm install -g generator-webapp 安装项目脚手架(生成器) 如果安装angular的项目后面则是genera ...
- 内联(行级)元素不能设置margin-top
内联(行级)元素 不能设置宽高,但padding属性可以设置,需要注意的是行级元素不能设置margin-top和margin-bottom属性,但可以设置margin-left和margin-righ ...
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(安装Windows虚拟机)-(4)
一.背景说明 在之前的篇章中,提到在webvirtmgr里安装linux系统的vm,下面说下安装windows系统虚拟机的操作记录: 由于KVM管理虚拟机的硬盘和网卡需要virtio驱动,linux ...
- 大话redis/memcache缓存
通常情况下,随着业务量增加,对后端数据库的访问压力也会随之加大.当数据库访问压力渐渐增大时,除了升级数据库配置提高数据库本身的抗压能力外,我们也可以采用在应用服务器与数据库服务器之间架设数据库缓存服务 ...
- Java 操作 Redis 高级
/Users/sherry/WorkPath/Git/Web/redisDemo/src/main/java/org/zln/utils/JedisUtils.java package org.zln ...
- BPM到底能做什么?K2为你解读
和平镇,镇如其名,几百年来一直很和平,夜不闭户路不拾遗.可是这一年来,镇上金光寺的和尚却开始不断离奇死亡…… 衙门里新调来的李捕头正好负责这个案子,经过了几个月的不眠不休,现场侦查和缜密推理之后,一切 ...