题面

想了一个主席树做法

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

对$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. 19 个必须知道的 VS 快捷键

    本文将为大家列出在Visual Studio中常用的快捷键,正确熟练地使用快捷键,将大大提高你的编程工作效率. 项目相关的快捷键 Ctrl + Shift + B = 生成项目 Ctrl + Alt ...

  2. vue+element-ui实现前端分页

    按照他的文档来写分页 最主要的是  el-table里面展示的数据怎么处理 <el-table :data="AllCommodityList.slice((currentPage-1 ...

  3. oc13--pragma mark

    // // main.m // #pragma mark基本使用 // // Created by xiaomage on 15/6/18. // Copyright (c) 2015年 xiaoma ...

  4. bzoj4956: [Wf2017]Secret Chamber at Mount Rushmore

    F......loyd? 这范围也是..... 然而大了也不会.... #include<cstdio> #include<iostream> #include<cstr ...

  5. hdoj--2151--Worm(dp)

    Worm Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  6. javascript定义类或对象的方式

    本文介绍的几种定义类或对象的方式中,目前使用最广泛的是:混合的构造函数/原型方式.动态原型方式.不要单独使用经典的构造函数或原型方式. 工厂方式 构造器函数 原型方式 混合的构造函数/原型方式 动态原 ...

  7. Android平台下的TCP/IP传输(客户端)

    在工科类项目中,嵌入式系统与软件系统或后台数据库之间的信息传输是实现“物联网”的一种必要的途径,对已简单概念的物联网,通常形式都是一个单片机/嵌入式系统实现数据的采集及其处理,通过蓝牙,wifi或者是 ...

  8. Tomcat修改默认根目录

    tomcat7默认的程序发布路径为tomcat/webapps/ROOT/下面 修改Tomcat配置文件server.xml <Host name="localhost" a ...

  9. Vue-router记录

    一.嵌套路由默认选中第一个子路由 可以给主路由加一个重定向的属性,把路径指向相应的子路由. { path: '/home', name: 'Home', //重定向 redirect: '/home/ ...

  10. [hihocoder][Offer收割]编程练习赛44

    扫雷游戏 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #includ ...