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;
}

  

转载于:https://www.cnblogs.com/guangheli/p/11275836.html

BZOJ 4399: 魔法少女LJJ 线段树合并 + 对数相关推荐

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

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

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

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

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

    请仔细阅读数据范围,c<=7. 线段树合并裸题,对于乘积大小比较,使用log即可. 1 #include<cmath> 2 #include<cstdio> 3 #inc ...

  4. bzoj 4399 魔法少女LJJ

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

  5. BZOJ 4399: 魔法少女LJJ

    4399: 魔法少女LJJ Time Limit: 20 Sec Memory Limit: 162 MB Submit: 287 Solved: 73 Description 在森林中见过会动的树, ...

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

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

  7. BZOJ.2212.[POI2011]Tree Rotations(线段树合并)

    题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...

  8. BZOJ.4552.[HEOI2016/TJOI2016]排序(线段树合并/二分 线段树)

    题目链接 对于序列上每一段连续区间的数我们都可以动态开点建一棵值域线段树.初始时就是\(n\)棵. 对于每次操作,我们可以将\([l,r]\)的数分别从之前它所属的若干段区间中分离出来,合并. 对于升 ...

  9. BZOJ 3910 并查集+线段树合并

    思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...

最新文章

  1. Java中深浅拷贝之List
  2. python图片批量处理器_用python给图片批量打水印
  3. INFO:安装包文件共享(Shared Files)设置注意事项
  4. android 存储不被垃圾清理,手机内存足够大,就不需要清理垃圾了?你错了!
  5. 常用的后端性能优化六种方式:缓存化+服务化+异步化等
  6. webform计算某几列结果,如何在C#webform中使用LiveView来垂直显示某些字段,在一个表格中水平显示一些字段作为填写表单?...
  7. C# 利用反射动态创建对象[摘录]
  8. 计算机毕业设计中用Java 实现系统权限控制
  9. matlab动态仿真实例教程,MATLAB R2008控制系统动态仿真实例教程_IT教程网
  10. 用计算机弹琴慢速度,弹钢琴的速度如何才能快起来?
  11. ubuntu系统安装TP-Link无线网卡驱动
  12. couchbase使用
  13. H5/web前端工程简历中的项目经验
  14. 免费试用华为云服务器一个月,部署自己的网站
  15. win11中wsa使用fiddler抓包(https)
  16. 图像处理_ISP_坏点矫正
  17. [强网杯 2019]随便注 1
  18. 雨伞被拿错,你怎么办?!
  19. 如何判断运行中的代码是调试模式(debug),还是运行模式
  20. 原来菜鸟也可以做一个漂亮的网站,我的建站经验!

热门文章

  1. 叶酸-氨基聚乙二醇偶联CdTe/CdS量子点(FA-PEG-CdTe/CdS)|红色荧光水溶性InP/ZnS量子点(磷化铟/硫化锌)PEG羧基
  2. Java系列: 如何在Eclipse中安装Memory Analyzer插件
  3. 为什么说不同类型的网站有不同的优化方法
  4. 用vs画出马来西亚国旗
  5. C语言*p、p以及p的区别
  6. DB2存储过程入门实例
  7. DBus的理解与应用
  8. 怎么运行c语言程序,如何使用C语言进行编程操作,教程在这里,C语言编程快速入门...
  9. 征途研发元老披露成功内幕
  10. RabbitMQ原理名词解释