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

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

对于操作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. Can't connect to local MySQL Server throught socket '/var/run/mysqld/mysqld.sock'(2)

    www.iwangzheng.com 由于之前调整了/etc/mysql/my.cnf试图修复数据库不能存中文的问题,这个问题没解决,以至于数据库连接不上了. tail -f /var/log/mys ...

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

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

  3. (转)女生应该找一个玩ACM的男生

    1.强烈的事业心 将来,他也一定会有自己热爱的事业.而且,男人最性感的时刻之一,就是他专心致志做事的时候.所以,找一个机会在他全神贯注玩ACM的时候,从侧面好好观察他,你就会发现我说的话没错. 2.永 ...

  4. Linux 日志文件utmp、wtmp、lastlog、messages

            1.有关当前登录用户的信息记录在文件utmp中:==who命令 2.登录进入和退出纪录在文件wtmp中:==w命令 3.最后一次登录文件可以用lastlog命令察看: 4.messag ...

  5. MySQL之扩展(触发器,存储过程等)

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( SEL ...

  6. iOS8 UILocalNotification 和 UIRemoteNotification 使用注意 草稿,正在整理中。。。。

    先说一个关于UILocalNotification的知识点,容易被忘记: Each app on a device is limited to 64 scheduled local notificat ...

  7. codeforces C. Arithmetic Progression 解题报告

    题目链接:http://codeforces.com/problemset/problem/382/C 题目意思:给定一个序列,问是否可以通过只插入一个数来使得整个序列成为等差数列,求出总共有多少可能 ...

  8. CodeForces - 417A(思维题)

    Elimination Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit  ...

  9. Powershell 批量替换文件

    Powershell 批量替换文件 ##作者:Xiongpq ##时间:2015-06-10 18:50 ##版本:2.0 ##源文件目录 ##源文件目录的所有文件都会覆盖目标目录的同名文件,源文件目 ...

  10. Linux内核NAPI机制分析

    转自:http://blog.chinaunix.net/uid-17150-id-2824051.html 简介:NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用 ...