【BZOJ4399】—膜法少女LJJ(线段树合并)
传送门
坑比题面c≤7c\le 7c≤7
考虑到3、43、43、4操作可行的只有平衡树或者权值线段树维护
大力上线段树合并
用并查集维护一下联通块
至于权值积转成对数加就可以了
#include<bits/stdc++.h>
using namespace std;
const int RLEN=1<<21|1;
inline char gc(){static char ibuf[RLEN],*ib,*ob;(ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));return (ib==ob)?EOF:*ib++;
}
inline int read(){char ch=gc();int res=0,f=1;while(!isdigit(ch))f^=ch=='-',ch=gc();while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();return f?res:-res;
}
const int N=400005;
char x;
struct ask{short op;int x,y;
}q[N];
int b[N],fa[N],n,m,cnt,rt[N];
inline int idx(int x){return lower_bound(b+1,b+cnt+1,x)-b;
}
inline int find(int x){return fa[x]==x?fa[x]:fa[x]=find(fa[x]);
}
namespace Seg{int lc[N*18],rc[N*18],siz[N*18],tot;bool cl[N*18];double val[N*18];char y;#define mid ((l+r)>>1)inline void pushup(int u){siz[u]=siz[lc[u]]+siz[rc[u]];val[u]=val[lc[u]]+val[rc[u]];}inline void pushnow(int u){siz[u]=val[u]=0;cl[u]=1;}inline void pushdown(int u){if(!cl[u])return;pushnow(lc[u]);pushnow(rc[u]);cl[u]=0;}void insert(int &u,int l,int r,int p,int si,double k){if(!u)u=++tot;if(l==r){siz[u]=si,val[u]=k;return;}pushdown(u);if(p<=mid)insert(lc[u],l,mid,p,si,k);else insert(rc[u],mid+1,r,p,si,k);pushup(u);}void update(int u,int l,int r,int st,int des){if(!u)return;if(st<=l&&r<=des){pushnow(u);return;}pushdown(u);if(st<=mid)update(lc[u],l,mid,st,des);if(mid<des)update(rc[u],mid+1,r,st,des);pushup(u);}int query(int u,int l,int r,int st,int des){if(!u)return 0;if(st<=l&&r<=des)return siz[u];int res=0;pushdown(u);if(st<=mid)res+=query(lc[u],l,mid,st,des);if(mid<des)res+=query(rc[u],mid+1,r,st,des);pushup(u);return res;}int merge(int r1,int r2,int l,int r){if(!r1||!r2)return r1+r2;val[r1]+=val[r2],siz[r1]+=siz[r2];if(l==r)return r1;pushdown(r1),pushdown(r2);lc[r1]=merge(lc[r1],lc[r2],l,mid);rc[r1]=merge(rc[r1],rc[r2],mid+1,r);pushup(r1);return r1;}inline int askkth(int u,int l,int r,int k){if(l==r)return b[l];pushdown(u);if(siz[lc[u]]>=k)return askkth(lc[u],l,mid,k);else return askkth(rc[u],mid+1,r,k-siz[lc[u]]);}
}
using namespace Seg;
inline void merge(int u,int v){int f1=find(u),f2=find(v);if(f1!=f2)fa[f2]=f1,rt[f1]=merge(rt[f1],rt[f2],1,cnt);
}
int main(){m=read();for(int i=1;i<=m;i++){q[i].op=read(),q[i].x=read();if(q[i].op!=1&&q[i].op!=7)q[i].y=read();if(q[i].op==3||q[i].op==4)b[++cnt]=q[i].y;if(q[i].op==1)b[++cnt]=q[i].x;}sort(b+1,b+cnt+1),cnt=unique(b+1,b+cnt+1)-b-1;for(int i=1;i<=m;i++){switch(q[i].op){case 1:insert(rt[++n],1,cnt,idx(q[i].x),1,log(q[i].x)),fa[n]=n;break;case 2:merge(q[i].x,q[i].y);break;case 3:{int u=find(q[i].x),k=idx(q[i].y);int num=query(rt[u],1,cnt,1,k);update(rt[u],1,cnt,1,k),insert(rt[u],1,cnt,k,num,num*log(q[i].y));break;}case 4:{int u=find(q[i].x),k=idx(q[i].y);int num=query(rt[u],1,cnt,k,cnt);update(rt[u],1,cnt,k,cnt),insert(rt[u],1,cnt,k,num,num*log(q[i].y));break;}case 5:cout<<askkth(rt[find(q[i].x)],1,cnt,q[i].y)<<'\n';break;case 6:cout<<(val[rt[find(q[i].x)]]>val[rt[find(q[i].y)]])<<'\n';break;case 7:cout<<siz[rt[find(q[i].x)]]<<'\n';break;}}
}
【BZOJ4399】—膜法少女LJJ(线段树合并)相关推荐
- BZOJ4399魔法少女LJJ——线段树合并+并查集
题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉 ...
- [BZOJ4399]魔法少女LJJ(线段树合并)
请仔细阅读数据范围,c<=7. 线段树合并裸题,对于乘积大小比较,使用log即可. 1 #include<cmath> 2 #include<cstdio> 3 #inc ...
- bzoj4399 魔法少女LJJ 线段树合并
只看题面绝对做不出系列.... 注意到\(c \leqslant 7\),因此不会有删边操作(那样例删边干嘛) 注意到\(2, 5\)操作十分的有趣,启示我们拿线段树合并来做 操作\(7\)很好处理 ...
- BZOJ 4399: 魔法少女LJJ 线段树合并 + 对数
Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...
- 魔法少女 LJJ——线段树
题目 [题目描述] 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女 LJJ 已经觉得自己见过世界上的所有稀奇古怪的事情了. LJJ 感叹道"这里真是个迷人的绿色世界,空气清新. ...
- 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并
题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉 ...
- BZOJ4399 魔法少女LJJ【线段树合并】【并查集】
Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...
- jzoj3338-[NOI2013模拟]法法塔的奖励【权值线段树,线段树合并】
正题 题目大意 一棵树,对于每个点,求从任何一个在该点的子树为头,以该点为结尾的序列必须选择这个点的最长不降子序列. 解题思路 首先我们使用权值线段树计算答案每个点(l,r,w)(l,r,w)(l,r ...
- jzoj5629 【NOI2018模拟4.4】Map (业界毒瘤仙人掌缩环,线段树合并)
Description Rin是个特别好动的少女. 一天Rin来到了一个遥远的都市.这个都市有N个建筑,编号从1到N,其中市中心编号为1,这个都市有M条双向通行的街道,每条街道连接着两个不同的建筑,其 ...
- 线段树合并与分裂维护树上最长上升子序列 + 点分治删点 ---- 2021 牛客多校第一场 C - Cut the tree(详解)
题目大意: 给你一个树,树上每个点都有一个权值valnodeval_{node}valnode,路径(u,v)(u,v)(u,v) 上所有点按顺序有序序列,令f(u,v)f(u,v)f(u,v)是这 ...
最新文章
- 理解Meta Learning 元学习,这篇文章就够了!
- 灰鸽子敢说自己不是病毒?
- rda冗余分析步骤_分子生态网络分析(MENA)构建微生物网络示例
- 数据解析框架之Gson
- WPF实现聚光灯效果
- 一个超轻量级工作流引擎:Workflow-Core
- intel编译器_Intel编译器编译并行版lammps
- cad显示驱动程序文件已丢失或损坏_win7系统下打开AutoCAD 2014时显示驱动程序文件.hdi丢失如何解决...
- android 课堂讨论内容,Android端课堂交互应用研究与实现
- map Codeforces Round #Pi (Div. 2) C. Geometric Progression
- 有什么PDF转HTML转换器?建议收藏这些转换器
- sql提取身份证号码信息
- 考研加油站系统的设计与实现
- 新年新故事 | Nice 兔 Meet U
- 京东20210618活动脚本
- Android模仿youtube的拖拽视频效果
- Redis--重写机制(减小AOF文件大小)
- web课程设计网页规划与设计----公司官网带轮播图 (页面精美 1页)
- 传说中的100句英语可以帮你背7000单词(zt)
- iot 开源平台thingsboard使用总结