【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 输出当前最小值,若不存 ...
随机推荐
- 【BZOJ4650】[NOI2016] 优秀的拆分(后缀数组)
点此看题面 大致题意: 定义将一个字符串拆成\(AABB\)的形式为优秀拆分,求一个字符串所有子串的优秀拆分个数. 后缀数组 这题可是一道后缀数组黑题啊. 其实看完题解这题还是挺简单的. 大致思路 显 ...
- 启动tomcat的Cannot find ./catalina.sh 的问题
从终端进入tomcat的bin目录,然后执行startup.sh Cannot find bin/catalina.sh The file is absent or does not have exe ...
- js字符串的使用
Javascript的内置功能之一就是字符串连接,如果+号用于两个字符串连接 var s="hello,world" //想要查找给定位置的字符 s.cha ...
- vue列表过渡效果
<transition-group></transition-group> ① 列表 <transition-group> </transition-grou ...
- c++ 软件下载 Dev cpp下载
下载地址: 链接: https://pan.baidu.com/s/1hsiWQPY 密码: bdpn
- MySQL批量插入大量数据方法
在MySQL数据库中,如果要插入上百万级的记录,用普通的insert into来操作非常不现实,速度慢人力成本高,推荐使用Load Data或存储过程来导入数据,我总结了一些方法分享如下,主要基于My ...
- Serializer序列器
定义Serializer 1. 定义方法 Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializ ...
- C、C++混合调用——博客收藏
C与C++接口相互调用:https://www.cnblogs.com/feige1314/p/7890982.html C.C++混合调用:https://www.cnblogs.com/xuany ...
- Codeforces Round #462 (Div. 2) D. A Determined Cleanup
D. A Determined Cleanup time limit per test1 second memory limit per test256 megabytes Problem Descr ...
- String使用方法详解
标准c++中string类函数介绍 注意不是CString 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作 ...