AC日记——魔法少女LJJ bzoj 4399
思路:
动态开点权值线段树+启发式合并;
来,上代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 400005
#define maxm 7000000 int ch[maxm][],X,dis[maxm],tot,n,ai[maxn];
int size,f[maxn],cnt,op[maxn],x[maxn],y[maxn],root[maxn]; double lo[maxm],logg[maxn],XX; inline int lower_bound(int pos)
{
int l=,r=size,mid,res;
while(l<=r)
{
mid=l+r>>;
if(pos>=ai[mid]) l=(res=mid)+;
else r=mid-;
}
return res;
} inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} void tree_query(int now,int l,int r,int li,int ri)
{
if(!dis[now]) return ;
if(l==r)
{
X+=dis[now],dis[now]=,lo[now]=;
return ;
}
int mid=l+r>>;
if(li<=mid) tree_query(ch[now][],l,mid,li,ri);
if(ri>mid) tree_query(ch[now][],mid+,r,li,ri);
dis[now]=dis[ch[now][]]+dis[ch[now][]],lo[now]=lo[ch[now][]]+lo[ch[now][]];
} void tree_add(int &now,int l,int r,int to)
{
if(!now) now=++tot;
dis[now]+=X,lo[now]+=XX;
if(l==r) return ;
int mid=l+r>>;
if(to<=mid) tree_add(ch[now][],l,mid,to);
else tree_add(ch[now][],mid+,r,to);
} int merge(int now,int pre,int l,int r)
{
if(!now) return pre;
if(!pre) return now;
if(l==r)
{
lo[now]+=lo[pre];
dis[now]+=dis[pre];
return now;
}
int mid=l+r>>;
ch[now][]=merge(ch[now][],ch[pre][],l,mid);
ch[now][]=merge(ch[now][],ch[pre][],mid+,r);
lo[now]=lo[ch[now][]]+lo[ch[now][]];
dis[now]=dis[ch[now][]]+dis[ch[now][]];
return now;
} int irank(int now,int k)
{
int l=,r=size,mid;
while(l<r)
{
mid=l+r>>;
if(dis[ch[now][]]>=k) r=mid,now=ch[now][];
else k-=dis[ch[now][]],l=mid+,now=ch[now][];
}
return ai[l];
} inline int find(int j)
{
return f[j]==j?j:f[j]=find(f[j]);
} int main()
{
in(n);
for(int i=;i<=n;i++)
{
in(op[i]),in(x[i]);
if(op[i]>&&op[i]<) in(y[i]);
if(op[i]==) ai[++size]=x[i];
if(op[i]==||op[i]==) ai[++size]=y[i];
}
sort(ai+,ai+size+),size=unique(ai+,ai+size+)-ai-;
for(int i=;i<=size;i++) logg[i]=log(ai[i]);
for(int i=;i<=n;i++)
{
if(op[i]==) x[i]=lower_bound(x[i]),X=,XX=logg[x[i]],tree_add(root[++cnt],,size,x[i]),f[cnt]=cnt;
else if(op[i]==)
{
x[i]=find(x[i]),y[i]=find(y[i]);
if(x[i]==y[i]) continue;
root[y[i]]=merge(root[x[i]],root[y[i]],,size),f[x[i]]=y[i];
}
else if(op[i]==)
{
y[i]=lower_bound(y[i]),x[i]=find(x[i]),X=;
if(y[i]>) tree_query(root[x[i]],,size,,y[i]-),XX=logg[y[i]]*X;
if(X) tree_add(root[x[i]],,size,y[i]);
}
else if(op[i]==)
{
y[i]=lower_bound(y[i]),x[i]=find(x[i]),X=;
if(y[i]<size) tree_query(root[x[i]],,size,y[i]+,size),XX=logg[y[i]]*X;
if(X) tree_add(root[x[i]],,size,y[i]);
}
else if(op[i]==) printf("%d\n",irank(root[find(x[i])],y[i]));
else if(op[i]==) puts(lo[root[find(x[i])]]>lo[root[find(y[i])]]?"":"");
else if(op[i]==) printf("%d\n",dis[root[find(x[i])]]);
else printf("Orz\n");
}
return ;
}
AC日记——魔法少女LJJ bzoj 4399的更多相关文章
- bzoj 4399 魔法少女LJJ
4399: 魔法少女LJJ Time Limit: 20 Sec Memory Limit: 162 MBhttp://www.lydsy.com/JudgeOnline/problem.php?i ...
- BZOJ 4399: 魔法少女LJJ 线段树合并 + 对数
Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着 ...
- BZOJ4399魔法少女LJJ——线段树合并+并查集
题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...
- BZOJ4399 魔法少女LJJ【线段树合并】【并查集】
Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...
- 魔法少女 LJJ——线段树
题目 [题目描述] 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女 LJJ 已经觉得自己见过世界上的所有稀奇古怪的事情了. LJJ 感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处 ...
- 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并
题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...
- 【BZOJ4399】魔法少女LJJ 线段树合并
[BZOJ4399]魔法少女LJJ Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的 ...
- BZOJ.4399.魔法少女LJJ(线段树合并)
BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\ ...
- BZOJ 4399 魔法少女LJJ(线段树合并)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=4399 思路 码农题,需要一定代码功底.方法很暴力,先将权值离散,表示在线段树里储存的位置,每 ...
随机推荐
- interface in iOS
lo = localhosten = ethernetap = Probably for access point (if you are acting as a wifi host) pdp_ip ...
- 《Cracking the Coding Interview》——第17章:普通题——题目8
2014-04-28 23:35 题目:最大子数组和问题. 解法:O(n)解法. 代码: // 17.8 Find the consecutive subarray with maximum sum ...
- 《Cracking the Coding Interview》——第10章:可扩展性和存储空间限制——题目7
2014-04-24 22:06 题目:搜索引擎问题,如果有一列100台服务器的集群,用来响应查询请求,你要如何设计query分发和cache策略? 解法:query分发可以用计算数字签名并对机器数取 ...
- jmeter 运行脚本报错 java.net.BindException: Address already in use
在win下跑jmeter时,在聚合报告中出现错误.打开日志文件(前提是将日志写入了指定文件) 发现报错的原因为:java.net.BindException: Address already in u ...
- jmeter运行脚本后,请求偶发性的传参错误
问题现象:jmeter写好脚本后,请求偶发性的传参错误 排查过程:1.结合报错返回值,看是不是线程并发引起: 2.排除线程并发引起后,看看是不是取值策略:如果是参数化,看看是不是每次迭代,每次都取唯一 ...
- hadoop生态圈列式存储系统--kudu介绍及安装配置
介绍 Kudu 是一个针对 Apache Hadoop 平台而开发的列式存储管理器.Kudu 共享 Hadoop 生态系统应用的常见技术特性: 它在 commodity hardware(商品硬件)上 ...
- log4j的各种类的配置
log4j看上去像是一种简单的,易配置的日志打印技术.但是实际使用的时候发现,还有各种很相似的日志技术.很多地方的配置一乱就不知道怎么对应了.所以应该把log4j的一切做个简单的分类记录. (一)ja ...
- BZOJ1823 [JSOI2010]满汉全席 【2-sat】
题目 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过专家 ...
- sass mixin 持续更新
控制多行显示省略号... //文字溢出省略号@mixin coveText($num:1){ @if $num == 1{ white-space: normal; overflow: hidden; ...
- Avito Cool Challenge 2018:C. Colorful Bricks
C. Colorful Bricks 题目链接:https://codeforces.com/contest/1081/problem/C 题意: 有n个横向方块,一共有m种颜色,然后有k个方块的颜色 ...