BZOJ4399 : 魔法少女LJJ
将所有权值离散化,建立权值线段树,维护区间内数字个数以及对数的和,用于比较乘积大小。
对于每个连通块维护一棵权值线段树,合并时用线段树合并。
对于操作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的更多相关文章
- BZOJ4399魔法少女LJJ——线段树合并+并查集
题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...
- BZOJ4399 魔法少女LJJ【线段树合并】【并查集】
Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...
- BZOJ4399 魔法少女LJJ(线段树合并)
注意到只有增加点/合并的操作.这些操作都可以用线段树完成,于是线段树合并一发就好了.注意乘积大小直接比较肯定会炸,取个对数即可.数据中存在重边. #include<iostream> #i ...
- 2019.01.16 bzoj4399: 魔法少女LJJ(线段树合并)
传送门 线段树合并菜题(然而findfindfind函数写错位置调了好久) 支持的操作题目写的很清楚了,然后有一个神奇的限制c≤7c\le7c≤7要注意到不然会去想毒瘤线段树的做法. 思路: 这题只有 ...
- bzoj4399 魔法少女LJJ 线段树合并
只看题面绝对做不出系列.... 注意到\(c \leqslant 7\),因此不会有删边操作(那样例删边干嘛) 注意到\(2, 5\)操作十分的有趣,启示我们拿线段树合并来做 操作\(7\)很好处理 ...
- bzoj4399 魔法少女LJJ 线段树合并+线段树二分+并查集
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4399 题解 毒瘤题 \(9\) 种操作还有支持动态图的连通性 仔细读题 $ c<=7$. ...
- 【BZOJ4399】魔法少女LJJ 线段树合并
[BZOJ4399]魔法少女LJJ Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的 ...
- 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并
题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...
- bzoj 4399 魔法少女LJJ
4399: 魔法少女LJJ Time Limit: 20 Sec Memory Limit: 162 MBhttp://www.lydsy.com/JudgeOnline/problem.php?i ...
随机推荐
- each-Select
While Ruby’s each method is useful, it also comes with an awesome extended family of methods that ar ...
- json串转对象
// 引入相应的包 //json-lib-2.2-jdk15.jar import net.sf.json.JSONArray;import net.sf.json.JSONObject; 1. // ...
- Having与Where的区别
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行. having 子句的作用是筛 ...
- poj 1328
http://poj.org/problem?id=1328 题意:题目大概意思就是有一群孤岛,想要用雷达来监视这些岛屿,但雷达的范围是有限的,所以需要多个雷达,题目就是要你解决最少需要几个雷达,注意 ...
- codeigniter 视图
2014年7月7日 15:23:05 ci的视图功能很棒, 比如一个网页有四个部分组成,对应4个文件:header.php, sider.php, maincontent.php, footer .p ...
- 用php实现遍历目录
用php实现的遍历目录,只遍历第一层,如果制作在线文件管理器的话很管用,不同目录只加一个超链接就行了,然后给方法传递参数就行了,遍历目录的类如下: class Ergodic{ public func ...
- poj 2739 Sum of Consecutive Prime Numbers 解题报告
题目链接:http://poj.org/problem?id=2739 预处理出所有10001以内的素数,按照递增顺序存入数组prime[1...total].然后依次处理每个测试数据.采用双重循环计 ...
- angularjs 指令(directive)详解(2)
原文地址 上一篇我们说到了transclude,那么,我们现在继续讲解之后的内容. 9.scope 可选参数,默认值为false.取值: false - 在这个directive里不会创建新的scop ...
- 或许您还不知道的八款Android开源游戏引擎
很多初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于iPhone下有诸如Cocos2d-iphone之类的免费游戏 ...
- ionic react-native和native开发移动app到底那个好
ionic react-native和native开发移动app那个好 ? 移动端开发如何选型?这里介绍一下我眼中的ionic,react-native,native 三种移动端开发选型对比.欢迎大家 ...