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. hdu3829 二分匹配 最大独立集

    Cat VS Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others) Problem ...

  2. Head First PHP&MySQl第二章代码

    PHP: <html> <head> <title>外星人绑架了我--报道一起绑架</title> </head> <body> ...

  3. css 空心圆

    用css实现一个空心圆,并始终放置在浏览器窗口左下角        div{                position:fixed;                bottom:0;      ...

  4. 查看ftp创建的用户

    先su然后查看cat /etc/passwd,500以后的是添加的使用者账户.

  5. 在docker容器下利用数据卷实现在删除了mysql容器或者镜像的情况下恢复数据

    当把mysql容器销毁,在新建一个容器,进行之前的数据恢复. 因为之前建立了数据卷,那么现在就可以利用这个数据卷进行数据恢复. 使用docker volume create volume_name命令 ...

  6. 八、break和continue

  7. Python3 A*寻路算法实现

    # -*- coding: utf-8 -*- import math import random import copy import time import sys import tkinter ...

  8. KVM虚拟化简介及安装

    kvm是基于图形化的linux操作的 安装图形化界面的知识点: 磁盘空间有两个词: 精简置备:我先在我系统里面去声明我要一个50G的空间,但是呢,我不会把50G都分给你,你用多少,我分给你多少,但是做 ...

  9. C#基础知识之理解Cookie和Session机制

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  10. 多线程使用@Async注解创建多线程,自定义线程池

    转载自博客https://www.jianshu.com/p/7ac04a501eba