魔法少女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. JS 金钱格式化

    JavaScript Money Format(用prototype对Number进行扩展) Number.prototype.formatMoney = function (places, symb ...

  2. iOS Crash 分析 符号化崩溃日志

    参考: http://blog.csdn.net/diyagoanyhacker/article/details/41247367 http://blog.csdn.net/diyagoanyhack ...

  3. c#集合的使用

    //添加单个元素用Add方法 ArrayList list = new ArrayList(); list.Add(true); list.Add(); list.Add("小陈" ...

  4. SLB 7层负载均衡“HUNG”问题追查

    最近接到博客园的反馈,SLB 7层负载均衡的实例会不定期出现流量突跌的情况,突跌持续10s左右:同时,SLB自身监控也观察到了相同的现象: 针对该问题,我们进行了持续追查,最终定位到是nginx配置的 ...

  5. 示例解读Java的跨平台原理

    首先简单的解释一下Java跨平台的特征,相当于说写一个Java程序论述上可以运行在不同的操作系统平台上面(此处的平台我们就简单的看成是操作系统平台).下面我们用一些事例来说明它的好处. 我们先了解一些 ...

  6. 《Cracking the Coding Interview》——第13章:C和C++——题目7

    2014-04-25 20:18 题目:给定一个Node结构体,其中包含数据成员和两个Node*指针指向其他两个Node结构(还不如直接说这是个图呢).给你一个Node指针作为参数,请做一份深拷贝作为 ...

  7. Percona-Tookit工具包之pt-heartbeat

      Preface       Replication delay is a common issue in MySQL replications.Especially in those replic ...

  8. 融合模型Aggregation

    从一堆弱分类器融合得到强分类器. 比如假设现在你只能水平或竖直线分割,那么无论如何都分不好,但是假设组合三次分割,就会得到如图所示的一个较好的分割线. 再比如,PLA 融合后有large margin ...

  9. HDU 4667 Building Fence 计算几何 凸包+圆

    1.三角形的所有端点 2.过所有三角形的端点对所有圆做切线,得到所有切点. 3.做任意两圆的外公切线,得到所有切点. 对上述所有点求凸包,标记每个点是三角形上的点还是某个圆上的点. 求完凸包后,因为所 ...

  10. linux常见的编码转换

    1.如何界定是utf-8编码还是其他如 ANSI 或者gb2312编码 以“浙”这个汉字为例,用16进制编码查看时,显示 D5 E3 为2个字节,则为 ansi或者gb2312编码 "苏&q ...