4399: 魔法少女LJJ

Time Limit: 20 Sec Memory Limit: 162 MB
Submit: 287 Solved: 73

Description

在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了
LJJ感叹道“这里真是个迷人的绿色世界,空气清新、淡雅,到处散发着醉人的奶浆味;小猴在枝头悠来荡去,好不自在;各式各样的鲜花争相开放,各种树枝的枝头挂满沉甸甸的野果;鸟儿的歌声婉转动听,小河里飘着落下的花瓣真是人间仙境”
SHY觉得LJJ还是太naive,一天,SHY带着自己心爱的图找到LJJ,对LJJ说:“既然你已经见识过动态树,动态仙人掌了,那么今天就来见识一下动态图吧”
LJJ:“要支持什么操作?”
SHY:“
1.新建一个节点,权值为x。
2.连接两个节点。
3.将一个节点a所属于的联通快内权值小于x的所有节点权值变成x。
4.将一个节点a所属于的联通快内权值大于x的所有节点权值变成x。
5.询问一个节点a所属于的联通块内的第k小的权值是多少。
6.询问一个节点a所属联通快内所有节点权值之积与另一个节点b所属联通快内所有节点权值之积的大小。
7.询问a所在联通快内节点的数量
8.若两个节点a,b直接相连,将这条边断开。
9.若节点a存在,将这个点删去。

LJJ:“我可以离线吗?”
SHY:“可以,每次操作是不加密的,”
LJJ:“我可以暴力吗?”
SHY:“自重”
LJJ很郁闷,你能帮帮他吗

Input

第一行有一个正整数m,表示操作个数。
接下来m行,每行先给出1个正整数c。
若c=1,之后一个正整数x,表示新建一个权值为x的节点,并且节点编号为n+1(当前有n个节点)。
若c=2,之后两个正整数a,b,表示在a,b之间连接一条边。
若c=3,之后两个正整数a,x,表示a联通快内原本权值小于x的节点全部变成x。
若c=4,之后两个正整数a,x,表示a联通快内原本权值大于x的节点全部变成x。
若c=5,之后两个正整数a,k,表示询问a所属于的联通块内的第k小的权值是多少。
若c=6,之后两个正整数a,b,表示询问a所属联通快内所有节点权值之积与b所属联通快内所有节点权值之积的大小,
若a所属联通快内所有节点权值之积大于b所属联通快内所有节点权值之积,输出1,否则为0。
若c=7,之后一个正整数a,表示询问a所在联通块大小
若c=8,之后两个正整数a,b,表示断开a,b所连接的边。
若c=9,之后一个正整数a,表示断开a点的所有连边
具体输出格式见样例

Output

Sample Input

12

1 2

1 3

1 4

1 5

1 6

2 1 2

2 2 3

2 3 4

2 4 5

9 1

3 2 5

5 3 4
Sample Output

6
HINT

对100%的数据 0<=m<=400000,c<=7,所有出现的数均<=1000000000,所有出现的点保证存在

【HINT】请认真阅读题面

Source

By liuchenrui

/**************************************************************Problem: 4399User: Twi_etnLanguage: C++Result: Compile_Error
****************************************************************/
// from: Claris
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=400010,M=7000000;
int i,x,y,op[N][3],b[N],U,fa[N],T[N],cnt,n,m;
int tot,l[M],r[M],v[M];double s[M],L[N];
int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int find(int x){return fa[x]==x ? x : fa[x]=find(fa[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 int lower(int x){int l=1,r=U,mid,t;while(l<=r){mid=(l+r)>>1;if(b[mid]<=x)l=mid+1,t=mid;else r=mid-1;}return t;
}
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;
}
int K_TH(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(){m=read();for(int i=1;i<=m;i++){op[i][0]=read();op[i][1]=read();if(op[i][0]>1&&op[i][0]<7)op[i][2]=read();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(int i=1;i<=U;i++)L[i]=log(b[i]);for(int i=1;i<=m;i++){int x=op[i][1],y=op[i][2];if(op[i][0]==1){x=lower(x),n++;fa[n]=n;Ins(T[n],1,U,x,1,L[x]);}if(op[i][0]==2){x=find(x),y=find(y);if(x==y) continue;fa[x]=y;T[fa[x]]=Merge(T[x],T[y],1,U);}if(op[i][0]==3){x=find(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=find(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[K_TH(T[find(x)],y)]);if(op[i][0]==6)puts(s[T[find(x)]]>s[T[find(y)]]?"1":"0");if(op[i][0]==7)printf("%d\n",v[T[find(x)]]);}return 0;
}

BZOJ 4399: 魔法少女LJJ相关推荐

  1. bzoj 4399 魔法少女LJJ

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

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

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

  3. 4399: 魔法少女LJJ

    注意他这个题的题面傻逼.实际上只有7种操作.可以发现是道裸的线段树合并.只是那个乘积会爆,要取log. #include<cstdio> #include<iostream> ...

  4. bzoj4399 魔法少女LJJ

    这题不愧为4399. 4399: 魔法少女LJJ Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 622  Solved: 145 [Submit][ ...

  5. 【BZOJ 4399】魔法少女LJJ

    [题目] 传送门 题目描述: 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女 LJJ 已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ 感叹道"""这里 ...

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

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

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

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

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

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

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

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

最新文章

  1. Windows Server 2003 AD升级到Windows Server 2008 AD的方法及详细步骤
  2. “cyl projection cannot cross pole” 解决方法
  3. Java监听器用法(三):外部类监听器
  4. Xen虚拟机迁移技术
  5. 【工程化】从0搭建VueJS移动端组件库开发框架
  6. Cus系统beta1.2发布
  7. 使用Select.HtmlToPdf 把html内容生成pdf文件
  8. 年轻人还有机会征服这个世界吗?
  9. 用了这么久的数据库连接池,你知道原理吗?
  10. python3 将列表中元素转化为字典_软件测试学Python(七):Python中的变量和标准数据类型...
  11. python selenium 元素定位总结(转载)
  12. java:单例模式的五种实现方式
  13. Prometheus 结合cAdvisor、AlertManager、node-exporter 监控容器并实现邮箱告警
  14. 《站在两个世界的边缘》 程浩,一个认真生活过的人
  15. android后台进程数目限制
  16. Android中具有动画效果的图片资源
  17. 正睿OI DAY12 ks5
  18. php生成随机小数保留一位,php生成0~1随机小数的方法(必看)
  19. neu坐标系和xyz坐标系转换_航测必知的坐标系详解和转换关系
  20. windows11 第三方 截图工具对比

热门文章

  1. 3、HTTP请求头与响应头
  2. java usb摄像头_Android中多USB摄像头解决方案——UVCCamera源码分析(一)
  3. 基于vue商品图片轮播和放大镜的方案
  4. Unity安卓打包设置项目名称为中文名
  5. java和前端哪个好学_前端好学还是Java好学?
  6. MAC压缩的文件在win下减压出来是空文件夹
  7. Django 快速搭建博客 第十一节(文章阅读量统计,自动生成文章摘要)
  8. xwiki功能-皮肤
  9. 用 Python 的 tkinter 模块编写一个好看又强大的中国象棋
  10. 防止记录丢失,保存QQ聊天记录文件的方法