题面

解析

首先,我们考虑下暴力的做法:

每次将一个任务的重要度加入到它的区间中,

询问的时候就直接加前\(k\)大.

然而,这样肯会炸的(都说了是暴力了).

其实,我们可以转化一下区间修改(因为区间修改似乎并不好做哈qwq)

利用前缀和与差分的思想(不会的请自行百度下),

将要修改的区间转化为单点修改,

于是,通过前缀和,我们就能知道一个点插入了哪些任务了.

然而怎么查询呢?

我们先考虑下对于一个点\(x\)的情况:

首先,我们对\(x\)建一棵区间为\([1,x]\)的权值线段树,

那么在插入点时,重复的就会被抵消掉(这一点看代码吧),

因此,在权值线段树上插入的都是包含了\(x\)的任务.

另外,因为\(x\)与\(x+1\)只修改了一个点,

我们可以直接用可持久化线段树.

最后,我们只需要记一下权值区间的和,

再按照主席树的板子走就行啦!

上代码吧:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std; inline int read(){
int sum=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9'){sum=sum*10+c-'0';c=getchar();}
return sum*f;
} struct tree{int l,r,sum,cnt;}t[4000001];
struct node{int x,y;}a[1000001];//x是位置,y是值
int n,m,tot,c[1000001],sz;
int rt[1000001],pp;
ll pre=1; bool cmp(node a,node b){return a.x<b.x;} inline void pushup(int p){
t[p].cnt=t[t[p].l].cnt+t[t[p].r].cnt;
t[p].sum=t[t[p].l].sum+t[t[p].r].sum;
} int update(int p,int l,int r,int k){
int x=++sz;t[x]=t[p];
if(l==r){
t[x].sum+=k*c[l];t[x].cnt+=k;
return x;
}
int mid=(l+r)>>1;
if(pp<=mid) t[x].l=update(t[p].l,l,mid,k);
else t[x].r=update(t[p].r,mid+1,r,k);
pushup(x);return x;
} int ask(int p,int l,int r,int k){
if(l==r) return t[p].sum/t[p].cnt*k;
int mid=(l+r)>>1;
if(t[t[p].l].cnt>=k) return ask(t[p].l,l,mid,k);
return t[t[p].l].sum+ask(t[p].r,mid+1,r,k-t[t[p].l].cnt);
} int main(){
n=read();m=read();
for(int i=1;i<=n;i++){
int x=read(),y=read(),z=read();
a[++tot].x=x;a[tot].y=z;
a[++tot].x=y+1;a[tot].y=-z;
c[i]=z;
}
sort(a+1,a+tot+1,cmp);//按照修改的点排下序,不然会出锅qwq
sort(c+1,c+n+1);int q=unique(c+1,c+n+1)-c-1;//离散化一下
int ff=1;
for(int i=1;i<=tot;i++){
while(ff<a[i].x) rt[ff+1]=rt[ff],ff++;//有些点可能没有修改,就直接沿用上一个点
pp=lower_bound(c+1,c+q+1,abs(a[i].y))-c;
rt[ff]=update(rt[ff],1,q,(a[i].y>0? 1:-1));//插入还是删除
}
for(int i=1;i<=m;i++){
int x=read(),ai=read(),bi=read(),ci=read();
ll ki=(ll)(((ll)(ai*pre+bi))%ci+1);
if(t[rt[x]].cnt<=ki) printf("%lld\n",(pre=t[rt[x]].sum));//如果任务数小于k就直接输出
else printf("%lld\n",(pre=ask(rt[x],1,q,ki)));
}
return 0;
}

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

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

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

  2. 主席树||可持久化线段树||离散化||[CQOI2015]任务查询系统||BZOJ 3932||Luogu P3168

    题目: [CQOI2015]任务查询系统 题解: 是一道很经典的题目.大体思路是抓优先级来当下标做主席树,用时刻作为主席树的版本.然而优先级范围到1e7去了,就离散化一遍.然后把每个事件的开始(s). ...

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

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

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

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

  5. P3168 [CQOI2015]任务查询系统

    题目地址:P3168 [CQOI2015]任务查询系统 主席树的模板题 更模板的在这儿:P3834 [模板]可持久化线段树 1(主席树) 形象的说,P3834是"单点修改,区间查询" ...

  6. bzoj3932 / P3168 [CQOI2015]任务查询系统(主席树+差分)

    P3168 [CQOI2015]任务查询系统 看到第k小,就是主席树辣 对于每一段任务(a,b,k),在版本a的主席树+k,版本b+1的主席树-k 同一时间可能有多次修改,所以开个vector存操作, ...

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

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

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

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

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

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

随机推荐

  1. SQL Server 验证身份证合法性函数(使用VBScript.RegExp)

    原文:SQL Server 验证身份证合法性函数(使用VBScript.RegExp) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wzy0623 ...

  2. spark教程(16)-Streaming 之 DStream 详解

    DStream 其实是 RDD 的序列,它的语法与 RDD 类似,分为 transformation(转换) 和 output(输出) 两种操作: DStream 的转换操作分为 无状态转换 和 有状 ...

  3. 项目实践 hrm项目的设计过程

    人事管理系统的设计过程 一.数据库表和持久化类 1.1   进行需求分析,根据功能模块设计数据库表 1.2   设计持久化实体 面向对象分析,即根据系统需求提取出应用中的对象,将这些对象抽象成类,再抽 ...

  4. C++入门基础知识(二)

    一:引用 概念:是给一个已经存在的变量取一个别名,编译器不会为引用变量开辟内存空间,它和引用的变量公用一块内存空间. 例如: 类型& 引用变量名(对象名)= 引用实体 int& a = ...

  5. postman传数组参数,二维数组,多维数组

    一维数组: 传递: 接收: 二维数组: 传递: 接收: 依此类推,

  6. 【科创人·独家】连续创业者高春辉的这六年:高强度投入打造全球领先的IP数据库

    您能看到:高春辉的创业观,IPIP.NET半程复盘及未来规划,连续创业的体验,小众产品趣事 您看不到:往年创业的回顾,技术干货,受制于篇幅忍痛割舍的精彩观点 文末彩蛋:<与雷军的分歧并非否定电商 ...

  7. Centos7:Solr4.10安装,配置与使用(tomcat环境)

    配置jdk环境,安装tomcat 解压solr bin:是脚本的启动目录 contrib:第三方包存放的目录 dist:编译打包后存放目录,即构建后的输出产物存放的目录 docs:solr文档的存放目 ...

  8. electron-vue在npm run build时报错 ⨯ cannot execute cause=fork/exec C:\Users\801\AppData\Local\electron-builder\Cache\winCodeSign\winCodeSign-2.5.0\rcedit-ia32.exe: Access is denied.

    问题描述 在electron-vue执行npm run build时报错,错误如下: ⨯ cannot execute cause=fork/exec C:\Users\801\AppData\Loc ...

  9. vue使用scss应该安装哪些依赖

    通过vue-cli搭建的项目如果想使用scss的话除了安装sass-loader,还需要安装node-sass cnpm install sass-loader node-sass -D

  10. maven入门-- part3 生命周期

    简介: Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是: Clean Lifecycle 在进行真正的构建之前进行一些清理工作. Default ...