将所有权值离散化,建立权值线段树,维护区间内数字个数以及对数的和,用于比较乘积大小。

对于每个连通块维护一棵权值线段树,合并时用线段树合并。

对于操作3和4,暴力删除所有不合法节点,然后一并修改后插入线段树即可。

时间复杂度$O(m\log m)$。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=400010,M=7000000;
int n,m,i,x,y,op[N][3],b[N],U,f[N],T[N],cnt;
int tot,l[M],r[M],v[M];double s[M],L[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline int lower(int x){
int l=1,r=U,mid,t;
while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
int F(int x){return f[x]==x?x:f[x]=F(f[x]);}
void ins(int&x,int a,int b,int c,int d,double e){
if(!x)x=++tot;
v[x]+=d,s[x]+=e;
if(a==b)return;
int mid=(a+b)>>1;
if(c<=mid)ins(l[x],a,mid,c,d,e);else ins(r[x],mid+1,b,c,d,e);
}
inline void up(int x){
v[x]=v[l[x]]+v[r[x]];
s[x]=s[l[x]]+s[r[x]];
}
void del(int x,int a,int b,int c,int d){
if(!v[x])return;
if(a==b){
cnt+=v[x],v[x]=0,s[x]=0;
return;
}
int mid=(a+b)>>1;
if(c<=mid)del(l[x],a,mid,c,d);
if(d>mid)del(r[x],mid+1,b,c,d);
up(x);
}
int merge(int x,int y,int a,int b){
if(!x)return y;
if(!y)return x;
if(a==b){
v[x]+=v[y];
s[x]+=s[y];
return x;
}
int mid=(a+b)>>1;
l[x]=merge(l[x],l[y],a,mid);
r[x]=merge(r[x],r[y],mid+1,b);
return up(x),x;
}
inline int kth(int x,int k){
int a=1,b=U,mid;
while(a<b){
mid=(a+b)>>1;
if(v[l[x]]>=k)b=mid,x=l[x];else k-=v[l[x]],a=mid+1,x=r[x];
}
return a;
}
int main(){
read(m);
for(i=1;i<=m;i++){
read(op[i][0]),read(op[i][1]);
if(op[i][0]>1&&op[i][0]<7)read(op[i][2]);
if(op[i][0]==1)b[++U]=op[i][1];
if(op[i][0]==3||op[i][0]==4)b[++U]=op[i][2];
}
sort(b+1,b+U+1);
for(i=1;i<=U;i++)L[i]=log(b[i]);
for(i=1;i<=m;i++){
x=op[i][1],y=op[i][2];
if(op[i][0]==1){
x=lower(x),n++;
f[n]=n,ins(T[n],1,U,x,1,L[x]);
}
if(op[i][0]==2){
x=F(x),y=F(y);
if(x==y)continue;
T[f[x]=y]=merge(T[x],T[y],1,U);
}
if(op[i][0]==3){
x=F(x),y=lower(y),cnt=0;
if(y>1)del(T[x],1,U,1,y-1);
if(cnt)ins(T[x],1,U,y,cnt,L[y]*cnt);
}
if(op[i][0]==4){
x=F(x),y=lower(y),cnt=0;
if(y<U)del(T[x],1,U,y+1,U);
if(cnt)ins(T[x],1,U,y,cnt,L[y]*cnt);
}
if(op[i][0]==5)printf("%d\n",b[kth(T[F(x)],y)]);
if(op[i][0]==6)puts(s[T[F(x)]]>s[T[F(y)]]?"1":"0");
if(op[i][0]==7)printf("%d\n",v[T[F(x)]]);
}
return 0;
}

  

BZOJ4399 : 魔法少女LJJ的更多相关文章

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

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

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

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

  3. BZOJ4399 魔法少女LJJ(线段树合并)

    注意到只有增加点/合并的操作.这些操作都可以用线段树完成,于是线段树合并一发就好了.注意乘积大小直接比较肯定会炸,取个对数即可.数据中存在重边. #include<iostream> #i ...

  4. 2019.01.16 bzoj4399: 魔法少女LJJ(线段树合并)

    传送门 线段树合并菜题(然而findfindfind函数写错位置调了好久) 支持的操作题目写的很清楚了,然后有一个神奇的限制c≤7c\le7c≤7要注意到不然会去想毒瘤线段树的做法. 思路: 这题只有 ...

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

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

  6. bzoj4399 魔法少女LJJ 线段树合并+线段树二分+并查集

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4399 题解 毒瘤题 \(9\) 种操作还有支持动态图的连通性 仔细读题 $ c<=7$. ...

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

    [BZOJ4399]魔法少女LJJ Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的 ...

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

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

  9. bzoj 4399 魔法少女LJJ

    4399: 魔法少女LJJ Time Limit: 20 Sec  Memory Limit: 162 MBhttp://www.lydsy.com/JudgeOnline/problem.php?i ...

随机推荐

  1. Unity3D研究院之Jenkins的使用(七十八)

    长夜漫漫无心睡眠,来一篇嘿嘿.我相信如果已经用Shell脚本完成IOS和Android打包的朋友一定需要Jenkins 怎么才能让策划打包ipa和apk?怎么才能彻底省去程序的时间,只要在同一局域网内 ...

  2. MyBatis多数据源配置(读写分离)

    原文:http://blog.csdn.net/isea533/article/details/46815385 MyBatis多数据源配置(读写分离) 首先说明,本文的配置使用的最直接的方式,实际用 ...

  3. DCMTK开源库的学习笔记4:利用ini配置文件对dcm影像进行归档

    转:http://blog.csdn.net/zssureqh/article/details/8846337 背景介绍: 医学影像PACS工作站的服务端需要对大量的dcm文件进行归档,写入数据库处理 ...

  4. FZU 1649 Prime number or not米勒拉宾大素数判定方法。

    C - Prime number or not Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  5. intellij idea 如何更改编辑器文本字体和大小

    换上了intellij idea之后,第一件事就是想要改变下文字字体,因为在我这个27寸的2k分辨率的屏幕上,文字显然太小了. intellij idea字体设值分成两部分,一部分是UI部分字体字号设 ...

  6. Mobile first! Wijmo 5 + Ionic Framework之:Hello World!

    本教程中,我们用Wijmo 5 和 Ionic Framework实现一个Mobile的工程:Hello World. Ionic是什么? Ionic是一个HTML5框架.免费.开源,用于帮助生成hy ...

  7. HDU 5512 Pagodas (gcd)

    题目:传送门. 题意:t组数据,每组数据给定n,a,b,a!=b,在[1,n]的这些点中,每次选取a+b或a-b或b-a点,选取过的点在下次选取的时候可以当做ab来用继续选取,谁不能继续选取谁就输,问 ...

  8. 案例(JQuery的ajax无刷新评论)

    CommentsTest.html代码: <head> <meta http-equiv="Content-Type" content="text/ht ...

  9. LINUX调优

    一.Linux系统调优及安全设置 系统安装安全最小化原则说明 ◆安装linux系统最小化,即选包最小化,yum安装软件最小化. ◆开机自启动程序服务最小化,即无用的服务不开启. ◆操作命令最小化原则, ...

  10. Codeforces Round #321 (Div. 2)C(tree dfs)

    题意:给出一棵树,共有n个节点,其中根节点是Kefa的家,叶子是restaurant,a[i]....a[n]表示i节点是否有猫,问:Kefa要去restaurant并且不能连续经过m个有猫的节点有多 ...