BZOJ4399 魔法少女LJJ(线段树合并)
注意到只有增加点/合并的操作。这些操作都可以用线段树完成,于是线段树合并一发就好了。注意乘积大小直接比较肯定会炸,取个对数即可。数据中存在重边。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 400010
#define inf 1000000000
int m,tot,fa[N],root[N],cnt;
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
struct data{int l,r,s;double v;bool f;
}tree[N*];
void up(int k)
{
tree[k].s=tree[tree[k].l].s+tree[tree[k].r].s;
tree[k].v=tree[tree[k].l].v+tree[tree[k].r].v;
}
void down(int k)
{
tree[tree[k].l].f=tree[tree[k].r].f=;
tree[tree[k].l].s=tree[tree[k].r].s=;
tree[tree[k].l].v=tree[tree[k].r].v=;
tree[k].f=;
}
void ins(int &k,int l,int r,int x,int s,double y)
{
if (!k) k=++cnt;
tree[k].v+=y;tree[k].s+=s;
if (l==r) return;
if (tree[k].f) down(k);
int mid=l+r>>;
if (x<=mid) ins(tree[k].l,l,mid,x,s,y);
else ins(tree[k].r,mid+,r,x,s,y);
}
int merge(int x,int y,int l,int r)
{
if (!x||!y) return x|y;
tree[x].s+=tree[y].s,tree[x].v+=tree[y].v;
if (l<r)
{
if (tree[x].f) down(x);if (tree[y].f) down(y);
int mid=l+r>>;
tree[x].l=merge(tree[x].l,tree[y].l,l,mid);
tree[x].r=merge(tree[x].r,tree[y].r,mid+,r);
}
return x;
}
int modify(int k,int l,int r,int x,int y)
{
if (x>y||!k) return ;
if (l==x&&r==y)
{
int p=tree[k].s;
tree[k].s=,tree[k].v=,tree[k].f=;
return p;
}
if (tree[k].f) down(k);
int mid=l+r>>,ans;
if (y<=mid) ans=modify(tree[k].l,l,mid,x,y);
else if (x>mid) ans=modify(tree[k].r,mid+,r,x,y);
else ans=modify(tree[k].l,l,mid,x,mid)+modify(tree[k].r,mid+,r,mid+,y);
up(k);
return ans;
}
int query(int k,int l,int r,int x)
{
if (l==r) return l;
if (tree[k].f) down(k);
int mid=l+r>>;
if (tree[tree[k].l].s>=x) return query(tree[k].l,l,mid,x);
else return query(tree[k].r,mid+,r,x-tree[tree[k].l].s);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4399.in","r",stdin);
freopen("bzoj4399.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
m=read();
while (m--)
{
int op=read();
switch(op)
{
case :
{
fa[++tot]=tot;int x=read();
ins(root[tot],,inf,x,,log(x));
break;
}
case :
{
int x=find(read()),y=find(read());
if (x!=y) root[x]=merge(root[x],root[y],,inf);
fa[y]=x;
break;
}
case :
{
int p=find(read()),x=read();
int s=modify(root[p],,inf,,x-);
ins(root[p],,inf,x,s,s*log(x));
break;
}
case :
{
int p=find(read()),x=read();
int s=modify(root[p],,inf,x+,inf);
ins(root[p],,inf,x,s,s*log(x));
break;
}
case :
{
int p=find(read()),x=read();
printf("%d\n",query(root[p],,inf,x));
break;
}
case :
{
int x=find(read()),y=find(read());
printf("%d\n",tree[root[x]].v>tree[root[y]].v);
break;
}
case :
{
int x=find(read());
printf("%d\n",tree[root[x]].s);
break;
}
}
}
return ;
}
BZOJ4399 魔法少女LJJ(线段树合并)的更多相关文章
- BZOJ4399魔法少女LJJ——线段树合并+并查集
题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...
- 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感叹道“这里真是个迷人的 ...
- BZOJ 4399: 魔法少女LJJ 线段树合并 + 对数
Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着 ...
- BZOJ.4399.魔法少女LJJ(线段树合并)
BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\ ...
- 魔法少女 LJJ——线段树
题目 [题目描述] 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女 LJJ 已经觉得自己见过世界上的所有稀奇古怪的事情了. LJJ 感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处 ...
- BZOJ 4399: 魔法少女LJJ(线段树)
传送门 解题思路 出题人真会玩..操作\(2\)线段树合并,然后每棵线段树维护元素个数和.对于\(6\)这个询问,因为乘积太大,所以要用对数.时间复杂度\(O(nlogn)\) 代码 #include ...
- BZOJ4399 魔法少女LJJ【线段树合并】【并查集】
Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...
随机推荐
- Java源码解析——集合框架(二)——ArrayBlockingQueue
ArrayBlockingQueue源码解析 ArrayBlockingQueue是一个阻塞式的队列,继承自AbstractBlockingQueue,间接的实现了Queue接口和Collection ...
- c#vs连接SQL sever数据库入门操作
对于需要连接数据库的项目,可以参考的简单初级代码.实现打开数据库,读入数据功能 using System; using System.Collections.Generic; using System ...
- SAP ABAP Development Tools in Eclipseのセットアップ
手順 1. Eclipse IDE インストール 以下からダウンロード.https://tools.hana.ondemand.com/#abap※2018/1月現在 Oxygen(4.7)詳細は割愛 ...
- 三角形xjoi 8.14
问题描述:离圣诞节只有一个月了,家里要你准备一个很大的星星,然后把它粘在圣诞树的顶端.你已经准备好了一个三角形的银色包装纸来做星星,可忽然有一天你发现在这张大纸上被弄了好多的小洞,原来是你的弟弟妹妹已 ...
- kylin实战系列(一)
kylin实战系列(一) 把之前kylin的实践小结一下,以备以后查看.
- 初步学习pg_control文件之十三
接前文,初步学习pg_control文件之十二 看这个: * backupStartPoint is the redo pointer of the backup start checkpoint, ...
- 前端学习webpack
### 模块化- 为了保证代码充分解耦,一个大的项目拆分成互相依赖的一个一个的小的模块,最后再通过简单的方式合并在一起- 每一个js文件都可以看成一个单独的模块在node这边(服务器端),提出Comm ...
- FPGA等占空比奇偶分频和半整数分频
1. 偶数分频比较简单,如果分频系数是N(如果N是偶数,那么N/2是整数),那么在输入时钟的每隔N/2个周期时(计数器从0到N/2-1),改变输出时钟的电平即可得到50%固定占空比的时钟.需要的代码如 ...
- 学习SQLite基本语句
SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. 其特点是高度便携.使用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同,SQLite 的安装和运行非 ...
- Java与C++进行系统间交互:Protocol Buffer
在一次项目中,因笔者负责的java端应用需要与公司C++系统进行交互,公司选定Protocol Buffer方案,故简单的了解一下 有需要的可以看一下其他作者的文章,了解一下Protobuf: htt ...