3932: [CQOI2015]任务查询系统

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 4869  Solved: 1652
[Submit][Status][Discuss]

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+(Ai*Pre+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 = (1*2+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的一个排列
 

Source

题解:这是一个主席树的题目,首先需要读清楚题目,有n个任务,所以可以通过离散化使得变成n个优先级,因为一个任务是在一段区间中出现的,所以很显然我们可以用到差分思想,在st++,end+1处--。作为一种高级的前缀和,很容易想到我们要以时间顺序依次建立每颗权值线段树,线段树维护的是某一时刻某一个优先级出现的次数。这里要注意的是时间不一定连续,所以在同一时间的就以当前时间的root开始建树,否则沿用前一时刻的,写成代码可以对于每一个i都将root[i]=root[i-1]就行。 PS:在试着少看题解,不然比赛时仍旧不会做,想的时候想到了差分,离散化,按照时间建树,以及主席树维护的肯定是优先级的出现次数,但是还是不太清楚怎么写。
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define _mp make_pair
#define ldb long double
using namespace std;
const int maxn=2e5+100;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct node
{
ll l,r;
ll sum,v;
}no[maxn*40];
struct sr
{
int x,num,tp,val;
}sf[maxn*2];
int id[maxn],nid[maxn],pri[maxn];
ll root[maxn<<1];
int cnt=0,tot=0,n,m;
bool cmp1( int a, int b){
return pri[a]<pri[b];
}
bool cmp2(const sr& a,const sr& b)
{
return a.x<b.x;
}
void insert(ll& now,int l,int r,int pl,int val,int type)
{
no[++cnt]=no[now];
now=cnt;
no[now].v+=type;
no[now].sum+= val;
if(l==r)return;
int mid=(l+r)>>1;
if(pl<=mid)insert(no[now].l,l,mid,pl,val,type);
else if(pl>mid)insert(no[now].r,mid+1,r,pl,val,type);
}
ll query(ll x,int l,int r,ll k)
{
if(l==r)
{
return no[x].sum;
}
int mid=(l+r)>>1;
ll tmp=0;
ll ss=no[no[x].l].v;
if(ss>=k)
{
tmp+=query(no[x].l,l,mid,k);
}
else
{
tmp+=no[no[x].l].sum;
tmp+=query(no[x].r,mid+1,r,k-ss);
}
return tmp;
}
int pp,qq,rr,ss;
int main()
{
n=read();m=read();
for(int i=1;i<=n;i++)
{
pp=read();qq=read();rr=read();
pri[i]=rr;id[i]=i;
sf[++tot].x=pp;sf[tot].val=rr;sf[tot].tp=1;
sf[++tot].x=qq+1;sf[tot].val=-rr;sf[tot].tp=-1;
}
sort(id+1,id+1+n,cmp1);
for(int i=1;i<=n;i++)nid[id[i]] =i;
// for(int i=1;i<=n;i++)cout<<nid[i]<<endl;
for(int i=1;i<=tot;i+=2)
{
sf[i].num=sf[i+1].num=nid[(i+1)/2];
}
sort(sf+1,sf+1+tot,cmp2);
int j=1;
for(int i=1;i<=m;i++)
{
root[i]=root[i-1];
while(sf[j].x==i)
{
insert(root[i],1,n,sf[j].num,sf[j].val,sf[j].tp);
j++;
}
}
//cout<<cnt<<endl;
ll pre=1;
for(int i=1;i<=m;i++)
{
ss=read();pp=read();qq=read();rr=read();
ll tmp=1+(pp*pre+qq)%rr;
//cout<<tmp<<endl;
pre=query(root[ss],1,n,tmp);
printf("%lld\n",pre);
}
}

  

BZOJ3932: [CQOI2015]任务查询系统 主席树的更多相关文章

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

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

  2. BZOJ3932 CQOI2015 任务查询系统 - 主席树,离散化

    记录下自己写错的地方吧 1. 区间可能有重复 2. 没有出现的坐标也要计入version (因为询问里可能会有) #include <bits/stdc++.h> using namesp ...

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

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

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

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

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

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

  6. 洛谷P3168 [CQOI2015]任务查询系统 [主席树,差分]

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

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

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

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

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

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

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

随机推荐

  1. vue-router的简单实现原理

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 腾讯机试题 AcWing 603 打怪兽

    题目链接:https://www.acwing.com/problem/content/605/ 题目大意: 略 分析: 用dp[i][j]表示用j元钱能在前i只怪兽上所能贿赂到的最大武力值. 有一种 ...

  3. 在 Ubuntu14.04 上搭建 Spark 2.3.1(latest version)

    搭建最新的 Spark 2.3.1 . 首先需要下载最新版 jdk .目前 2.3.1 需要 8.0 及其以上 jdk 才可以允许. 所以如果你没有 8.0  jdk 安装好了之后会报错.不要尝试安装 ...

  4. admin快速搭建后台管理系统

    一.基于admin后台管理系统的特点: 权限管理:权限管理是后台管理系统必不可少的部分,拥有权限管理,可以赋予用户增删改查表权限(可以分别赋予用户对不同的表有不同的操作权限): 前端样式少:后台管理主 ...

  5. Java多线程系列——原子类的实现(CAS算法)

    1.什么是CAS? CAS:Compare and Swap,即比较再交换. jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronou ...

  6. git的简单使用(一些小操作,持续更新)

    第一次使用git的过程记录 参考了两个文章 菜鸟教程-git简明指南 阮一峰-常用git命令清单 git的几个工作区(此处参考了上面的两篇介绍) 简单步骤如下 git init 在当前目录建立工作区 ...

  7. MongoDB数据模型设计

    MongoDB的数据模式是一种灵活模式,其集合并不限制文档结构.这种灵活性让对象和数据库文档之间的映射变得很容易,即使数据记录之间有很大的变化,每个文档也可以很好的映射到各条不同的记录.但在实际使用中 ...

  8. Row_Number() over()

    分页 ROW_NUMBER() OVER (order by ID) 是先把ID列排序,再为排序以后的每条ID记录返回一个序号.

  9. [51Nod 1584] 加权约数和

    Description 在整理以前的试题时,他发现了这样一道题目:"求 \(\sum\sigma(i)\),其中 \(1≤i≤N\),\(σ(i)\) 表示 \(i\) 的约数之和.&quo ...

  10. Codeforces Round #467 Div. 1

    B:显然即相当于能否找一条有长度为奇数的路径使得终点出度为0.如果没有环直接dp即可.有环的话可以考虑死了的spfa,由于每个点我们至多只需要让其入队两次,复杂度变成了优秀的O(kE).事实上就是拆点 ...