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$. ...
随机推荐
- 实现自己的DiscoveryClient
需要做的: DiscoveryClient能提供那些服务的服务名列表 返回指定服务对于的ServiceInstance列表 返回DiscoveryClient的顺序 返回HealthIndicator ...
- python 字符编码问题总结
都是计算机存储是二进制0101之类的数字 最早计算机在美国开始的 所以数字和英文之类的占用八位 2的8次方 256可以存储对于英文和数字戳戳有余 每个国家都有自己的编码 中国 gb2312 gbk ...
- P2469 [SDOI2010]星际竞速(费用流)
P2469 [SDOI2010]星际竞速 最小路径覆盖问题 每个星球必须恰好去一次,而每次高速航行都是从一个星球到另一个星球. 那么高速航行的起点可以保证被去过 高速航行和空间跳跃可以是互相独立的 将 ...
- Vue 踩坑日志 - 有关路由传参的坑
1.有关路由传参 vue中当通过params传过去的参数刷新页面以后会消失,所以可以用query传参.但此时又会出现另一个坑,刷新后数据仍在.但这是针对单个的某个变量的. 如果传入一个对象的话,刷新页 ...
- @Profile使用及SpringBoot获取profile值
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Fmuma/article/details ...
- vue,一路走来(11)--HTML5 History模式
HTML5 History模式 项目中我用的是history模式. 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载. 如果不 ...
- 四、Angular新建组件和使用
1.新建组件命令 ng component 组件路径 如果报错换成 ng generate component 组件路径 2.组件 ts 文件详解 3.组件会自动引入到app.mudule.ts里面 ...
- linux firewall
一.查看防火墙状态1.首先查看防火墙是否开启,如未开启,需要先开启防火墙并作开机自启 systemctl status firewalld 开启防火墙并设置开机自启 systemctl start f ...
- MFC的DoModal(转)
DoModal会产生模态对话框(有模式的对话框,有“是”或者“否”供用户选择),函数运行到此处后不会马上返回,会等待用户的响应(响应后对话框销毁),在此对话框未销毁前,其他窗口不会接收到用户的输入(注 ...
- Strcpy,strcpy使用注意
一.char *strcpy(char *dest, const char *src) 参数 dest -- 指向用于存储复制内容的目标数组. src -- 要复制的字符串. 注意: 1.dest需要 ...