3932: [CQOI2015]任务查询系统

Time Limit: 20 Sec Memory Limit: 512 MB

Description

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

Input

输入文件第一行包含两个空格分开的正整数m和n,分别表示任务总数和时间范围。接下来m行,每行包含三个空格分开的正整数Si、Ei和Pi(Si≤Ei),描述一个任务。接下来n行,每行包含四个空格分开的整数Xi、Ai、Bi和Ci,描述一次查询。查询的参数Ki需要由公式 Ki=1+(AiPre+Bi) mod Ci计算得到。其中Pre表示上一次查询的结果,对于第一次查询,Pre=1。

Output

输出共n行,每行一个整数,表示查询结果。

Sample Input

4 3

1 2 6

2 3 3

1 3 2

3 3 4

3 1 3 2

1 1 3 4

2 2 4 3

Sample Output

2

8

11

HINT

样例解释

K1 = (1
1+3)%2+1 = 1

K2 = (12+3)%4+1 = 2

K3 = (2
8+4)%3+1 = 3

对于100%的数据,1≤m,n,Si,Ei,Ci≤100000,0≤Ai,Bi≤100000,1≤Pi≤10000000,Xi为1到n的一个排列

这道题读完就知道是主席树了,维护方式也很明显,我们以时间为根节点来建立主席树,然后利用像矩形面积并一样的差分的思想将Si,Ei,PiS_i,E_i,P_iSi​,Ei​,Pi​拆成Si,Pi,1S_i,P_i,1Si​,Pi​,1和Ei,−Pi,−1E_i,-P_i,-1Ei​,−Pi​,−1来对主席树进行修改就可以了。最后一点就是注意数组的大小还有要离散化。

代码如下:

#include<bits/stdc++.h>
#define N 4000005
using namespace std;
struct Node{long long v,f;}s[N<<1];
inline long long read(){
	long long ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
	return ans;
}
struct node{long long l,r,sum,num;}T[N];
long long n,m,rt[N],cnt=0,tot=0,b[N],siz=0,last=0,lastans=1,maxn=0;
map<long long,long long>mp;
vector<Node>pos[N];
inline void build(long long &p,long long l,long long r){
	p=++cnt;
	T[p].num=T[p].sum=0,T[p].l=l,T[p].r=r;
	if(l==r)return;
	long long mid=l+r>>1;
	build(T[p].l,l,mid);
	build(T[p].r,mid+1,r);
}
inline void update(long long last,long long &p,long long l,long long r,long long k,long long tmp,long long v){
	p=++cnt;
	T[p].sum=T[last].sum+v*tmp;
	T[p].num=T[last].num+tmp;
	T[p].l=T[last].l;
	T[p].r=T[last].r;
	if(l==r)return;
	long long mid=l+r>>1;
	if(k<=mid)update(T[last].l,T[p].l,l,mid,k,tmp,v);
	else update(T[last].r,T[p].r,mid+1,r,k,tmp,v);
}
inline long long query(long long p,long long l,long long r,long long k){
	if(k>=T[p].num)return T[p].sum;
	if(l==r)return T[p].sum/T[p].num*k;
	long long mid=l+r>>1;
	if(T[T[p].l].num>=k)return query(T[p].l,l,mid,k);
	else return query(T[p].r,mid+1,r,k-T[T[p].l].num)+T[T[p].l].sum;
}
inline long long max(long long a,long long b){return a>b?a:b;}
int main(){
	m=read(),n=read();
	for(long long i=1;i<=m;++i){
		long long x=read(),y=read(),c=read();
		pos[x].push_back(Node{c,1});
		pos[y+1].push_back(Node{c,-1});
		b[++tot]=c;
		maxn=max(maxn,y+1);
	}
	sort(b+1,b+m+1);
	siz=unique(b+1,b+m+1)-b-1;
	for(long long i=1;i<=siz;++i)mp[b[i]]=i;
	build(rt[0],1,siz);
	for(long long i=1;i<=maxn;++i){
		rt[i]=rt[i-1];
		for(long long j=0;j<pos[i].size();++j)update(rt[i],rt[i],1,siz,mp[pos[i][j].v],pos[i][j].f,pos[i][j].v);
	}
	for(long long i=1;i<=n;++i){
		long long t=read(),x=read(),y=read(),z=read(),k=(x*lastans+y)%z+1;
		lastans=query(rt[t],1,siz,k);
		printf("%lld\n",lastans);
	}
	return 0;
}

2018.06.30 BZOJ 3932: [CQOI2015]任务查询系统(主席树)的更多相关文章

  1. bzoj 3932: [CQOI2015]任务查询系统 -- 主席树 / 暴力

    3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec  Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管 ...

  2. BZOJ 3932: [CQOI2015]任务查询系统 [主席树]

    传送门 题意: 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi 调度系统会经常向查询系统询问,第Xi ...

  3. BZOJ.3932.[CQOI2015]任务查询系统(主席树 差分)

    题目链接 对于这一区间的操作,我们可以想到差分+前缀和(感觉也没什么别的了..). 同时对于本题我们能想到主席树,而主席树正是利用前一个节点建树的. 所以离散化.按时间排序,把操作拆成单点加和减即可. ...

  4. BZOJ 3932: [CQOI2015]任务查询系统 | 主席树练习题

    题目: 洛谷也能评测 题解: De了好长时间BUG发现是自己sort前面有一行for没删,气死. 题目询问第x秒时候前k小的P值之和. 朴素想法: 我们可以把P值离散化,然后对于每个时刻建一棵定义域是 ...

  5. BZOJ 3932: [CQOI2015]任务查询系统 (主席树板题)

    就是裸的主席树,差分之后排序插入主席树就行了. 注意主席树查询的时候叶子节点要特判,因为本身是有size的 还有要开longlong CODE #include <cctype> #inc ...

  6. BZOJ3932: [CQOI2015]任务查询系统 主席树

    3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4869  Solved: 1652[Submit][St ...

  7. [CQOI2015]任务查询系统 主席树

    [CQOI2015]任务查询系统 LG传送门 以前还没见过主席树的这种写法. 考虑使用差分的思想处理每一个任务,然后所有的东西就都能顺理成章地用主席树维护了,查询的时候和平时的主席树有一点不同,详见代 ...

  8. 【BZOJ3932】[CQOI2015]任务查询系统 主席树

    [BZOJ3932][CQOI2015]任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si, ...

  9. bzoj 3932 [CQOI2015]任务查询系统(主席树)

    Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分. 超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...

随机推荐

  1. [Vue warn]: Cannot find element: #app

    转自:https://blog.csdn.net/linyeban/article/details/54629869 学习vue的时候,刚开始按照官网的例子敲写,却出现以下的问题: 问题:这是因为你的 ...

  2. REST 服务器调试 RESTDebugger.exe 和浏览器测试

    开发一个简单的rest服务器, 增加了一些函数,比如返回系统当前时间 如何验证是否正确呢,不需要自己编写客户端调用程序了, 可以直接使用RESTDebugger.exe D:\Program File ...

  3. phone手机比较

    phone 15年5月3大厂商发布的高端机器 高颜值手机 皓月银 http://www.vmall.com/product/1983.html 冰川白 http://www.vmall.com/pro ...

  4. ADO 读写文本文件

    ' 创建配置文件            Open ThisWorkbook.Path & "\schema.ini" For Append As #1            ...

  5. python os.mkdir与 os.makedirs

    1.mkdir( path [,mode] )      作用:创建一个目录,可以是相对或者绝对路径,mode的默认模式是0777.      如果目录有多级,则创建最后一级.如果最后一级目录的上级目 ...

  6. Linux逻辑卷的拉伸和缩小

    相对于普通磁盘优势是逻辑卷可以在线动态的拉伸(不用先unmount操作),只要vg中有足够的空间即可 1:首先查看vg是否有足够的空间 [root@gechong mapper]# vgdisplay ...

  7. out对象以及网上答题系统

    out对象的主要功能是向客户输出响应信息,其主要方法为“print()”,可以输出任意类型的数据,HTML标记可以作为out输出的内容. 代码: 程序截图

  8. HTML 求阶乘之和

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. linux sleep用法

    应用程序:#include <syswait.h>usleep(n) //n微秒Sleep(n)//n毫秒sleep(n)//n秒驱动程序:#include <linux/delay ...

  10. Windows下搭建appium(Android版)

    1.安装node.js 说明:安装node.js是为了可以使用它的npm,可以用npm install很方便的安装它包含的包,appium server使用node.js编写的 下载地址:https: ...