BZOJ3932 主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=3932
题意:给出一些带有等级的线段,求一点上前K小个等级线段的等级之和
询问是对于每一个点询问前K小的和,比较容易想到的是对每一个点都建立一颗权值线段树,维护点的数量和点的等级和。
问题是空间太大,即使动态开点也远远不够,所以考虑用主席树来优化。
由于主席树和前缀和密切相关的特性,我们可以考虑用差分,每一个点T[i]代表这个点的权值线段树,对于一条线段,在S[i]出加上,E[i] + 1处减去,在建立主席树的同时就可以维护出所有点的权值线段树,直接查询即可。
注意:一看数据范围是要离散化的,但是如果去重之后,在权值线段树上取前K个就会遇到一个相同的点上有K + 1个这样的情况,这种情况可以考虑return sum / cnt * k,也可以选择不去重。
#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define For(i, x, y) for(int i=x;i<=y;i++)
#define _For(i, x, y) for(int i=x;i>=y;i--)
#define Mem(f, x) memset(f,x,sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Sca2(x,y) scanf("%d%d",&x,&y)
#define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define Scl(x) scanf("%lld",&x);
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x);
#define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
#define LL long long
#define ULL unsigned long long
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second
typedef vector<int> VI;
int read(){int x = ,f = ;char c = getchar();while (c<'' || c>''){if (c == '-') f = -;c = getchar();}
while (c >= ''&&c <= ''){x = x * + c - '';c = getchar();}return x*f;}
const double eps = 1e-;
const int maxn = 1e5 + ;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
int N,M,K;
LL Hash[maxn];
struct Task{
LL S,E,P;
Task(){}
Task(LL S,LL E,LL P):S(S),E(E),P(P){}
}task[maxn];
vector<int>Q[][maxn];
struct Tree{
int lt,rt;
LL cnt,sum;
}tree[maxn * ];
int T[maxn],tot;
void newnode(int &t){
t = ++tot;
tree[t].cnt = tree[t].sum = ;
}
void Build(int &t,int l,int r){
newnode(t);
if(l == r) return;
int m = l + r >> ;
Build(tree[t].lt,l,m);
Build(tree[t].rt,m + ,r);
}
void update(int &t,int pre,int l,int r,LL p,LL flag){
newnode(t);
tree[t] = tree[pre];
tree[t].sum += Hash[p] * flag; tree[t].cnt += flag;
if(l == r) return;
int m = l + r >> ;
if(p <= m) update(tree[t].lt,tree[pre].lt,l,m,p,flag);
else update(tree[t].rt,tree[pre].rt,m + ,r,p,flag);
}
LL query(int t,int l,int r,int k){
if(l == r) return Hash[l];
int m = l + r >> ;
int num = tree[tree[t].lt].cnt;
if(num >= k) return query(tree[t].lt,l,m,k);
else return query(tree[t].rt,m + ,r,k - num) + tree[tree[t].lt].sum;
}
bool cmp(Task a,Task b){
return a.P < b.P;
}
int main(){
Sca2(M,N);
for(int i = ; i <= M ; i ++){
LL S = read(),E = read(),P = read();
task[i] = Task(S,E,P);
Hash[i] = P;
}
sort(Hash,Hash + + M);
sort(task + ,task + + M,cmp);
for(int i = ; i <= M ; i ++){
LL S = task[i].S,E = task[i].E,P = task[i].P;
Q[][S].pb(i);
Q[][E + ].pb(i);
}
Build(T[],,M);
for(int i = ; i <= N + ; i ++){
int pre = T[i] = T[i - ];
for(int j = ; j < Q[][i].size(); j ++){
int v = Q[][i][j];
update(T[i],pre,,M,v,);
pre = T[i];
}
for(int j = ; j < Q[][i].size(); j ++){
int v = Q[][i][j];
update(T[i],pre,,M,v,-);
pre = T[i];
}
}
LL Pre = ;
for(int i = ; i <= N ; i ++){
LL X = read(),A = read(),B = read(),C = read();
LL K = (A * Pre + B) % C + ;
if(K >= tree[T[X]].cnt) Pre = tree[T[X]].sum;
else Pre = query(T[X],,M,K);
Prl(Pre);
}
return ;
}
BZOJ3932 主席树的更多相关文章
- 任务查询系统(cqoi2015,bzoj3932)(主席树)
最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组\((S_i,E_i,P_i)\)描述,\((S_i,E_i,P_i)\)表示任务从第 ...
- 【BZOJ3932】[CQOI2015]任务查询系统 主席树
[BZOJ3932][CQOI2015]任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si, ...
- BZOJ3932 CQOI2015 任务查询系统 【主席树】
BZOJ3932 CQOI2015 任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei, ...
- [bzoj3932][CQOI2015]任务查询系统_主席树
任务查询系统 bzoj-3932 CQOI-2015 题目大意:最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述 ...
- [bzoj3932][CQOI2015][任务查询系统] (主席树)
Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...
- 【BZOJ3932】任务查询系统(主席树)
[BZOJ3923]任务查询系统(主席树) 题面 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei ...
- BZOJ3932: [CQOI2015]任务查询系统 主席树
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4869 Solved: 1652[Submit][St ...
- BZOJ3932[CQOI2015]任务查询系统——主席树
题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第E ...
- bzoj3932 / P3168 [CQOI2015]任务查询系统(主席树+差分)
P3168 [CQOI2015]任务查询系统 看到第k小,就是主席树辣 对于每一段任务(a,b,k),在版本a的主席树+k,版本b+1的主席树-k 同一时间可能有多次修改,所以开个vector存操作, ...
随机推荐
- Zabbix常见触发器表达式
Zabbix trigger是zabbix 进行告警通知的设定条件 ,当监控获取的值触发了设定的条件时,会按照触发器的设定,执行相应的action 操作 .在zabbix中为了比较方便的设定各种条件, ...
- 周末班:Python基础之网络编程
一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好.但是如果这两个程序之间想要传递一个数据, ...
- 【Python 01】Python可以做什么
Python学习未来方向: 1.数据分析 2.自然语言处理 3.社交网络分析 4.人工智能 5.深度学习 6.计算机视觉 7.网络爬虫 8.量化交易
- java.util.NoSuchElementException问题定位
Iterator 迭代器越界 例子如下: Iterator i = set.iterator(); while (i.hasNext()) { System.out.println(i.next()) ...
- day7-基础函数的学习(二)
过了元旦,加油鸭,冲鸭!!! 闲话不说,开始今日份学习整理. 今日目录,今天的学习内容不是很多! 1.函数名的运用 2.闭包(重要) 3.迭代器(重要) 开始今日份总结 1.函数名的运用 1.1函数名 ...
- Jetson TX2(3)opencv3 打开usb摄像头
ubuntu2604 opencv3.4.0 https://blog.csdn.net/ultimate1212/article/details/80936175?utm_source=blogxg ...
- 如何用php实现分页效果
分页效果在网页中是常见的,可是怎样才能实现分页呢,今天做了两种方法来实现一下分页的效果 首先,我们需要准备在数据库里面准备一个表,并且插入数据,这些都是必需的前提工作了,不多说,如图所示(库名为jer ...
- redis 基本原理及安装
一:什么是redis? Redis 是一个开源的,高性能的,基于键值对的缓存与存储系统.通过提供多种键值数据类型来适应不同场景下的缓存与存储需求. 二:redis数据库有什么优点? Redis数据库中 ...
- plsql连接数据库出现乱码
在windows中创 建一个名为"NLS_LANG"的系统环境变量,设置其值为"SIMPLIFIED CHINESE_CHINA.ZHS16GBK", sele ...
- sklearn.neural_network.MLPClassifier参数说明
目录 sklearn.neural_network.MLPClassifier sklearn.neural_network.MLPClassifier MLPClassifier(hidden_la ...