【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轴离散化做扫描线,线段树维护一个扫描区间 ...
随机推荐
- 标准C程序设计七---50
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- 36深入理解C指针之---结构体的内存处理
一.有关结构体的内存处理包括,结构体指针和结构体成员指针的内存分配.结构体成员的数据对齐.结构体的内存释放 1.定义:与自定义数据类型(结构体)有关的内存分配.大小和释放问题 2.特征: 1).用内存 ...
- iOS开发之手势gesture详解(二)
与其他用户界面控件交互 UIControl子类会覆盖parentView的gesture.例如当用户点击UIButton时,UIButton会接受触摸事件,它的parentView不会接收到.这仅适用 ...
- phpcms V9 安装黄页模块后,注册为普通会员并登录,点立即免费入驻企业库出现白板
解决步骤: 1. 将php.ini修改: display_errors = On 2. 再次尝试,显示出错误: Fatal error: require(): Failed opening requi ...
- C语言集锦(二) 图像显示 Windows和Linux
关于图像显示有很多库可以用,Windows下有GDI,GDI+,D3D等,Linux下有X Window和Wayland,此外还有OpenGL ,SDL等图形库以及各种GUI库. 了解最原始的方式,对 ...
- UVA - 10050 Hartals
#include <cstdio> #include <cstring> ]; ]; int main() { int t; scanf("%d", &am ...
- Java通过开启线程池实现多线程
计算1..100 和1...200 的和,使用线程池开启两个线程 调用Executors类的newFixedThreadPool方法参数是线程池容纳的线程数量 这里是2 返回的对象是 Executo ...
- JavaScript奇技淫巧44招(2)
JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是 ...
- n*n的正方形网格中有多少个长方形
n*n的正方形网格中有横竖各n+1条直线,其中,任意各取两条都可以组成一个长方形﹙正方形也是长方形﹚.所以长方形个数为C﹙n+2,2﹚×C﹙n+2,2﹚=﹙n+1﹚²n²/4个.如果正方形不算,则N= ...
- docker 如何清理垃圾呢
应用容器在宿主机上长期运行,应用实例启停容器,会产生大量的停止的容器,无容器使用的数据卷.网络配置,无容器依赖的镜像,这些垃圾日积月累,会影响到宿主机的运行状态,造成机子卡顿等现象.因此,需要对这些宿 ...