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

这是一道语文题 + 高中数学题.
这里最困难的是第 $6$ 问,询问两个联通快乘积的大小关系.
显然不可以直接乘起来 (你想写高精度也行).
高中数学告诉我们,$log_{x}(a\times b)=log_{x}(a)+log_{x}(b)$,而 $log_{x}$ 在 $x>=1$ 时是增函数.
所以只需比较区间 $\sum log$ 的大小就可以比较出乘积的大小.
这个方法还真是听巧妙的.

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define ls lson[x]
#define rs rson[x]
#define setIO(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
const int maxn=500000;
const int N=1000000000;
namespace IO {
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd() {
int x=0;
char c=nc();
while(c<48) c=nc();
while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc();
return x;
}
};
struct UFS {
int p[maxn];
void init() {
for(int i=0;i<maxn;++i) p[i]=i;
}
int find(int x) {
return p[x]==x?x:p[x]=find(p[x]);
}
}tr;
int cnt;
int rt[maxn],lson[maxn*10],rson[maxn*10],num[maxn*10];
double de[maxn*10];
int newnode() {
return ++cnt;
}
void pushup(int x) {
num[x]=num[ls]+num[rs];
de[x]=de[ls]+de[rs];
}
void update(int &x,int l,int r,int p,int v) {
if(!x)x=newnode();
if(l==r) {
num[x]+=v, de[x]+=(double)v*(double)(log(p));
return;
}
int mid=(l+r)>>1;
if(p<=mid) update(ls,l,mid,p,v);
else update(rs,mid+1,r,p,v);
pushup(x);
}
int merge(int x,int y) {
if(!x||!y) return x+y;
num[x]+=num[y];
de[x]+=de[y];
lson[x]=merge(lson[x],lson[y]);
rson[x]=merge(rson[x],rson[y]);
return x;
}
int less(int &x,int l,int r,int k) {
if(!x||l>=k) return 0;
int re=0;
if(r<k) {
re=num[x],x=0;
return re;
}
if(l==r) return 0;
int mid=(l+r)>>1;
re+=less(ls,l,mid,k);
re+=less(rs,mid+1,r,k);
pushup(x);
return re;
}
int bigger(int &x,int l,int r,int k) {
if(!x||r<=k) return 0;
int re=0;
if(l>k) {
re=num[x],x=0;
return re;
}
if(l==r) return 0;
int mid=(l+r)>>1;
re+=bigger(ls,l,mid,k);
re+=bigger(rs,mid+1,r,k);
pushup(x);
return re;
}
int kth(int x,int l,int r,int k) {
if(l==r) return l;
int mid=(l+r)>>1;
if(k>num[ls]) return kth(rs,mid+1,r,k-num[ls]);
else return kth(ls,l,mid,k);
}
int main() {
using namespace IO;
int m,cc=0;
m=rd();
tr.init();
for(int cas=1;cas<=m;++cas) {
int op=rd();
if(op==1) {
int x=rd();
++cc;
update(rt[cc],1,N,x,1);
}
if(op==2) {
int x,y,a,b;
x=rd(),y=rd();
a=tr.find(x),b=tr.find(y);
if(a!=b) {
rt[b]=merge(rt[a],rt[b]);
tr.p[a]=b;
}
}
if(op==3) {
int a,x,c=0;
a=rd(),x=rd();
a=tr.find(a);
c=less(rt[a],1,N,x);
update(rt[a],1,N,x,c);
}
if(op==4) {
int a,x,c=0;
a=rd(),x=rd();
a=tr.find(a);
c=bigger(rt[a],1,N,x);
update(rt[a],1,N,x,c);
}
if(op==5) {
int a,k;
a=rd(),k=rd();
a=tr.find(a);
printf("%d\n",kth(rt[a],1,N,k));
}
if(op==6) {
int a,b;
a=rd(),b=rd();
a=tr.find(a),b=tr.find(b);
if(de[rt[a]]>de[rt[b]]) printf("1\n");
else printf("0\n");
}
if(op==7) {
int a;
a=rd();
a=tr.find(a);
printf("%d\n",num[rt[a]]);
}
}
return 0;
}

  

BZOJ 4399: 魔法少女LJJ 线段树合并 + 对数的更多相关文章

  1. BZOJ.4399.魔法少女LJJ(线段树合并)

    BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\ ...

  2. BZOJ 4399: 魔法少女LJJ(线段树)

    传送门 解题思路 出题人真会玩..操作\(2\)线段树合并,然后每棵线段树维护元素个数和.对于\(6\)这个询问,因为乘积太大,所以要用对数.时间复杂度\(O(nlogn)\) 代码 #include ...

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

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

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

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

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

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

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

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

  7. bzoj 4399 魔法少女LJJ

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

  8. BZOJ 4399 魔法少女LJJ(线段树合并)

    题意 https://www.lydsy.com/JudgeOnline/problem.php?id=4399 思路 码农题,需要一定代码功底.方法很暴力,先将权值离散,表示在线段树里储存的位置,每 ...

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

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

随机推荐

  1. 【嵌入式开发】Raspberry Pi 树莓派性能测试

    Raspberry Pi 树莓派性能测试 目录: CPU Linpack基准测试 源码 编译/运行 结果 Whetstone/Dhrystone综合基准测试 源码 编译/运行 结果 OpenSSL安全 ...

  2. 记一则update 发生enq: TX - row lock contention 的处理方法

    根据事后在虚拟机中复现客户现场发生的情况,做一次记录(简化部分过程,原理不变) 客户端1执行update语句 SQL> select * from test; ID NAME --------- ...

  3. python 并发编程 协程池

    协程池 from gevent.pool import Pool from gevent import monkey;monkey.patch_all() import gevent from gev ...

  4. Maven从入门到精通(四)

    这一篇我会着重讲解Maven的核心命令及作用,Maven在项目构建各个阶段的作用. 1.maven生命周期模型: 1.1.清洁(clean) 1.2.默认(default) 1.3.站点(site) ...

  5. C# StreamReader与StreamWriter

    原文:https://www.cnblogs.com/kissdodog/archive/2013/01/27/2878667.html StreamReader实现了抽象基类TextReader类, ...

  6. Linux系统管理和调优(内存、CPU、磁盘IO、网络)

    系统管理 Author:Rich七哥 查看 CPU 负载相关工具,找出系统中使用 CPU 最多的进程 查看 Memory 运行状态相关工具,找出系统中使用内存最多的进程 查看 IO 运行状态相关工具, ...

  7. WebService概念解释

    一句话概括什么是WebService   WebService是一种跨编程语言.跨操作系统平台的远程调用技术. 远程调用技术:远程调用是指一台设备上的程序A可以调用另一台设备上的方法B.比如:银联提供 ...

  8. Numpy 基础函数 --《Python 数据分析从入门到精通》

    在Numpy中,方向称作轴,轴的数目称作维.(array(z,y,x)) np.empty() 函数的使用待完全确定.(eg: np.empty([2,3])  -> ([[0,0,0] [0, ...

  9. Mac中如何高亮显示当前git分支以及相关切换系统默认shell操作

    前言 在开发中对于使用git的同学,肯定会需要高亮显示当前分支,我们今天就来说一种最简单的办法,先来看一下效果图 实现 1.安装item2 https://www.iterm2.com 2.安装oh- ...

  10. robots.txt写法大全和robots.txt语法的作用

    1如果允许所有搜索引擎访问网站的所有部分的话 我们可以建立一个空白的文本文档,命名为robots.txt放在网站的根目录下即可.robots.txt写法如下:User-agent: *Disallow ...