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存操作, ...
随机推荐
- VS2017 EF本地数据库链接
1. 本地数据库连接 server name可以从链接字符串中取: (localdb)\MSSQLLocalDB 注意少写一个\. { "Logging": { "Inc ...
- iOS 防止离屏渲染为 image 添加圆角
// image 分类 - (UIImage *)circleImage{ // NO 代表透明 UIGraphicsBeginImageContextWithOptions(self.siz ...
- 【PAT】B1018 锤子剪刀布
抄的柳婼小姐姐的,感觉三个数求最大那里用的真棒 #include <stdio.h> int main() { int N; scanf("%d", &N); ...
- Vector与ArrayList区别
1)Vector的方法都是同步的(Synchronized),是线程安全的: ArrayList的方法是线程不安全的. 由于线程同步必然会影响性能,因此,ArrayList的性能比Vector好. 请 ...
- ElasticSearch(九):elasticsearch-head插件安装
安装node 安装elasticsearch-head需要node.js的支持. 下载最新的node.js,下载地址:https://nodejs.org/en/download/ 将下载后的安装包放 ...
- web开发-Django博客系统
项目界面图片预览 项目代码github地址 项目完整流程 项目流程: 1 搞清楚需求(产品经理) (1) 基于用户认证组件和Ajax实现登录验证(图片验证码) (2) 基于forms组件和Ajax实现 ...
- ES ik分词器使用技巧
match查询会将查询词分词,然后对分词的结果进行term查询. 然后默认是将每个分词term查询之后的结果求交集,所以只要分词的结果能够命中,某条数据就可以被查询出来,而分词是在新建索引时指定的,只 ...
- centos7内网源站建设
centos7内网源站建设 1.部署环境: 系统:Centos7 x86_64 应用服务:nginx.createrepo.reposync 镜像源:https://mirrors.aliyun.co ...
- 基于 HTML5 的 WebGL 自定义 3D 摄像头监控模型
前言 随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的同时,在监控系统中面临着严峻的现状问 ...
- 周末学习笔记——day01(函数,函数对象,嵌套调用,名称空间,作用域,闭包,装饰器)
一,复习 字符编码 文件头:py2—ASCII,py3—UTF-8 三种字符串:u' ' b ' ' r ' ' u' ' .endcode(' utf-8 ') b' '.deconde(' utf ...