传送门

解题思路

  出题人真会玩。。操作\(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. JDK 5.0 新增解决线程安全 Callable接口和线程池

    在jdk5.0后又新增了两种解决线程安全的问题 一: 实现Callable接口, 实现接口步骤: 1: 创建一个实现Callable接口的实现类 2: 实现Callable接口中的call()方法, ...

  2. js 数组相减 (一个数组去掉不符合条件的子数组)

    数组相减?我也希望将来在ES8或者更好js版本能带来数组之间相互运算的方法,但是现在不能,咱们只能靠已有的方法实现: var arr1 = [2,3,5,88,99,444,66],arr2 = [2 ...

  3. Colourful Rectangle【扫描线】

    题目链接 很明显的可以发现是一个扫描线的问题,但是怎么处理区域呢,发现只有三种颜色,也就是最多也就是7种状态,那么我们可以进行一个状态压缩即可. 但是,在向上pushup的时候,存在我们要以子树的状态 ...

  4. 移动端安全 - 安卓Android - 工具相关

    渗透工具 drozer .安装文件解压后文件介绍 setup.exe ---安装 agent.apk ---用于调试 - 安装在安卓手机上 使用命令 . cd 到 drozer 安装目录 . adb ...

  5. Mac apache You don't have permission to access / on this server.

    在mac下配置完apache和php环境后,通过localhost访问页面,出现403Forbidden.页面提示: Forbidden You don't have permission to ac ...

  6. js/jquery中什么时候用return,什么时候用return false

    根本的说 return 是函数的返回结果用, 如果你一个函数需要执行结果那就return 你需要的结果, 不需要结果就不用return而在jq中有些特殊的用法,比如$().each(function( ...

  7. javascript:变量声明&&赋值的提升和函数声明&&定义的提升在不同情况下的表现

    console.log(a); //undefined console.log(show); //函数的定义 show();         //aaa123 var a = 1; function ...

  8. ES6——数组

    数组: map       映射  ———— 一个对一个 reduce   汇总  ———— 一堆出来一个 算个总数 [1,2,3]==>6 算平均数 [1,2,3]==>2 filter ...

  9. 通用的规则匹配算法(原创)(java+.net)

    1.java里可以使用Spring的 Spel或者Google的Aviator 如果使用 Aviator 则添加以下依赖 <dependency> <groupId>com.g ...

  10. 全文检索引擎sphinx 与 Elasticsearch 索引速度对比

    sphinx的特色之一是建立索引速度快,最近转投Elasticsearch后,一直想做个对比,网上资料常见说法是10倍的差距. 测试环境 硬件:单核,2G内存的E5-2630 虚拟机 操作系统:Cen ...