zoukankan      html  css  js  c++  java
  • 3932: [CQOI2015]任务查询系统

    3932: [CQOI2015]任务查询系统

    Time Limit: 20 Sec  Memory Limit: 512 MB
    Submit: 2559  Solved: 819
    [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

      以时刻为下标,优先级为区间建主席树。对于在一个区间[l,r]内存在的任务,在l处出现次数加1,在r+1处出现次数减1,把这些看作事件,将时刻i所有发生的时间加入i的线段树。然后就可以在root[x]上统计答案了。

      需要注意的是时刻是连续的,所以每一个时刻都要先把上一个时刻的root复制过来。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int read(){
        int 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;
    }
    typedef long long ll;
    const int M=1e5+5,N=M*40;
    struct node{
        int end,val,tag;
        ll sum;
        bool operator < (const node &a)const{
            return end<a.end;    
        }
    }s[M<<1];
    int n,m,cnt,cct,a[M],root[M*3],ls[N],rs[N];;
    ll sum[N],siz[N],ans=1;
    void build(int &k,int l,int r){
        k=++cnt;
        if(l==r) return ;
        int mid=l+r>>1;
        build(ls[k],l,mid);
        build(rs[k],mid+1,r);
    }
    void change(int &k,int last,int l,int r,int p,int tag){
        k=++cnt;
        sum[k]=sum[last]+(ll)tag*a[p];
        siz[k]=siz[last]+(ll)tag;
        ls[k]=ls[last];
        rs[k]=rs[last];
        if(l==r) return ;
        int mid=l+r>>1;
        if(p<=mid) change(ls[k],ls[last],l,mid,p,tag);
        else change(rs[k],rs[last],mid+1,r,p,tag);
    }
    ll query(int k,int l,int r,int key){
        if(l==r) return sum[k]/siz[k]*(ll)key;
        int tot=siz[ls[k]];
        int mid=l+r>>1;
        if(key<=tot) return query(ls[k],l,mid,key);
        else return sum[ls[k]]+query(rs[k],mid+1,r,key-tot);
    }
    int main(){
        n=read();m=read();
        for(int i=1,x,y,z;i<=n;i++){
            x=read();y=read();z=read();
            s[++cct].end=x;s[cct].val=z;s[cct].tag=1;
            s[++cct].end=y+1;s[cct].val=z;s[cct].tag=-1;
            a[i]=z;
        }
        sort(a+1,a+n+1);
        sort(s+1,s+cct+1);
        build(root[0],1,m);
        for(int i=1,j=1,p;i<=m;i++){
            root[i]=root[i-1];
            for(;j<=cct&&s[j].end==i;j++){
                p=lower_bound(a+1,a+n+1,s[j].val)-a;
                change(root[i],root[i],1,m,p,s[j].tag);
            }
        }
        for(int i=1,t,a,b,c;i<=m;i++){
            t=read();a=read();b=read();c=read();
            ll ki=((ll)a*ans+(ll)b)%c+1;
            if(ki>=siz[root[t]]) ans=sum[root[t]];
            else ans=query(root[t],1,m,ki);
            printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    2021.1.28 个人rating赛补题报告
    2021.1.23 个人rating赛补题报告
    2021.1.23 个人rating赛补题报告
    2020.12.14 个人训练赛补题报告
    2020.11.28 2020团体程序设计天梯赛补题报告
    2020.12.3 Codeforces Beta Round #73(Div2)补题报告
    Xhorse VVDI Prog V5.0.6 is Ready for BCM2 Adapter
    Program 2021 Ford Bronco All Keys Lost using VVDI Key Tool Plus
    Xhorse VVDI Prog V5.0.4 Software Update in July 2021
    How to use Xhorse VVDI2 to Exchange BMW FEM/BDC Module?
  • 原文地址:https://www.cnblogs.com/shenben/p/6364147.html
Copyright © 2011-2022 走看看