魔法少女LJJ

思路:

  动态开点权值线段树+启发式合并;

来,上代码:

#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的更多相关文章

  1. bzoj 4399 魔法少女LJJ

    4399: 魔法少女LJJ Time Limit: 20 Sec  Memory Limit: 162 MBhttp://www.lydsy.com/JudgeOnline/problem.php?i ...

  2. BZOJ 4399: 魔法少女LJJ 线段树合并 + 对数

    Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着 ...

  3. BZOJ4399魔法少女LJJ——线段树合并+并查集

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...

  4. BZOJ4399 魔法少女LJJ【线段树合并】【并查集】

    Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...

  5. 魔法少女 LJJ——线段树

    题目 [题目描述] 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女 LJJ 已经觉得自己见过世界上的所有稀奇古怪的事情了. LJJ 感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处 ...

  6. 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...

  7. 【BZOJ4399】魔法少女LJJ 线段树合并

    [BZOJ4399]魔法少女LJJ Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的 ...

  8. BZOJ.4399.魔法少女LJJ(线段树合并)

    BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\ ...

  9. BZOJ 4399 魔法少女LJJ(线段树合并)

    题意 https://www.lydsy.com/JudgeOnline/problem.php?id=4399 思路 码农题,需要一定代码功底.方法很暴力,先将权值离散,表示在线段树里储存的位置,每 ...

随机推荐

  1. linux中如何解决克隆后的电脑的问题

    1.如何解决克隆后的电脑的网络问题 克隆出来的电脑,IP地址,网卡都是重复的,不能直接使用,需要修改 1)vim  /etc/udev/rules.d/70-persistent-net.rules ...

  2. elasticsearch索引和映射

    目录 1. elasticsearch如何实现搜索 1.1 搜索实例 1.2 es中数据的类型 1.3 倒排索引 1.4 分析与分析器 1.4.1 什么是分析器 1.4.2 内置分析器种类 1.4.3 ...

  3. 四大关键步骤掌握CloudOps模型

    [TechTarget中国原创] 要让IT运维向云演进,企业必须拥抱自动化,并且改变资源预配的思考方式. 新涌现的术语CloudOps——云运维的简写,指代企业如何运行以及管理基于云的系统.并且,随着 ...

  4. groupSum6后向遍历

    http://codingbat.com/prob/p199368 public boolean groupSum6(int start, int[] nums, int target) { if( ...

  5. 玩转Node.js(二)

    玩转Node.js(二) 先来回顾上次的内容,上一次我们使用介绍了Node.js并写了第一个服务器端的Hello World程序,在这个Hello World程序中,请求自带的http模块并将其赋给h ...

  6. 四 Android Capabilities讲解

    本文转自:http://www.cnblogs.com/sundalian/p/5629429.html Android Capabilities讲解   1.Capabilities介绍 可以看下之 ...

  7. Gluon

    推荐一门mxnet的学习框架gluon 首先是学习网址链接gluon 基本环节分成两部分 从0开始(介绍不使用框架,而只使用mxnet来完成神经网络的搭建) gluon实现(介绍使用框架快速搭建神经网 ...

  8. php利用PHPExcel类导出导入Excel用法

    PHPExcel类是php一个excel表格处理插件了,下面我来给大家介绍利用PHPExcel类来导入与导出excel表格的应用方法,有需要了解的朋友不防参考参考(PHPExcel自己百度下载这里不介 ...

  9. shit vue-cli & path bug & baseUrl bug

    vue-cli path bug https://cli.vuejs.org/zh/guide/#cli baseUrl bug baseUrl: "././" , https:/ ...

  10. vue cli & npm err & shit cnpm

    vue cli & npm err & shit cnpm npm err & shit cnpm https://github.com/vuejs/vue-cli/issue ...