洛谷P3168 [CQOI2015]任务查询系统

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#define MAXN 100000+10
#define Nd Node*
#define pii pair<int,int>
#define mp make_pair
#define ft first
#define sc second
#define pb push_back
#define ll long long
using namespace std;
struct Node{
    Nd l;Nd r;
    int L,R,cnt;
    ll sum;
};
Nd rt[MAXN];
ll b[MAXN];
Nd NewNode(Nd l,Nd r,int L,int R,ll sum,int cnt){
    Nd ret=new Node;
    ret->l=l,ret->r=r,ret->L=L,ret->R=R,ret->sum=sum,ret->cnt=cnt;
    return ret;
}
Nd Build(int L,int R){
    Nd ret=NewNode(NULL,NULL,L,R,0LL,0);
    if(L+1!=R)ret->l=Build(L,(L+R)>>1),ret->r=Build((L+R)>>1,R);
    return ret;
}
void update(Nd &A,Nd B,int p,ll x,int f){
    if(!B)return;
    A=NewNode(B->l,B->r,B->L,B->R,B->sum+f*x,B->cnt+f);
    if(p<(B->L+B->R)>>1)update(A->l,B->l,p,x,f);
    else update(A->r,B->r,p,x,f);
}
ll query(Nd A,int k){
    if(!A->l)return k*b[A->L];
    if(A->l->cnt>=k)return query(A->l,k);
    else return query(A->r,k-A->l->cnt)+A->l->sum;
}
struct Opt{
    int L,R,p;
    ll x;
}s[MAXN];
int n,m,sz;
vector<pii> vs[MAXN];
void init(){
    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;i++){
        scanf("%d%d%lld",&s[i].L,&s[i].R,&s[i].x);
        b[i]=s[i].x;
    }
    sort(b+1,b+m+1);
    sz=unique(b+1,b+m+1)-(b+1);
    rt[0]=Build(1,sz+1);
    for(int i=1;i<=m;i++){
        s[i].p=lower_bound(b+1,b+m+1,s[i].x)-b;
        vs[s[i].L].pb(mp(s[i].p,1));
        vs[s[i].R+1].pb(mp(s[i].p,-1));
    }
    for(int i=1;i<=n;i++){
        rt[i]=rt[i-1];
        for(int j=0;j<vs[i].size();j++){
            pii &t=vs[i][j];
            update(rt[i],rt[i],t.ft,b[t.ft],t.sc);
        }
    }
}
void solve(){
    ll pre=1,X,A,B,C;
    int k;
    for(int i=1;i<=n;i++){
        scanf("%lld%lld%lld%lld",&X,&A,&B,&C);
        k=(A*pre+B)%C+1;
        pre=(k>=rt[X]->cnt?rt[X]->sum:query(rt[X],k));
        printf("%lld\n",pre);
    }
}
int main()
{
    //freopen("data.in","r",stdin);
    init();
    solve();
    return 0;
}

原文地址:https://www.cnblogs.com/w-h-h/p/8169364.html

时间: 2024-11-07 10:56:29

洛谷P3168 [CQOI2015]任务查询系统的相关文章

●洛谷P3168 [CQOI2015]任务查询系统

题链: https://www.luogu.org/problemnew/show/P3168题解: 主席树 强制在线? 那就直接对每一个前缀时间建一个线段树(可持久化线段树),线段树维护优先度权值. 代码: #include<bits/stdc++.h> #define MAXN 100005 using namespace std; int tmp[MAXN]; int N,M,tnt; long long pre=1; struct Event{ int ent; int p[MAXN*

P3168 [CQOI2015]任务查询系统(主席树)

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

luogu P3168 [CQOI2015] 任务查询系统

传送门 区间修改单点查询的主席树 改个差分就行了 首先强制在线的是查询 所以修改可以一次全读进来然后离散并且插进去 没有影响 这里的话先全修改完再查询 可以放弃树状数组直接维护差分 然后主席树维护区间数字个数和整体和 最后分到叶子节点的时候注意去对应个数个数字加进去就行 然后有个操作就是一次把所有这个点上的差分数组都加进去 不开long long *** Code: 1 #include<cstdio> 2 #include<iostream> 3 #include<cstr

P3168 [CQOI2015]任务查询系统 主席树 差分数组

现在有一群任务,每个任务都有开始和结束的时间和一个优先级,给你所有任务的开始结束时间和优先级,问你在某个时间点优先级最小的k个的优先级的和是多少. 普通的主席树是单点修改 区间查询   这题正好相反 可以用差分数组来做  区间查询改为1-i的前缀和 注意copy结点的方式 不能简单的复制T  还有son  t num 重复累加的操作  要写成T[i] T[i]      而不是  T[i-1] T[i] 主席树的范围只和放入的数据的离散化下标有关   和历史版本号没有任何关系 这题的时间为历史版

P3168 [CQOI2015]任务查询系统

介绍本题的两种做法: 方法1 前置芝士 线段树:一个很重要的数据结构. 树状数组:一个很重要的数据结构. 具体实现 区间修改,单点查询很容易就会想到树状数组了,至于查询前k个数的和又可以丢给权值线段树去干,所以第一种很显然的方法就是树状数组套一个线段树实现. 代码 #include<bits/stdc++.h> #define REP(i,first,last) for(int i=first;i<=last;++i) #define DOW(i,first,last) for(int

3932: [CQOI2015]任务查询系统

3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2559  Solved: 819[Submit][Status][Discuss] Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行 ),其优先级为P

BZOJ3932:[CQOI2015]任务查询系统——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=3932 题面源于洛谷 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi.同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同.调度系统会经常向查询系统询问,第Xi秒正在运行的任务中,

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

题目: 洛谷也能评测 题解: De了好长时间BUG发现是自己sort前面有一行for没删,气死. 题目询问第x秒时候前k小的P值之和. 朴素想法: 我们可以把P值离散化,然后对于每个时刻建一棵定义域是离散化后P值的线段树 每个节点维护了这个节点代表区间的任务个数和这些任务离散化之前的P值之和, 对于每个在这个时间段的任务,插入,即在p位置单点修改 询问就是类似二叉查找树的写法 高级想法: 首先把一段任务拆成两个:添加和删除,用三元组(t,p,d)表示,d=1表示插入,d=-1表示删除 对于第ma

[bzoj3932][CQOI2015]任务查询系统-题解[主席树][权值线段树]

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