传送门

解题思路

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

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm> using namespace std;
const int N=400005;
const int M=2000005; inline int rd(){
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
} int m,tot,rt[M],F[M],num,cpy[N],cnt,a[N],u,tmp; struct Query{
int op,x,y;
}q[N]; struct Segment_Tree{
double Mul[M];
int siz[M],ls[M],rs[M];
void update(int &x,int l,int r,int s,int k,double now){
if(!x) x=++tot; siz[x]+=s; Mul[x]+=s*now;
if(l==r) return; int mid=(l+r)>>1;
if(k<=mid) update(ls[x],l,mid,s,k,now);
else update(rs[x],mid+1,r,s,k,now);
}
int merge(int x,int y,int l,int r){
if(!x || !y) return (x|y);
if(l==r) {siz[x]+=siz[y]; Mul[x]+=Mul[y]; return x;}
int mid=(l+r)>>1;
ls[x]=merge(ls[x],ls[y],l,mid);
rs[x]=merge(rs[x],rs[y],mid+1,r);
siz[x]=siz[ls[x]]+siz[rs[x]];
Mul[x]=Mul[ls[x]]+Mul[rs[x]];
return x;
}
void erase(int x,int l,int r,int L,int R){
if(L>R || !siz[x]) return;
if(l==r) {tmp+=siz[x]; siz[x]=0; Mul[x]=0; return;}
int mid=(l+r)>>1;
if(L<=mid) erase(ls[x],l,mid,L,R);
if(mid<R) erase(rs[x],mid+1,r,L,R);
siz[x]=siz[ls[x]]+siz[rs[x]];
Mul[x]=Mul[ls[x]]+Mul[rs[x]];
}
int kth(int x,int l,int r,int k){
if(l==r) return l; int mid=(l+r)>>1;
if(siz[ls[x]]>=k) return kth(ls[x],l,mid,k);
else {k-=siz[ls[x]]; return kth(rs[x],mid+1,r,k);}
}
}tree; int get(int x){
if(x==F[x]) return x;
return F[x]=get(F[x]);
} int main(){
m=rd(); int x,y,uu,vv;
for(int i=1;i<=m;i++){
q[i].op=rd(),q[i].x=rd();
if(q[i].op==1) cpy[++cnt]=q[i].x;
if(q[i].op==1 || q[i].op==7) continue; q[i].y=rd();
if(q[i].op==3 || q[i].op==4) cpy[++cnt]=q[i].y;
}
sort(cpy+1,cpy+1+cnt); u=unique(cpy+1,cpy+1+cnt)-cpy-1;
for(int i=1;i<=m;i++){
if(q[i].op==1){
x=lower_bound(cpy+1,cpy+1+u,q[i].x)-cpy;
num++; F[num]=num; tree.update(rt[num],1,u,1,x,log(q[i].x));
}
else if(q[i].op==2){
x=q[i].x,y=q[i].y; uu=get(x),vv=get(y);
if(uu==vv) continue; F[vv]=uu;
rt[uu]=tree.merge(rt[uu],rt[vv],1,u);
}
else if(q[i].op==3){
x=q[i].x,y=lower_bound(cpy+1,cpy+1+u,q[i].y)-cpy;
tmp=0; x=get(x); tree.erase(rt[x],1,u,1,y-1);
if(tmp) tree.update(rt[x],1,u,tmp,y,log(q[i].y));
}
else if(q[i].op==4){
x=q[i].x,y=lower_bound(cpy+1,cpy+1+u,q[i].y)-cpy;
tmp=0; x=get(x); tree.erase(rt[x],1,u,y+1,u);
if(tmp) tree.update(rt[x],1,u,tmp,y,log(q[i].y));
}
else if(q[i].op==5){
x=q[i].x; y=q[i].y; x=get(x);
printf("%d\n",cpy[tree.kth(rt[x],1,u,y)]);
}
else if(q[i].op==6) {
x=get(q[i].x); y=get(q[i].y);
puts(tree.Mul[rt[x]]>tree.Mul[rt[y]]?"1":"0");
}
else if(q[i].op==7) printf("%d\n",tree.siz[rt[get(q[i].x)]]);
}
return 0;
}

BZOJ 4399: 魔法少女LJJ(线段树)的更多相关文章

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

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

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

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

  3. bzoj 4399 魔法少女LJJ

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Vagrant 手册之 Vagrantfile - 概述

    原文地址 Vagrantfile 的主要用途是描述用于项目的机器类型,以及如何配置和提供这些机器. Vagrant 的每个项目运行一个 Vagrantfile,并且 Vagrantfile 应该被提交 ...

  2. grpc应用于微服务的分析,基于python

    grpc应用于微服务的分析 gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,目前提供 C.Java 和 Go 语言版本,分别是:grpc, grpc-java, g ...

  3. 在reshard过程中,将会询问reshard多少slots:

    How many slots do you want to move (from 1 to 16384)?,取值范围为1~16384,其中16384为redis cluster的拥有的slots总数, ...

  4. 如何根据字典值的大小,对字典中的项排序---Python数据结构与算法相关问题与解决技巧

    实际案例: 某班英语成绩以字典形式存储为: { 'LiLei' : 90, 'Jim' : 88, 'Lucy': 92 } 如何根据成绩高低,计算学生排名 -- 根据分数,进行排名,并且把排名信息添 ...

  5. 【ABAP系列】SAP ABAP 工单增强

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 工单增强   ...

  6. Locally weighted regression algorithm

    在此引出另一种模型:Locally weighted regression algorithm(LWLR/LWR),通过名字我们可以推断,这是一种更加关注局部变化的模型.的确如此,在普通的linear ...

  7. CentOS安装Prolog和Erlang语言

    安装Erlang比较简单 下载Erlang的压缩包 输入tar -zxvf 压缩包 解压 进入解压的目录下 输入./configure 在./configure执行完成后,输入make 然后输入mak ...

  8. bzoj3218 a + b Problem(网络流+主席树)

    $ans=\sum_{color_i=black}\ b_i+\sum_{color_i=white}\ w_i-\sum_{i=abnormal}\ p_i$ 把它转化一下 $ans=\sum_{i ...

  9. 同一客户端多个git账号的配置

    同一客户端多个git账号的配置 同一客户端多个git账号的配置 步骤一:用ssh-keygen命令生成一组新的id_rsa_new和id_rsa_new.pub. 1 ssh-keygen -t rs ...

  10. BUUCTF--新年快乐

    测试文件:https://buuoj.cn/files/bbf9f68a97fd551edec384914d4f3fbe/93c43c5c-3d4d-4d17-a9a1-4ffb65ebb2fb.zi ...