博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AC日记——魔法少女LJJ bzoj 4399
阅读量:6902 次
发布时间:2019-06-27

本文共 2929 字,大约阅读时间需要 9 分钟。

 

思路:

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

 

来,上代码:

#include 
#include
#include
#include
#include
using namespace std;#define maxn 400005#define maxm 7000000int ch[maxm][2],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=1,r=size,mid,res; while(l<=r) { mid=l+r>>1; if(pos>=ai[mid]) l=(res=mid)+1; else r=mid-1; } return res;}inline void in(int &now){ char Cget=getchar();now=0; while(Cget>'9'||Cget<'0') Cget=getchar(); while(Cget>='0'&&Cget<='9') { now=now*10+Cget-'0'; 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]=0,lo[now]=0; return ; } int mid=l+r>>1; if(li<=mid) tree_query(ch[now][0],l,mid,li,ri); if(ri>mid) tree_query(ch[now][1],mid+1,r,li,ri); dis[now]=dis[ch[now][0]]+dis[ch[now][1]],lo[now]=lo[ch[now][0]]+lo[ch[now][1]];}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>>1; if(to<=mid) tree_add(ch[now][0],l,mid,to); else tree_add(ch[now][1],mid+1,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>>1; ch[now][0]=merge(ch[now][0],ch[pre][0],l,mid); ch[now][1]=merge(ch[now][1],ch[pre][1],mid+1,r); lo[now]=lo[ch[now][0]]+lo[ch[now][1]]; dis[now]=dis[ch[now][0]]+dis[ch[now][1]]; return now;}int irank(int now,int k){ int l=1,r=size,mid; while(l
>1; if(dis[ch[now][0]]>=k) r=mid,now=ch[now][0]; else k-=dis[ch[now][0]],l=mid+1,now=ch[now][1]; } 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=1;i<=n;i++) { in(op[i]),in(x[i]); if(op[i]>1&&op[i]<7) in(y[i]); if(op[i]==1) ai[++size]=x[i]; if(op[i]==3||op[i]==4) ai[++size]=y[i]; } sort(ai+1,ai+size+1),size=unique(ai+1,ai+size+1)-ai-1; for(int i=1;i<=size;i++) logg[i]=log(ai[i]); for(int i=1;i<=n;i++) { if(op[i]==1) x[i]=lower_bound(x[i]),X=1,XX=logg[x[i]],tree_add(root[++cnt],1,size,x[i]),f[cnt]=cnt; else if(op[i]==2) { 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]],1,size),f[x[i]]=y[i]; } else if(op[i]==3) { y[i]=lower_bound(y[i]),x[i]=find(x[i]),X=0; if(y[i]>1) tree_query(root[x[i]],1,size,1,y[i]-1),XX=logg[y[i]]*X; if(X) tree_add(root[x[i]],1,size,y[i]); } else if(op[i]==4) { y[i]=lower_bound(y[i]),x[i]=find(x[i]),X=0; if(y[i]
lo[root[find(y[i])]]?"1":"0"); else if(op[i]==7) printf("%d\n",dis[root[find(x[i])]]); else printf("Orz\n"); } return 0;}

 

转载于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6818041.html

你可能感兴趣的文章
Python用pip 安装lxml时出现 “Unable to find vcvarsall.bat ”解决方案
查看>>
我的友情链接
查看>>
java单例模式之线程安全问题
查看>>
Notes打不开的故障总结
查看>>
WEB打印控件Lodop(V6.x)
查看>>
我的友情链接
查看>>
UI集成测试运行说明
查看>>
ES与Javscript,JScript,ActionScript等脚本
查看>>
断点的技巧
查看>>
mariadb配置安装
查看>>
自己做网站怎么计算带宽需求
查看>>
流镜像,端口镜像
查看>>
3月23日作业
查看>>
C语言之枚举
查看>>
我的友情链接
查看>>
程序员学习能力提升三要素
查看>>
Mysqli的批量CRUD数据
查看>>
oracle 10g升级流程
查看>>
linux下DNS服务器的实现1
查看>>
BGinfo设置记录文档
查看>>