【BZOJ2161】布娃娃 扫描线+线段树
【BZOJ2161】布娃娃
Description
Input
Output
输出一个整数,代表所有布娃娃谜团答案的和除以19921228的余数。
Sample Input
2 3 4 3 1 4 5 2 3 6 9 1 1 2 3 4
Sample Output
题面补充:n<=10^5,注意,是“喜欢它”的布娃娃,不是“它喜欢”的布娃娃!(一开始写了个主席树。。。)
一句话题面:给你堆点和一堆线段,对于每个点,询问在所有覆盖它的线段中,权值第k大的权值是多少。
题解:直接上扫描线+权值线段树即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lson x<<1
#define rson x<<1|1
using namespace std;
typedef long long ll;
const int maxn=100010;
const int mod=19921228;
const int inf=100000000;
int n,tot,ans,nm;
int Padd,Pfirst,Pmod,Pprod,Cadd,Cfirst,Cmod,Cprod,Ladd,Lfirst,Lmod,Lprod,Radd,Rfirst,Rmod,Rprod;
int P[maxn],C[maxn],L[maxn],R[maxn],s[maxn<<2],ref[maxn];
struct Q1
{
int x,y,val;
}q1[maxn<<1];
struct Q2
{
int x,org;
}q2[maxn];
struct node
{
int num,org;
}p[maxn];
bool cmp1(Q1 a,Q1 b)
{
return a.x<b.x;
}
bool cmp2(Q2 a,Q2 b)
{
return a.x<b.x;
}
bool cmp3(node a,node b)
{
return a.num<b.num;
}
void updata(int l,int r,int x,int a,int b)
{
s[x]+=b;
if(l==r) return ;
int mid=l+r>>1;
if(a<=mid) updata(l,mid,lson,a,b);
else updata(mid+1,r,rson,a,b);
}
int query(int l,int r,int x,int b)
{
if(l==r) return ref[l];
int sm=s[rson],mid=l+r>>1;
if(b<=sm) return query(mid+1,r,rson,b);
return query(l,mid,lson,b-sm);
}
int main()
{
scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",&n,&Padd,&Pfirst,&Pmod,&Pprod,&Cadd,&Cfirst,&Cmod,&Cprod,&Ladd,&Lfirst,&Lmod,&Lprod,&Radd,&Rfirst,&Rmod,&Rprod);
int i,j;
P[1]=Pfirst%Pmod;
for(i=2;i<=n;i++) P[i]=((ll)P[i-1]*Pprod+Padd+i)%Pmod;
C[1]=Cfirst%Cmod;
for(i=2;i<=n;i++) C[i]=((ll)C[i-1]*Cprod+Cadd+i)%Cmod;
L[1]=Lfirst%Lmod;
for(i=2;i<=n;i++) L[i]=((ll)L[i-1]*Lprod+Ladd+i)%Lmod;
R[1]=Rfirst%Rmod;
for(i=2;i<=n;i++) R[i]=((ll)R[i-1]*Rprod+Radd+i)%Rmod;
for(i=1;i<=n;i++)
{
if(L[i]>R[i]) swap(L[i],R[i]);
q1[i].x=L[i],q1[i+n].x=R[i]+1,q1[i].val=1,q1[i+n].val=-1;
q2[i].x=P[i],q2[i].org=i;
p[i].num=C[i],p[i].org=i;
}
sort(p+1,p+n+1,cmp3);
ref[0]=-1;
for(i=1;i<=n;i++)
{
if(p[i].num>ref[nm]) ref[++nm]=p[i].num;
q1[p[i].org].y=q1[p[i].org+n].y=nm;
}
sort(q1+1,q1+2*n+1,cmp1);
sort(q2+1,q2+n+1,cmp2);
for(i=j=1;i<=n;i++)
{
for(;q1[j].x<=q2[i].x&&j<=2*n;j++) updata(1,nm,1,q1[j].y,q1[j].val);
if(s[1]>=q2[i].org) ans=(ans+query(1,nm,1,q2[i].org))%mod;
}
printf("%d",ans);
return 0;
}
【BZOJ2161】布娃娃 扫描线+线段树的更多相关文章
- HDU 3642 - Get The Treasury - [加强版扫描线+线段树]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树
[BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...
- HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)
Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the ...
- 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...
- hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积
题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> ...
- P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)
题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...
- BZOJ 2584: [Wc2012]memory(扫描线+线段树)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2584 题意:给出平面n个线段,任意两个线段严格不相交,且每个线段不平行于坐标轴.移 ...
- [BZOJ 1218] [HNOI2003] 激光炸弹 【n logn 做法 - 扫描线 + 线段树】
题目链接:BZOJ - 1218 题目分析 可以覆盖一个边长为 R 的正方形,但是不能包括边界,所以等价于一个边长为 R - 1 的正方形. 坐标范围 <= 5000 ,直接 n^2 的二维前缀 ...
- hdu4419 Colourful Rectangle 12年杭州网络赛 扫描线+线段树
题意:给定n个矩形,每个矩形有一种颜色,RGB中的一种.相交的部分可能为RG,RB,GB,RGB,问这n个矩形覆盖的面积中,7种颜色的面积分别为多少 思路:把x轴离散化做扫描线,线段树维护一个扫描区间 ...
随机推荐
- 【CF1016B】Segment Occurrences(模拟)
题意:给定两个串s和t,多次询问s的一个区间[l ,r]中有多少个子串与t串相同 len<=1e3,q<=1e5 思路:前缀和 #include<cstdio> #includ ...
- 转 markdown编写规则、语法
http://www.jianshu.com/p/1e402922ee32/ Markdown——入门指南 字数2231 阅读307754 评论115 喜欢1350 转载请注明原作者,如果你觉得这篇文 ...
- Linux 之 文件压缩解压
文件压缩解压 参考教程:[千峰教育] 命令: gzip: 作用:压缩文件,只能是单个文件,不能是多个,也不能是目录. 格式:gzip file 说明:执行命令会生成file.gz,删除原来的file ...
- react-native初始化项目的时候安装失败,如何解决【摘】
首先初始化项目报错: 解决方法: 将这个版本号改为: 然后将这里: 改为: 版本号相对应 然后便可安装成功! [注:转载:https://blog.csdn.net/wwrzyy/article/ ...
- pycharm上传代码到码云(详细)
如要转载 麻烦请您备注好原文出处!!!!(谢谢合作!) >>首先要去码云注册个账号 提示(尽量使用英文名)创建用户名 使用邮箱登录 >>然后创建库 >填写项目的基础信息 ...
- CountDownLatch、CyclicBarrier、Samephore浅谈三大机制
CountDownLatch.CyclieBarrier与SamePhore都可用来控制线程的执行,那么他们之间有什么区别呢 CountDownLatch CountDowenlatch可以看成一个线 ...
- Java并发容器,底层原理深入分析
ConcurrentHashMap ConcurrentHashMap底层具体实现 JDK 1.7底层实现 将数据分为一段一段的存储,然后给每一段数据配一把锁, 当一个线程占用锁访问其中一个段数据时, ...
- java保留n位小数
double x = 123456789.987654312; String.format("%.nf", x) n为保留的小数位,x必须为double类型. 例如保留3位小数 S ...
- Maven依赖机制理解
假设一个项目需要用到日志组件Log4j,那么有如下方式添加这个组件. 一.传统方式: 1.访问官网https://logging.apache.org/log4j/2.x/download.html, ...
- iOS -- SKViedoNode类
SKViedoNode类 继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) ...