【bzoj2161】布娃娃 权值线段树
题目描述
输入
输出
输出一个整数,代表所有布娃娃谜团答案的和除以19921228的余数。
样例输入
3
2 3 4 3 1 4 5 2 3 6 9 1 1 2 3 4
样例输出
4
题目大意
给你若干个区间,每个区间有一个权值。现在对于若干个点,求所有包含该点的区间中权值第k大的是多少。
题解
权值线段树
由于询问不是强制在线的,因此可以把所有位置排序,然后扫一遍。
对于每段区间,把它看成两个点:$l$位置加入,$r$位置删除。把每个区间的两个点和询问点以坐标为关键字放到一起排序,坐标相同的按照加入、询问、删除的顺序排序,然后从左向右扫一遍,扫到加入就把权值加入到权值线段树中;扫到询问就在权值线段树中查询第k大;扫到删除就在权值线段树中删除。
时间复杂度$O(n\log n)$。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
#define lson l , mid , x << 1
#define rson mid + 1 , r , x << 1 | 1
using namespace std;
typedef long long ll;
struct data
{
int p , org , id;
data(int p0 = 0 , int org0 = 0 , int id0 = 0) {p = p0 , org = org0 , id = id0;}
bool operator<(const data &a)const {return p == a.p ? org > a.org : p < a.p;}
}a[N * 3];
int P[N] , C[N] , L[N] , R[N] , v[N] , si[N << 2];
void update(int p , int a , int l , int r , int x)
{
si[x] += a;
if(l == r) return;
int mid = (l + r) >> 1;
if(p <= mid) update(p , a , lson);
else update(p , a , rson);
}
int query(int k , int l , int r , int x)
{
if(l == r) return l;
int mid = (l + r) >> 1;
if(k <= si[x << 1 | 1]) return query(k , rson);
else return query(k - si[x << 1 | 1] , lson);
}
int main()
{
int n , Padd , Pfirst , Pmod , Pprod , Cadd , Cfirst , Cmod , Cprod , Ladd , Lfirst , Lmod , Lprod , Radd , Rfirst , Rmod , Rprod , i , ans = 0;
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);
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]);
a[i * 3 - 2] = data(L[i] , 1 , i);
a[i * 3 - 1] = data(R[i] , -1 , i);
a[i * 3] = data(P[i] , 0 , i);
v[i] = C[i];
}
sort(v + 1 , v + n + 1);
for(i = 1 ; i <= n ; i ++ ) C[i] = lower_bound(v + 1 , v + n + 1 , C[i]) - v;
sort(a + 1 , a + 3 * n + 1);
for(i = 1 ; i <= 3 * n ; i ++ )
{
if(a[i].org) update(C[a[i].id] , a[i].org , 1 , n , 1);
else if(si[1] >= a[i].id) ans = (ans + v[query(a[i].id , 1 , n , 1)]) % 19921228;
}
printf("%d\n" , ans);
return 0;
}
【bzoj2161】布娃娃 权值线段树的更多相关文章
- BZOJ 2161 布娃娃(权值线段树)
题意 给n<1e5个娃娃,每个娃娃有属性\(p\),\(c\),\(l\),\(r\)(均在ll范围内),问你对每个娃娃\(i\),满足所有\(l_j\leq p_i\leq r_j\)的娃娃\ ...
- BZOJ_2161_布娃娃_权值线段树
BZOJ_2161_布娃娃_权值线段树 Description 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二 代考神,这和小时候培养的良好素质是 ...
- 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
- 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP
2892: 强袭作战 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 45 Solved: 30[Submit][Status][Discuss] D ...
- BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...
- 动态求区间K大值(权值线段树)
我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...
- 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树
原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...
- BZOJ_3685_普通van Emde Boas树_权值线段树
BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x 若x不存在,插入x 2 x 若x存在,删除x 3 输出当前最小值,若不存 ...
随机推荐
- World Wind Java开发之二 使用Winbuilders设计图形用户界面(转)
http://blog.csdn.net/giser_whu/article/details/40892955 在eclipse中使用WindowsBuildes可以像在VS中一样,拖拽用户图形界面. ...
- ARM体系结构与编程-3
ARM存储系统:ARM中用于存储管理的系统控制协处理器CP15:包括16个32位寄存器,其编号为0到15.实际上对于某些编号的寄存器可能相应有多个物理寄存器. 訪问CP15寄存器的指令:MRC.MCR ...
- 安装git 配置邮箱和用户名
git 查看用户名和邮箱地址 $ git config user.email $ git config user.name 运行命令来配置你的用户名和邮箱 $ git config --global ...
- AngularJs学习笔记-表单处理
表单处理 (1)Angular表单API 1.模板式表单,需引入FormsModule 2.响应式表单,需引入ReactiveFormsModule (2)模板式表单 在Angular中使用for ...
- 前端面试题1:Object.prototype.toString.call() 、instanceof 以及 Array.isArray()三种方法判别数组的优劣和区别
1. Object.prototype.toString.call() 每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object ...
- AngularJS1.X版本双向绑定九问
前言 由于工作的原因,使用angular1.x版本已经有一段时间了,虽然angualr2升级后就完全重构了,但每个版本存在也有一定的道理.话不多说,进入正题. 1.双向绑定的原理是什么? Angual ...
- 【转】【win网络编程】socket中的recv阻塞和select的用法
在编写ftp客户端程序时,在联通后使用recv函数进行接收欢迎信息时,需要申请内存进行接收数据保存,一次读取成功,但是由于一个随机的ftp服务端在说,欢迎信息的大小是不知道的,所以在尝试使用死循环,在 ...
- python的对数
python的对数 首先要导入 math 模块: import math import numpy as np math.log(8,2),此为以2为底8的对数 等于 math.log2(8); 等于 ...
- 51nod——1086、1257背包问题V2(多重背包二进制拆分转01) V3(分数规划+二分贪心)
V3其实和dp关系不大,思想挂标题上了,丑陋的代码不想放了.
- SAP销售订单屏幕增强行项目屏幕增强
1.在vbap表中 append一个自定义结构,如下图: 2.TCODE:SE80 程序名:SAPMV45A 屏幕:8459 如图: 3.标记增强的屏幕字段 4.屏幕增强的位置 *& ...