魔法少女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. 《Cracking the Coding Interview》——第17章:普通题——题目1

    2014-04-28 21:45 题目:就地交换两个数,不使用额外的变量. 解法:没说是整数,我姑且先当整数处理吧.就地交换可以用加法.乘法.异或完成,其中乘法和加法都存在溢出问题.三种方法都不能处理 ...

  2. 最近做group assignment需要些加密的知識

    需求:A給B單向發的數據需要被加密,A和B都可以看到原文.加密后,就算傳輸的過程被竊取,也無法得知數據原文.A可以是任何客戶端. 解決:常用的MD5,sha1等常用的加密算法為單向不可逆,顯然不符合需 ...

  3. cookie不能删除

    cookie不仅仅包含一个键值对,还包含域 domain  路径path, 一般domain是请求的地址 www.baidu.com/news.html 那domain就是www.baidu.com ...

  4. webstrom11 vue插件配置

    直接上图 1. 安装vue插件 2.添加模板 3.指定模板类型 最新的是插件 是 vue.js 创建完 Vue File 文件后 需要在 下面这里关联一下

  5. python - web自动化测试 - 元素操作 - 窗口切换

    # -*- coding:utf-8 -*- ''' @project: web学习 @author: Jimmy @file: 元素操作-切换.py @ide: PyCharm Community ...

  6. ASP.NET Core [3]:进入HttpContext的世界(笔记)

    原文链接:http://www.cnblogs.com/RainingNight/p/httpcontext-in-asp-net-core.html HttpContext是ASP.NET中的核心对 ...

  7. 编译TypeScript(TypeScript转JavaScript)

    1.配置tsconfig.json文件 tsconfig.json文件配置说明 { "compilerOptions": { //生成相关说明,TypeScript编译器如何编译. ...

  8. 1004 Counting Leaves (30 分)(树的遍历)

    给出一棵树,问每一层各有多少叶子节点 dfs遍历树 #include<bits/stdc++.h> using namespace std; vector<]; int n,m; i ...

  9. [转]Android的网络与通信

    本文转自:http://www.cnblogs.com/qingblog/archive/2012/06/15/2550735.html 第一部分 Android网络基础   Android平台浏览器 ...

  10. rsync同步数据

    1. rsync 命令格式rsync [OPTION]... SRC DESTrsync [OPTION]... SRC [USER@]HOST:DESTrsync [OPTION]... [USER ...