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

本文介绍了一种用于超级计算机任务管理系统的查询算法,通过离散化优先级和使用主席树数据结构,实现了对特定时间点运行任务的优先级之和的有效查询。该算法适用于大量任务并行执行的场景,能够快速响应查询需求。

链接:https://ac.nowcoder.com/acm/problem/19936
来源:牛客网

题目描述
最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分。超级计算机中的任务用三元组(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+(AiPre+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
输出
复制
2
8
11
沙雕题,到最后我也不知道为什么我的是mle。。
离散化优先级之后,对于每件物品,我们在它开始的时间+1
优先级,在它结束的时间后一秒-1*优先级。然后再类似于差分数组遍历一遍求每一个时间点的优先级和。剩下的就是主席树求前k小的优先级和的模板了。
代码如下:

#include <bits/stdc++.h>
  
using namespace std;
typedef long long ll;
const int maxn = 1e6+9;
  
int num;
int dl[maxn],dr[maxn],p[maxn],h[maxn],who[maxn];
ll sum[maxn*40],cnt[maxn*40];
int rt[maxn*40],lson[maxn*40],rson[maxn*40];
int cur;
  
void build(int &now,int l,int r,int L,int val){
    if(!now)now=++cur;//在这里最好用引用,因为如果之前这个节点扩展过,就不用再重复开辟了
    sum[now]+=1ll*val*h[L];
    cnt[now]+=val;
    if(l==r)return;
    int mid=(l+r)>>1;
    if(L<=mid)build(lson[now],l,mid,L,val);
    else build(rson[now],mid+1,r,L,val);
}
  
int rebuild(int x,int y){
    if(!x||!y)return x+y;
    int now=++cur;
    sum[now]=sum[x]+sum[y];
    cnt[now]=cnt[x]+cnt[y];
    lson[now]=rebuild(lson[x],lson[y]);
    rson[now]=rebuild(rson[x],rson[y]);
    return now;
}
  
ll query(int now,int l,int r,ll k){
    if(l==r){
        return 1ll*h[l]*min(k,cnt[now]);
    }
    int mid=(l+r)>>1;
    if(cnt[lson[now]]>=k)return query(lson[now],l,mid,k);
    else return sum[lson[now]]+query(rson[now],mid+1,r,k-cnt[lson[now]]);
}
  
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&dl[i],&dr[i],&p[i]);
        h[i]=p[i];
    }
    sort(h+1,h+1+n);
    num=unique(h+1,h+1+n)-h-1;
    for(int i=1;i<=n;i++){
        who[i]=lower_bound(h+1,h+1+num,p[i])-h;
    }
    for(int i=1;i<=n;i++){
        build(rt[dl[i]],1,num,who[i],1);
        build(rt[dr[i]+1],1,num,who[i],-1);
    }
    for(int i=1;i<=m;i++){
        rt[i]=rebuild(rt[i-1],rt[i]);//类似于差分数组,遍历一遍
    }
    int x,a,b,c;
    ll ans=1;
    for(int i=1;i<=m;i++){
        scanf("%d%d%d%d",&x,&a,&b,&c);
        ll k=1+1ll*(1ll*a*ans%c+b)%c;
        ans=query(rt[x],1,num,k);
        printf("%lld\n",ans);
    }
    return 0;
}

努力加油a啊,(o)/~

源码直接下载地址: https://pan.quark.cn/s/d280357b18e5 在网页构建领域中,HTML5被视为当代网页工程的基础规范,其问世显著增强了页面的视觉表现力与用户互动性。本工程致力于运用HTML5技术开发一个电视剧信息展示页面,目的是呈现诸如剧名、演员构成、故事梗概等电视剧关键资料。接下来将深入阐释如何借助HTML5的结构化组件样式管理功能达成此项目目标。 我们必须掌握HTML5的核心框架。一个规范的HTML5文档一般包含`<!DOCTYPE html>`声明、`<html>`根标记、`<head>`头部标记`<body>`主体标记。在头部域,可以配置网页的基本元数据,例如字符集设定、页面标题等。在主体部分,将具体构建电视剧信息列表的内容。 电视剧展示页面通常包含多个条目,每个条目对应一部电视剧。HTML5中的`<section>`标记用于内容模块化,适合表示单个电视剧的详细信息域。每个`<section>`内部,可使用`<h2>`标题标记显示剧名,`<img>`图像标记插入宣传剧照,`<p>`段落标记呈现剧情介绍,而`<ul>`无序列表与`<li>`列表项标记则用于罗列演员阵容。 为了优化页面布局,需要借助CSS(层叠样式表)进行样式管理。HTML5引入了创新的CSS选择器与布局模型,例如FlexboxGrid,使页面布局更加灵活多变。在此场景下,可以利用Flexbox为电视剧信息列表实现自适应布局,保障在不同设备尺寸下均能呈现理想视觉效果。具体操作时,可将`<section>`标记设定为Flex容器,通过`display: flex;`属性,并运用`justify-content``align-items`属性调整子元素的对...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

starlet_kiss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值