传送门

坑比题面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(线段树合并)相关推荐

  1. BZOJ4399魔法少女LJJ——线段树合并+并查集

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉 ...

  2. [BZOJ4399]魔法少女LJJ(线段树合并)

    请仔细阅读数据范围,c<=7. 线段树合并裸题,对于乘积大小比较,使用log即可. 1 #include<cmath> 2 #include<cstdio> 3 #inc ...

  3. bzoj4399 魔法少女LJJ 线段树合并

    只看题面绝对做不出系列.... 注意到\(c \leqslant 7\),因此不会有删边操作(那样例删边干嘛) 注意到\(2, 5\)操作十分的有趣,启示我们拿线段树合并来做 操作\(7\)很好处理 ...

  4. BZOJ 4399: 魔法少女LJJ 线段树合并 + 对数

    Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...

  5. 魔法少女 LJJ——线段树

    题目 [题目描述] 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女 LJJ 已经觉得自己见过世界上的所有稀奇古怪的事情了. LJJ 感叹道"这里真是个迷人的绿色世界,空气清新. ...

  6. 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉 ...

  7. BZOJ4399 魔法少女LJJ【线段树合并】【并查集】

    Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...

  8. jzoj3338-[NOI2013模拟]法法塔的奖励【权值线段树,线段树合并】

    正题 题目大意 一棵树,对于每个点,求从任何一个在该点的子树为头,以该点为结尾的序列必须选择这个点的最长不降子序列. 解题思路 首先我们使用权值线段树计算答案每个点(l,r,w)(l,r,w)(l,r ...

  9. jzoj5629 【NOI2018模拟4.4】Map (业界毒瘤仙人掌缩环,线段树合并)

    Description Rin是个特别好动的少女. 一天Rin来到了一个遥远的都市.这个都市有N个建筑,编号从1到N,其中市中心编号为1,这个都市有M条双向通行的街道,每条街道连接着两个不同的建筑,其 ...

  10. 线段树合并与分裂维护树上最长上升子序列 + 点分治删点 ---- 2021 牛客多校第一场 C - Cut the tree(详解)

    题目大意: 给你一个树,树上每个点都有一个权值valnodeval_{node}valnode​,路径(u,v)(u,v)(u,v) 上所有点按顺序有序序列,令f(u,v)f(u,v)f(u,v)是这 ...

最新文章

  1. 理解Meta Learning 元学习,这篇文章就够了!
  2. 灰鸽子敢说自己不是病毒?
  3. rda冗余分析步骤_分子生态网络分析(MENA)构建微生物网络示例
  4. 数据解析框架之Gson
  5. WPF实现聚光灯效果
  6. 一个超轻量级工作流引擎:Workflow-Core
  7. intel编译器_Intel编译器编译并行版lammps
  8. cad显示驱动程序文件已丢失或损坏_win7系统下打开AutoCAD 2014时显示驱动程序文件.hdi丢失如何解决...
  9. android 课堂讨论内容,Android端课堂交互应用研究与实现
  10. map Codeforces Round #Pi (Div. 2) C. Geometric Progression
  11. 有什么PDF转HTML转换器?建议收藏这些转换器
  12. sql提取身份证号码信息
  13. 考研加油站系统的设计与实现
  14. 新年新故事 | Nice 兔 Meet U
  15. 京东20210618活动脚本
  16. Android模仿youtube的拖拽视频效果
  17. Redis--重写机制(减小AOF文件大小)
  18. web课程设计网页规划与设计----公司官网带轮播图 (页面精美 1页)
  19. 传说中的100句英语可以帮你背7000单词(zt)
  20. iot 开源平台thingsboard使用总结

热门文章

  1. 世硕电子厂的故事!!测!
  2. 一张纸(5毫米)折叠多少次可以达到珠穆朗玛峰的高度(8848米)?
  3. win10下卜卦占星工具
  4. unity VR中制作小地图的方法
  5. python 捕捉和模拟鼠标键盘操作
  6. springboot 整合工程,不同包中类名相同冲突问题解决
  7. 常用测试软件01——串口调试软件
  8. c语言 main()可否省略,main函数中省略返回语句
  9. Gradle剔除依赖
  10. [京喜]卡红包实现真正0.01买东西