bzoj 2161: 布娃娃 (扫描线+线段树)
来源:互联网 发布:淘宝抢购提醒查看 编辑:程序博客网 时间:2024/04/30 07:23
题目描述
传送门
题解
把l[i],r[i]看成是l[i]处加入,r[i]+1处删除。
因为要查询的是第k大的问题,所以我们将c[i]离散化后建立权值线段树即可。
代码
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>#define N 400003#define p 19921228#define LL long longusing namespace std;int Padd, Pfirst, Pmod, Pprod, Cadd, Cfirst, Cmod, Cprod, Ladd, Lfirst, Lmod, Lprod, Radd, Rfirst, Rmod, Rprod;int tr[N*4],sum[N*4],n,a[N],b[N],c[N],P[N],l[N],r[N],cnt;struct data{ int id,opt,x,y,t,val;}q[N];void init(int a[N],int add,int first,int mod,int prod){ a[1]=first%mod; for (int i=2;i<=n;i++) a[i]=(LL)((LL)a[i-1]*prod+add+i)%mod;}int cmp(data a,data b){ return a.x<b.x||a.x==b.x&&a.opt<b.opt;}void update(int now){ tr[now]=tr[now<<1]+tr[now<<1|1];}void pointchange(int now,int l,int r,int x,int val){ if (l==r) { tr[now]+=val; return; } int mid=(l+r)/2; if (x<=mid) pointchange(now<<1,l,mid,x,val); else pointchange(now<<1|1,mid+1,r,x,val); update(now);}int find(int now,int l,int r,int k){ if(l==r) return l; int mid=(l+r)/2; if(tr[now<<1]>=k) return find(now<<1,l,mid,k); else return find(now<<1|1,mid+1,r,k-tr[now<<1]);}int cmp1(int x,int y){ return x>y;}int main(){ freopen("a.in","r",stdin); freopen("my.out","w",stdout); scanf("%d",&n); scanf("%d%d%d%d",&Padd,&Pfirst,&Pmod,&Pprod); init(P,Padd,Pfirst,Pmod,Pprod); scanf("%d%d%d%d",&Cadd,&Cfirst,&Cmod,&Cprod); init(c,Cadd,Cfirst,Cmod,Cprod); scanf("%d%d%d%d",&Ladd,&Lfirst,&Lmod,&Lprod); init(l,Ladd,Lfirst,Lmod,Lprod); scanf("%d%d%d%d",&Radd,&Rfirst,&Rmod,&Rprod); init(r,Radd,Rfirst,Rmod,Rprod); for (int i=1;i<=n;i++)b[i]=c[i]; sort(b+1,b+n+1); int m=unique(b+1,b+n+1)-b-1; for (int i=1;i<=n;i++) { if (l[i]>r[i]) swap(l[i],r[i]); int t=lower_bound(b+1,b+m+1,c[i])-b; t=m-t+1; ++cnt; q[cnt].opt=1; q[cnt].x=l[i]; q[cnt].y=t; q[cnt].val=1; ++cnt; q[cnt].opt=1; q[cnt].x=r[i]+1; q[cnt].y=t; q[cnt].val=-1; ++cnt; q[cnt].opt=2; q[cnt].id=i; q[cnt].x=P[i]; } reverse(b+1,b+m+1); sort(q+1,q+cnt+1,cmp); int ans=0; for (int i=1;i<=cnt;i++){ if (q[i].opt==1) pointchange(1,1,m,q[i].y,q[i].val); if (q[i].opt==2) if (tr[1]>=q[i].id) ans+=b[find(1,1,m,q[i].id)]%p; ans%=p; } printf("%d\n",ans);}
0 0
- bzoj 2161: 布娃娃 (扫描线+线段树)
- [扫描线 线段树] BZOJ 2161 布娃娃
- [BZOJ2161]布娃娃(扫描线+线段树)
- [BZOJ3161]布娃娃(扫描线+线段树)
- [BZOJ]2161: 布娃娃 权值线段树
- bzoj 2161: 布娃娃
- bzoj 2161: 布娃娃
- Bzoj 4422: [Cerc2015]Cow Confinement(线段树+扫描线)
- bzoj 1218: [HNOI2003]激光炸弹 (扫描线+线段树)
- bzoj 1818: [Cqoi2010]内部白点 (扫描线+线段树)
- bzoj 3958: [WF2011]Mummy Madness (扫描线+线段树)
- BZOJ 1818 线段树+扫描线
- BZOJ 4059 Cerc2012 Non-boring sequences 线段树+扫描线
- BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞
- [扫描线 线段树] BZOJ 4422 [Cerc2015]Cow Confinement
- bzoj 4059: [Cerc2012]Non-boring sequences 线段树+扫描线
- bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线(线段树扫描线)
- 线段树[扫描线]
- ASP.NET ajaxToolkit AutoCompleteExtender美化样式
- 单点登录原理与简单实现
- wireshark过滤规则
- c++复制构造函数和赋值操作符区别
- ionic2环境配置
- bzoj 2161: 布娃娃 (扫描线+线段树)
- ubuntu 安装Android studio
- MySQL优化sql语句查询常用的30种方法
- myeclipse 2015EI快速整合三大框架
- Java多线程的同步
- java replace和replaceAll的区别以及用法
- OC runtime 类与对象
- 大数据教程(三) Hadoop集群分布式坏境搭建
- jmeter学习笔记(三)-性能测试概念