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存操作, ...
随机推荐
- Asp.net mvc 项目返回Json
因mvc控制器返回类型JsonResult 在处理对象转JSON的时候,对日期的格式化处理并不太符合要求,所以重新继承抽象类ActionResult使用Newtonsoft.Json来系列化 usin ...
- #021 Java复习第一天
上学期在慧河工作室学习简单过java到面向对象就停止了 现在有事情又要用到java发现全忘了..... 快速复习一下 网课PPT 计算机: 硬件 + 软件 主要硬件: cpu :cpu是一个计算机的运 ...
- 【Linux基础】查看硬件信息-内存和硬盘
1.使用free命令查看内存使用 (1)内存总量大小:查看Mem中的total值3697M free -m total used free shared buffers cached -/+ buf ...
- js 设备判断(移动端pc端 安卓ios 微信)
苹果安卓判断 $(function () { var u = navigator.userAgent, app = navigator.appVersion; var isAndroid = u.in ...
- Linux-基础学习(二)-基本部署
开始今日份整理 1. 系统优化部分 1.1 Linux防火墙安全相关(重要) 1.1.1 SELinux功能 SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA ...
- Mysql_安装
安装环境:win7 1.下载zip安装包: MySQL8.0 For Windows zip包下载地址:https://dev.mysql.com/downloads/file/?id=476233, ...
- HTML多图无缝循环翻页效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- mariadb集群配置(主从和多主)
mariadb主从 主从多用于网站架构,因为主从的同步机制是异步的,数据的同步有一定延迟,也就是说有可能会造成数据的丢失,但是性能比较好,因此网站大多数用的是主从架构的数据库,读写分离必须基于主从架构 ...
- Firefox 中出现的 “Network Protocol Error”怎么办
Mozilla Firefox 多年来一直是我的默认 Web 浏览器,我每天用它来进行日常网络活动,例如访问邮件,浏览喜欢的网站等.今天,我在使用 Firefox 时遇到了一个奇怪的错误.我试图在 R ...
- Linux slave配置
说明:master机器为Windows,现将一台Linux机器作为slave进行配置.这台Linux机器为CentOS. 1.在Linux slave上的配置 ①创建名为jenkins用户 #sudo ...