【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 输出当前最小值,若不存 ...
随机推荐
- [论文理解]MetaAnchor: Learning to Detect Objects with Customized Anchors
MetaAnchor: Learning to Detect Objects with Customized Anchors Intro 本文我其实看了几遍也没看懂,看了meta以为是一个很高大上的东 ...
- 2018.5.27 OraclePLSQL编程 if-else练习和循环结构练习
if-else运用 declare v_num number(8); begin v_num :=&n; if v_num>0 and v_num<100 then dbms_ou ...
- 支持向量机: Maximum Margin Classifier
支持向量机即 Support Vector Machine,简称 SVM .我最开始听说这头机器的名号的时候,一种神秘感就油然而生,似乎把 Support 这么一个具体的动作和 Vector 这么一个 ...
- numpy.random.shuffle(x)的用法
numpy.random.shuffle(x) Modify a sequence in-place by shuffling its contents. Parameters: x : array_ ...
- C#语句对Access中数据更新问题――Update语法错误
所有字段最好都用[] 括起来: string sqlUpdate = "update UserInfo set [password] = '" + pass + "',[ ...
- Linux下面自动清理超过指定大小的文件
Linux下面自动清理超过指定大小的文件 思路:1)查找test目录下的所有的文件2)判断是否大于100M3)大于100M则清空 以byte为单位显示文件大小,然后和100M大小做对比. 100M换算 ...
- DevOps - 监控告警 - Zabbix
官网3.4版本中文文档 Zabbix documentation in Chinese [Zabbix Documentation 3.4] https://www.zabbix.com/docume ...
- C盘扩容 更改C盘大小
最近对xamarin有点兴趣,虽然网上的评论嘘声一片, 对于只想试一试的心态来说,对于网上所说的什么开发后的程序卡顿,可以用的三方库很少等, 我只想说,你们说的我不信,我要试一试看 我本来已经安装了v ...
- ZendFramework-2.4 源代码 - 关于服务管理器
// ------ 决定“服务管理器”配置的位置 ------ // 1.在模块的入口类/data/www/www.domain.com/www/module/Module1/Module.php中实 ...
- windows下CMD命令大全(仅供参考)
CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本)chcp 修改默认字符集chcp 936默认中文chcp 650011. appwiz.c ...