BZOJ 2161 布娃娃 (主席树)
想了一个主席树做法
我们把每个区间的两个端点拆开
对$L,R$分别从小到大排序,分别从左到右依次把对应标号的$c_{i}$插入到权值主席树里
每次查询$p_{i}$,在排序后的$L,R$数组上分别二分找到第一个小于等于$p_{i}$的位置
那么$L,R$的主席树相减之后就是能对$p_{i}$产生贡献的区间
在主席树上二分即可
似乎平衡树和线段树的做法空间比我优秀得多..
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 100010
#define M1 8000100
using namespace std; const int mod=;
struct SEG{
int root1[N1],root2[N1],ls[M1],rs[M1],sz[M1],tot;
inline void pushup(int rt){ sz[rt]=sz[ls[rt]]+sz[rs[rt]]; }
void update(int x,int l,int r,int r1,int &r2)
{
if((!r2)||(r1==r2)){ r2=++tot; sz[r2]=sz[r1]; ls[r2]=ls[r1]; rs[r2]=rs[r1]; }
if(l==r){ sz[r2]++; return; }
int mid=(l+r)>>;
if(x<=mid) update(x,l,mid,ls[r1],ls[r2]);
else update(x,mid+,r,rs[r1],rs[r2]);
pushup(r2);
}
int query(int K,int l,int r,int r1,int r2)
{
if(K>sz[r1]-sz[r2]) return ;
if(l==r) return l;
int mid=(l+r)>>;
if(K>sz[rs[r1]]-sz[rs[r2]])
return query(K-sz[rs[r1]]+sz[rs[r2]],l,mid,ls[r1],ls[r2]);
else return query(K,mid+,r,rs[r1],rs[r2]);
}
}s; int n,mx;
int P[N1],C[N1];
struct node{int id,x;}L[N1],R[N1];
int cmp(node s1,node s2){ return s1.x<s2.x; } void make()
{
int Padd, Pfirst, Pmod, Pprod, Cadd, Cfirst, Cmod, Cprod, Ladd, Lfirst, Lmod, Lprod, Radd, Rfirst, Rmod, Rprod, i;
scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",&Padd, &Pfirst, &Pmod, &Pprod, &Cadd, &Cfirst, &Cmod, &Cprod, &Ladd, &Lfirst, &Lmod, &Lprod, &Radd, &Rfirst, &Rmod, &Rprod);
P[]=Pfirst%Pmod; for(i=;i<=n;i++) P[i]=(1ll*P[i-]*Pprod+Padd+i)%Pmod;
C[]=Cfirst%Cmod; for(i=;i<=n;i++) C[i]=(1ll*C[i-]*Cprod+Cadd+i)%Cmod, mx=max(mx,C[i]); mx=max(mx,C[]);
L[].x=Lfirst%Lmod; for(i=;i<=n;i++) L[i].x=(1ll*L[i-].x*Lprod+Ladd+i)%Lmod;
R[].x=Rfirst%Rmod; for(i=;i<=n;i++) R[i].x=(1ll*R[i-].x*Rprod+Radd+i)%Rmod;
for(i=;i<=n;i++){ L[i].id=i, R[i].id=i; if(L[i].x>R[i].x) swap(L[i].x,R[i].x); }
sort(L+,L+n+,cmp); sort(R+,R+n+,cmp);
for(i=;i<=n;i++) s.update(C[L[i].id],,mx,s.root1[i-],s.root1[i]);
for(i=;i<=n;i++) s.update(C[R[i].id],,mx,s.root2[i-],s.root2[i]);
}
int ans[N1]; int main()
{
scanf("%d",&n);
make();
int i,j,l,r,mid,xl,xr,ret=;
for(i=;i<=n;i++)
{
if(P[i]<L[].x||P[i]>R[n].x) continue;
l=,r=n,xl=;
while(l<=r)
{
mid=(l+r)>>;
if(L[mid].x<=P[i]) xl=mid,l=mid+;
else r=mid-;
}
l=,r=n,xr=;
while(l<=r)
{
mid=(l+r)>>;
if(R[mid].x<=P[i]-) xr=mid,l=mid+;
else r=mid-;
}
ans[i]=s.query(i,,mx,s.root1[xl],s.root2[xr]);
(ret+=ans[i])%=mod;
}
printf("%d\n",ret);
return ;
}
BZOJ 2161 布娃娃 (主席树)的更多相关文章
- BZOJ 3524 Couriers | 主席树
BZOJ 3524 Couriers 题意 求一个区间内出现超过区间长度的一半的数,如果没有则输出0. 题解 我可能太菜了吧--这道题愣是没想出来-- 维护权值主席树,记录每个数都出现过多少次: 查询 ...
- bzoj 2588 树上主席树
主席树上树,对于每个节点,继承其父亲的,最后跑f[x]+f[y]-f[lca]-f[fa[lca]] 去重竟然要减一,我竟然不知道?? #include<cstdio> #include& ...
- bzoj 2653: middle (主席树+二分)
2653: middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2522 Solved: 1434[Submit][Status][Disc ...
- BZOJ - 2809 dispatching 主席树+dfs序
在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同时增强忍者们的 ...
- BZOJ 3956: Count 主席树 可持久化线段树 单调栈
https://www.lydsy.com/JudgeOnline/problem.php?id=3956 从描述可以得到性质: 每个好点对 ( 除了差值为1的好点对 ) 中间的数 ( i , j ) ...
- bzoj 2653 middle(主席树)
题面:https://vjudge.net/problem/HYSBZ-2653 博客:https://blog.csdn.net/litble/article/details/78984846 这个 ...
- BZOJ 2735: 世博会 主席树+切比雪夫距离转曼哈顿距离
2735: 世博会 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 124 Solved: 51[Submit][Status][Discuss] D ...
- bzoj 3653 谈笑风生——主席树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3653 原来一直想怎么线段树合并.可是不会把角标挪一位. 查询的其实是子树内一段深度的点的 s ...
- bzoj 3653 谈笑风生 —— 主席树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3653 对于一个 (a,b,c),分成 b 是 a 的祖先和 b 在 a 子树里两部分: 第一 ...
随机推荐
- nginx中父子进程工作的主体函数
依据Nginx(0.7.67版本号)的代码.对Nginx主要的进程创建,进程主体以及事件处理进行了简要的分析. 基本上,父进程(即主进程)一開始会初始化及读取配置.并载入各模块的功能,然后fork() ...
- SEO 爬虫原理介绍
一篇关于网络爬虫程序的一些原理及体系结构纯技术文章,一些地方可能不会看的非常明确.对于SEO行业,常常和搜索引擎及其爬虫程序打交道,细致浏览下,一些不清楚而自己又非常想了解的地方,能够借助搜索来需找相 ...
- 点击TButton后的执行OnClick和OnMouseDown两个事件的过程(其实是通过WM_COMMAND执行程序员的代码)
问题的来源:在李维的<深入浅出VCL>一书中提到了点击TButton会触发WM_COMMAND消息,正是它真正执行了程序员的代码.也许是我比较笨,没有理解他说的含义.但是后来经过追踪代码和 ...
- Swift - 将Data数据转换为[UInt8](bytes字节数组)
有时上传或者发送图片.文字时,需要将数据转换为 bytes 字节数组.下面介绍两种将 Data 转换为 [UInt8] 的方法. 假设我们有如下 Data 数据要转换: 1 let data = &q ...
- 样条函数(spline function)—— 分段多项式函数(piecewise polynomial function)
1. 分段多项式函数 样条函数是某种意义上的分段函数. Spline (mathematics) - Wikipedia 最简单的样条函数是一种分段多项式函数(piecewise polynomial ...
- 建模:3D建模
ylbtech-建模:3D建模 “3D建模”通俗来讲就是通过三维制作软件通过虚拟三维空间构建出具有三维数据的模型.3D建模大概可分为:NURBS和多边形网格. NURBS对要求精细.弹性与复杂的模型有 ...
- SpringAop中JoinPoint对象
来自:http://blog.csdn.net/it_zouxiang/article/details/52576917 JoinPoint的用法 JoinPoint 对象 JoinPoint对象封装 ...
- LINUX/UNIX找回删除的文件
当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹.管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志.有时可以通过lsof来恢复这些 ...
- jQuery不熟点总结
jQuery 事件 1 .trigger() 方法触发被选元素的指定事件类型. 2 .delegate() 事件委派 1.不占内存2.可以给未来元素(后期动态添加的元素)添加事件. 2. 添加元 ...
- Spark Streaming概念学习系列之SparkStreaming性能调优
SparkStreaming性能调优 合理的并行度 减少批处理所消耗时间的常见方式还有提高并行度.有以下三种方式可以提高并行度: 1.增加接收器数目 有时如果记录太多导致单台机器来不及读入并分发的话, ...