题面

想了一个主席树做法

我们把每个区间的两个端点拆开

对$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 布娃娃 (主席树)的更多相关文章

  1. BZOJ 3524 Couriers | 主席树

    BZOJ 3524 Couriers 题意 求一个区间内出现超过区间长度的一半的数,如果没有则输出0. 题解 我可能太菜了吧--这道题愣是没想出来-- 维护权值主席树,记录每个数都出现过多少次: 查询 ...

  2. bzoj 2588 树上主席树

    主席树上树,对于每个节点,继承其父亲的,最后跑f[x]+f[y]-f[lca]-f[fa[lca]] 去重竟然要减一,我竟然不知道?? #include<cstdio> #include& ...

  3. bzoj 2653: middle (主席树+二分)

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2522  Solved: 1434[Submit][Status][Disc ...

  4. BZOJ - 2809 dispatching 主席树+dfs序

    在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同时增强忍者们的 ...

  5. BZOJ 3956: Count 主席树 可持久化线段树 单调栈

    https://www.lydsy.com/JudgeOnline/problem.php?id=3956 从描述可以得到性质: 每个好点对 ( 除了差值为1的好点对 ) 中间的数 ( i , j ) ...

  6. bzoj 2653 middle(主席树)

    题面:https://vjudge.net/problem/HYSBZ-2653 博客:https://blog.csdn.net/litble/article/details/78984846 这个 ...

  7. BZOJ 2735: 世博会 主席树+切比雪夫距离转曼哈顿距离

    2735: 世博会 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 51[Submit][Status][Discuss] D ...

  8. bzoj 3653 谈笑风生——主席树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3653 原来一直想怎么线段树合并.可是不会把角标挪一位. 查询的其实是子树内一段深度的点的 s ...

  9. bzoj 3653 谈笑风生 —— 主席树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3653 对于一个 (a,b,c),分成 b 是 a 的祖先和 b 在 a 子树里两部分: 第一 ...

随机推荐

  1. ZooKeeper搭建系列集 (这套很全,也很详细)

    原文链接:http://blog.csdn.net/shatelang/article/details/7596007 本篇文章结构: 总共包括10个系列 ZooKeeper系列之一:ZooKeepe ...

  2. FaceBook推出的Android图片载入库-Fresco

    欢迎关注ndroid-tech-frontier开源项目,定期翻译国外Android优质的技术.开源库.软件架构设计.測试等文章 原文链接:Introducing Fresco: A new imag ...

  3. Vultr好server不敢独享

    Vultr是一家美国2014年成立的新公司.瞬间红遍世界,他是干什么的?他是serverVPS(Virtual Private Server)提供商,这个价格真实惊人的廉价5美金/月.折合人民币30元 ...

  4. 车载导航系统中GPS的定位

    首先购买的车载导航系统有GPS信号接受功能,能够接收GPS的经纬度信号,然后导航终端里面安装的导航地图能够非常详细的显示详细的经纬度坐标和地物信息.导航终端通过接收器接收到卫星24小时不间断发射的免费 ...

  5. 编程基础知识——C++能不能支持Java和ObjC的反射?

    C++能不能支持Java和ObjC的反射? 要回答这个问题.首先我们要清楚什么是反射.什么是反射? 教科书的解释我就不说了,(^o^)事实上我也记不得.实际开发应用的反射就是在没有某个类型的头文件或者 ...

  6. BNU 34990 Justice String 2014 ACM-ICPC Beijing Invitational Programming Contest

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34990 DEBUG了非常久,还是legal的推断函数写错了... 此题做法.枚举Stri ...

  7. Tomcat启动时项目反复载入,导致资源初始化两次的问题

    近期在项目开发測试的时候,发现Tomcat启动时项目反复载入,导致资源初始化两次的问题  导致该问题的解决办法: 例如以下图:在Eclipse中将Server Locations设置为"Us ...

  8. 确定比赛名次--hdoj

    确定比赛名次 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  9. Java Colections 集合类 —— List、ArrayList、Set(HashSet)

    0. List<T> 是一个接口 该接口定义的高级成员函数有: contains() ⇒ 是否包含: String[] people; List names = Arrays.asList ...

  10. 【联系】—— Beta 分布与二项分布、共轭分布

    1. 伯努利分布与二项分布 伯努利分布:Bern(x|μ)=μx(1−μ)1−x,随机变量 x 取值为 0,1,μ 表示取值为 1 的概率: 二项分布:Bin(m|N,μ)=(Nm)μm(1−μ)N− ...