http://www.lydsy.com/JudgeOnline/problem.php?id=3932

题面源于洛谷

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

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
输出样例#1:

2
8
11

————————————————————————

抄代码一时爽,事后比较火葬场。

查了半个小时发现两个语句反了(晕……

代码于:http://blog.csdn.net/oakley_/article/details/52250622 理解于:http://blog.csdn.net/shiyukun1998/article/details/44910169

!注意!请不要hack我的程序,我知道我抄的代码以及那篇博客的代码的空间复杂度不对,一个主席树的空间复杂度为O(nlogn)级别的,如果不离散化的话是绝对会炸的,所以能过……只能说数据水吧。

我们根据某矩形覆盖的题,想到能否看做在s时刻插入p,在e+1时刻删除p。

那么按照某矩形覆盖的想法,我们分为上下边界,上边界存p,下边界存-p。

根据他们插入/删除的时间排序,之后我们就可以愉快的在p的范围区间内建主席树啦!

Q1:等等,怎么突然就跳到主席树啦?

A1:那这里说一下主席树的想法:在一棵当前时间的主席树上查找区间前k小的数,然后加和即可。!注意!可能有多个任务重合在一个地点上,所以不要忘了加上。

Q2:别忽悠我,只有一棵树的话你岂不是要把前面时间的数也算在内?

A2:是这样的没错,但是因为前面时间的值已经被我们的下边界减掉了,同时于他们的sum和size,所以区间第k小不会搜到他们。

Q3:你的意思是……求k前缀和?

A3:我的理解是这样,但是我的代码实现能力太糟糕了,没有这样写过,很抱歉。

Q4:代码怎么这么不清真?

A4:实在是处于主席树开荒期,所以不可避免的借鉴他人思路,有些时候相比较看题解而言看他们的代码更为清楚一些。

#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct mission{
int pos;
ll p;
}scp[N];
inline bool cmp(mission a,mission b){
return a.pos<b.pos;
}
struct tree{
int l;
int r;
int size;
ll sum;
}tr[];
int rt[N],to[N],n,q,pool;
ll m;
inline void insert(int &y,int &x,int l,int r,ll p){
tr[x=++pool]=tr[y];
if(l==r){
if(p>)tr[x].size++;
else tr[x].size--;
tr[x].sum+=p;
return;
}
int mid=(l+r)>>;
if(abs(p)<=mid)insert(tr[y].l,tr[x].l,l,mid,p);
else insert(tr[y].r,tr[x].r,mid+,r,p);
tr[x].sum=tr[tr[x].l].sum+tr[tr[x].r].sum;
tr[x].size=tr[tr[x].l].size+tr[tr[x].r].size;
return;
}
ll check(ll H,ll k){
ll x=rt[H],l=,r=m,ans=;
if(tr[x].size<=k){
return tr[x].sum;
}
while(l<r){
ll mid=(l+r)>>;
if(tr[tr[x].l].size>=k){
r=mid;
x=tr[x].l;
}else{
l=mid+;
k-=tr[tr[x].l].size;
ans+=tr[tr[x].l].sum;
x=tr[x].r;
}
}
if(k)ans+=l*k;
return ans;
}
int main(){
n=read();
q=read();
n*=;
for(int i=;i<=n;i+=){
scp[i].pos=read();
scp[i+].pos=read()+;
scp[i].p=read();
scp[i+].p=-scp[i].p;
m=max(m,scp[i].p);
}
sort(scp+,scp+n+,cmp);
for(int i=;i<=n;i++)insert(rt[i-],rt[i],,m,scp[i].p);
for(int i=n;i>=;i--)if(scp[i].pos!=scp[i+].pos)to[scp[i].pos]=i;
for(int i=;i<=n>>;i++)if(!to[i])to[i]=to[i-];
ll pre=;
for(int i=;i<=q;i++){
int X=read();
ll A=read();
ll B=read();
ll C=read();
ll K=+(A%C*pre%C+B%C)%C;
printf("%lld\n",pre=check(to[X],K));
}
return ;
}

BZOJ3932:[CQOI2015]任务查询系统——题解的更多相关文章

  1. BZOJ3932 CQOI2015 任务查询系统 【主席树】

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

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

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

  3. [bzoj3932][CQOI2015]任务查询系统_主席树

    任务查询系统 bzoj-3932 CQOI-2015 题目大意:最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述 ...

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

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

  5. BZOJ3932[CQOI2015]任务查询系统——主席树

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

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

    传送门 真不知道我没学主席树之前是有什么勇气说自己高级数据结构以及学的七七八八了. 这道题应该也是算是主席树的经典运用. 刚开始脑抽了,想把(S,E,P)的处理直接在线用树状数组xjb搞搞算了.写完后 ...

  7. 并不对劲的bzoj3932: [CQOI2015]任务查询系统

    传送门-> 离线操作听上去很简单,遗憾的是它强制在线. 每个时刻可以看成可持久化线段树中的一个版本,而每一个版本的线段树维护的是值某一段区间且在这个版本对应的时刻出现的数之和. 会发现同一时刻可 ...

  8. [BZOJ3932] [CQOI2015]任务查询系统(主席树 || 树状数组 套 主席树 + 差分 + 离散化)

    传送门 看到这个题有个很暴力的想法, 可以每一个时间点都建一颗主席树,主席树上叶子节点 i 表示优先级为 i 的任务有多少个. 当 x 到 y 有个优先级为 k 的任务时,循环 x 到 y 的每个点, ...

  9. [BZOJ3932][CQOI2015]任务查询系统(差分+主席树)

    题面 分析 对于一个区间修改(s,e,v),我们可以将它差分,这样就变成了单点修改s和e+1(s插入,t+1删除) 我们用主席树维护差分数组的前缀和,第i棵主席树维护区间[1,i]之间的所有差分值 那 ...

随机推荐

  1. 如何去除Eclipse下的JS引入报错(类似Syntax error on token...的异常信息)

    在Eclipse下引入外部JS文件,比如Jquery.js,经常会出现如下异常信息: 去除该异常方法: 1. 去掉Eclipse的JS验证 Windws---->Preferences----& ...

  2. 抽样分布(2) t分布

    定义 t分布 设X ~ N(0,1),Y ~ χ2(n),且X,Y相互独立,则称随机变量 服从自由度为n的t分布(学生氏分布) 记为 t~t(n),其概率密度为 由于tn(x)是偶函数,其图形关于y轴 ...

  3. 【转】Oracle 如何找回已经删除了的表记录

    有的时候我们不小心把数据库表(emp)中重要的记录给删除了,怎么给找回来了,看下面这个例子你就会明白. 某一天,10点钟的时候,张三一不小心给数据库表emp的一条重要记录给删除了并且还提交了,此时也没 ...

  4. Webservice HTTP

    由于项目需要:自己写了一个WebserviceDemo,把遇到的问题记下来. 方式一 :使用代理类来访问Webservice,此方式不讲解,感觉复杂(神坑). (生成的代理路径 C:\Users\ad ...

  5. 第三十九篇 Python异常处理

    一. 什么是异常 异常就是程序运行时发生的错误,在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止,在python中,错误触发的异常如下 错误分成两种: #语法 ...

  6. 第四模块:网络编程进阶&数据库开发 第1章·网络编程进阶

    01-进程与程序的概念 02-操作系统介绍 03-操作系统发展历史-第一代计算机 04-操作系统发展历史-批处理系统 05-操作系统发展历史-多道技术 06-操作系统发展历史-分时操作系统 07-总结 ...

  7. html常用小知识

    请求重定向:加载页面之后,除了用js做重定向之外,我们还可以直接用<meta>标签做重定向. <meta http-equiv="refresh" content ...

  8. Python运行的方式

    Python的运行方式多种多样,下面列举几种: 交互式 在命令行中输入python,然后在>>>提示符后面输入Python语句,这里需要注意: 1 语句前面不能有空格,否则会报错 2 ...

  9. 2019寒假训练营寒假作业(三) 对Sketch——CM-Sketch的理解(理论题部分)

    目录 实验题部分 基本题 1.简述sketch: 2.Count-min Sketch: 开放题部分 理论部分 1.解释为什么 sketch 可以省空间 2.用流程图描述Count-min sketc ...

  10. Vue于React特性简单对比(一)

    一,对象实体对比 vue的对象实体依然是html,而react的对象实体已经变味jsx,一种新的语法结构. vue的html与react的jsx都可以进行拆分,拆分成更细小的组件,组件之间可以传值. ...