BZOJ 4399: 魔法少女LJJ(线段树)
解题思路
出题人真会玩。。操作\(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(线段树)的更多相关文章
- BZOJ 4399: 魔法少女LJJ 线段树合并 + 对数
Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着 ...
- BZOJ.4399.魔法少女LJJ(线段树合并)
BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\ ...
- bzoj 4399 魔法少女LJJ
4399: 魔法少女LJJ Time Limit: 20 Sec Memory Limit: 162 MBhttp://www.lydsy.com/JudgeOnline/problem.php?i ...
- BZOJ4399魔法少女LJJ——线段树合并+并查集
题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...
- 魔法少女 LJJ——线段树
题目 [题目描述] 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女 LJJ 已经觉得自己见过世界上的所有稀奇古怪的事情了. LJJ 感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处 ...
- 【BZOJ4399】魔法少女LJJ 线段树合并
[BZOJ4399]魔法少女LJJ Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的 ...
- BZOJ 4399 魔法少女LJJ(线段树合并)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=4399 思路 码农题,需要一定代码功底.方法很暴力,先将权值离散,表示在线段树里储存的位置,每 ...
- bzoj4399 魔法少女LJJ 线段树合并
只看题面绝对做不出系列.... 注意到\(c \leqslant 7\),因此不会有删边操作(那样例删边干嘛) 注意到\(2, 5\)操作十分的有趣,启示我们拿线段树合并来做 操作\(7\)很好处理 ...
- bzoj4399 魔法少女LJJ 线段树合并+线段树二分+并查集
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4399 题解 毒瘤题 \(9\) 种操作还有支持动态图的连通性 仔细读题 $ c<=7$. ...
随机推荐
- delphi 获取文件的最新修改时间 http://www.delphitop.com/html/wenjian/64.html
delphi 获取文件的最新修改时间 作者:admin 来源:未知 日期:2010/1/28 13:15:22 人气:1054 标签: QQ空间新浪微博腾讯微博腾讯朋友QQ收藏百度空间百度贴吧更多0 ...
- Delphi 文件转换Base64
uses EncdDecd; function FileToBase64(FileName: string): string; var MemoryStream: TMemoryStream;beg ...
- SEC1- 数据库的相关概念
一.数据库的好处1. 可以持久化数据到本地2. 结构化查询 二.数据库的常见概念1. DB:data base数据库,存储数据的容器2. DBMS:database management sysy ...
- C#获取本地路径
/// <summary> /// 本地路径 /// </summary> /// <param name="path"></param& ...
- 爬虫(六)——存储库(一)MongoDB存储库
目录 存储库--MongoDB 一.安装MongoDB 4.0 1.安装 2.修改数据库文件和日志保存位置设置(可不改) 3.账户管理.远程服务 三.MongoDB数据库操作 1.对库操作 2.对集合 ...
- [Linux] 003 分区
1. 磁盘分区 使用分区编辑器再磁盘上划分几个逻辑部分 不用类的目录与文件可以存储进不同的分区 2. 分区类型 主分区 最多只能有 4 个 扩展分区 最多只能有 1 个 主分区加扩展分区最多为 4 个 ...
- mysql 主从复制 (2)
今天说一下MySQL的主从复制如何做到! 准备工作: 1.两个虚拟机:我这里用的是CentOS5.5,IP地址分别是192.168.1.101 和192.168.1.105: 101做主服务器,105 ...
- LeetCode #807. Max Increase to Keep City Skyline 保持城市天际线
https://leetcode-cn.com/problems/max-increase-to-keep-city-skyline/ 执行用时 : 3 ms, 在Max Increase to Ke ...
- Laya2.0的转变
之前一直用Laya1.x+TypeScript了,最近项目开始使用Laya2.0+AS3了 总结一下需要注意的一些事项,算是2种开发模式的区别与过渡吧 1.AS类的访问标识 必须是public,不写会 ...
- 构建自己的AngularJS,第一部分:作用域和digest 转摘:http://www.ituring.com.cn/article/39865
构建自己的AngularJS,第一部分:Scope和Digest 原文链接:http://teropa.info/blog/2013/11/03/make-your-own-angular-part- ...