【bzoj3932】 CQOI2015—任务查询系统

http://www.lydsy.com/JudgeOnline/problem.php?id=3932 (题目链接)

题意

  给出$m$个区间,每个区间有一个权值,$n$组询问,每次询问在位置$x$权值前$k$大的区间的权值和。

Solution

  扫描线搞一下然后主席树维护即可。

细节

  查询的时候注意叶子节的情况

代码

// bzoj3932
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define lim 10000000
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std;

const int maxn=200010;
int n,m,sz,rt[maxn];
struct data {
	int pos,w,op;
	friend bool operator < (data a,data b) {return a.pos<b.pos;}
}t[maxn];
struct node {
	int son[2],s;LL val;
	int& operator [] (int x) {return son[x];}
}tr[maxn*50];

namespace Chairtree {
	void insert(int &u,int v,int l,int r,int val,int op) {
		if (!u) u=++sz;
		if (l==r) {tr[u].s=tr[v].s+op;tr[u].val=tr[u].s*l;return;}
		int mid=(l+r)>>1;
		if (val<=mid) insert(tr[u][0],tr[v][0],l,mid,val,op),tr[u][1]=tr[v][1];
		else insert(tr[u][1],tr[v][1],mid+1,r,val,op),tr[u][0]=tr[v][0];
		tr[u].s=tr[tr[u][0]].s+tr[tr[u][1]].s;
		tr[u].val=tr[tr[u][0]].val+tr[tr[u][1]].val;
	}
	LL query(int k,int l,int r,int x) {
		if (!k) return 0;
		if (l==r) return (LL)l*x;
		int mid=(l+r)>>1,c=tr[tr[k][0]].s;
		if (x==c) return tr[tr[k][0]].val;
		else if (x<c) return query(tr[k][0],l,mid,x);
		else return query(tr[k][1],mid+1,r,x-c)+tr[tr[k][0]].val;
	}
}
using namespace Chairtree;

int main() {
	scanf("%d%d",&m,&n);
	for (int u,v,w,i=1;i<=m;i++) {
		scanf("%d%d%d",&u,&v,&w);
		t[(i<<1)-1]=(data){u,w,1};
		t[i<<1]=(data){v+1,w,-1};
	}
	sort(t+1,t+1+m*2);
	for (int i=1,p=1;i<=m<<1;i++,p++) {
		for (;p<t[i].pos;p++) rt[p]=rt[p-1];
		insert(rt[p],rt[p-1],1,lim,t[i].w,t[i].op);
		while (t[i+1].pos==t[i].pos) {
			int tmp=0;i++;
			insert(tmp,rt[p],1,lim,t[i].w,t[i].op);
			rt[p]=tmp;
		}
	}
	LL ans=1;
	for (int x,k,i=1;i<=n;i++) {
		LL a,b,c;
		scanf("%d%lld%lld%lld",&x,&a,&b,&c);
		k=1+(a*ans+b)%c;
		ans=query(rt[x],1,lim,k);
		printf("%lld\n",ans);
	}
	return 0;
}
时间: 2024-11-03 21:49:48

【bzoj3932】 CQOI2015—任务查询系统的相关文章

[bzoj3932][CQOI2015]任务查询系统-题解[主席树][权值线段树]

Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行 ),其优先级为Pi.同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同.调度系统会经常向 查询系统询问,第Xi秒正在运行的任务中,优先级最小的Ki个任务(即将任务按照优先级从小到大排序后取前Ki个 )的优先级之和是多少.特别的,如

[bzoj3932][CQOI2015][任务查询系统] (主席树)

Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行 ),其优先级为Pi.同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同.调度系统会经常向 查询系统询问,第Xi秒正在运行的任务中,优先级最小的Ki个任务(即将任务按照优先级从小到大排序后取前Ki个 )的优先级之和是多少.特别的,如

BZOJ3932: [CQOI2015]任务查询系统

传送门 真不知道我没学主席树之前是有什么勇气说自己高级数据结构以及学的七七八八了. 这道题应该也是算是主席树的经典运用. 刚开始脑抽了,想把(S,E,P)的处理直接在线用树状数组xjb搞搞算了.写完后才意识到树状数组无法(很难?)实现区间修改. 然后想了想既然这个是一下子把所有修改都放上了直接用树状数组差分一下不就好了! 然后又深感自己制杖,为什么要用树状数组差分呢,直接开几个vector维护一下就行了. 说是修改,本质上是不带修改的主席树,很快搞完.WA,眼查,无果,跟踪,无果. 拍了几组小数

bzoj3932 [CQOI2015]任务查询系统——主席树

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3932 第二道主席树!本来想自己手胡一下,但是还是写不下去了... 参考博客:https://www.cnblogs.com/CQzhangyu/p/6295579.html 就是对每个时间节点建一棵权值线段树,节点太多所以开成主席树: WA了好久,竟然是错在二分的地方了???看了半天还是不知道为什么错,那个写法已经用了好久了啊... 代码如下: #include<iostream> #i

3932: [CQOI2015]任务查询系统

3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2559  Solved: 819[Submit][Status][Discuss] Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行 ),其优先级为P

BZOJ3932:[CQOI2015]任务查询系统——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=3932 题面源于洛谷 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi.同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同.调度系统会经常向查询系统询问,第Xi秒正在运行的任务中,

bzoj 3932: [CQOI2015]任务查询系统

Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行 ),其优先级为Pi.同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同.调度系统会经常向 查询系统询问,第Xi秒正在运行的任务中,优先级最小的Ki个任务(即将任务按照优先级从小到大排序后取前Ki个 )的优先级之和是多少.特别的,如

P3168 [CQOI2015]任务查询系统(主席树)

题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi.同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同.调度系统会经常向查询系统询问,第Xi秒正在运行的任务中,优先级最小的Ki个任务(即将任务按照优先级从小到大排序后取前Ki个)的优先级之和是多少.特别的,如果Ki大于第Xi秒正在

[CQOI2015]任务查询系统

Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组\((S_i,E_i,P_i)\)描述,\((S_i,E_i,P_i)\)表示任务从第\(S_i\)秒开始,在第\(E_i\)秒后结束(第\(S_i\)秒和\(E_i\)秒任务也在运行),其优先级为\(P_i\).同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同.调度系统会经常向查询系统询问,第\(X_i\)秒正在运行的任务中,优先级最小的\(K