[bzoj3932][CQOI2015]任务查询系统

坑题。非常坑。


 

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行,每行一个整数,表示查询结果。
1≤m,n,Si,Ei,Ci≤100000,0≤Ai,Bi≤100000,1≤Pi≤10000000,Xi为1到n的一个排列

懒得改LaTeX了。挺坑的之一是什么1到n排列,,差点被拐跑?没卵用。

然后就是主席树(动态开点线段树吧,感觉算不上主席树??)

然后查询的时候l=r的时候不能直接返回sum。感觉虽然坑但是也挺妙。

然后最坑的是暴力艹翻数据结构。QwQ

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
typedef long long ll;
inline int read(){
    int r=0,c=getchar();
    while(!isdigit(c))c=getchar();
    while(isdigit(c))
    r=r*10+c-'0',c=getchar();
    return r;
}
int rt[N],ls[N*40],rs[N*40],pre[N*40];
ll sum[N*40],bb[N];
int n,m,cnt,ff;
void ins(int &k,int o,int l,int r,int val){
    k=++cnt;ls[k]=ls[o],rs[k]=rs[o];
    sum[k]=sum[o]+1ll*bb[val]*ff,pre[k]=pre[o]+ff;
    if(l==r)return;
    int mid=l+r>>1;
    if(val<=mid)ins(ls[k],ls[o],l,mid,val);
    else ins(rs[k],rs[o],mid+1,r,val);
}
ll query(int k,int l,int r,int rk){
    if(rk==0)return 0;
    if(l==r)return bb[l]*rk;
    if(rk>=pre[k])return sum[k];
    int mid=l+r>>1; 
    if(rk<=pre[ls[k]])return query(ls[k],l,mid,rk);
    else return sum[ls[k]]+query(rs[k],mid+1,r,rk-pre[ls[k]]);
}
vector<int>ps[N],pp[N];
void init(){
    n=read(),m=read();
    for(int i=1;i<=n;i++){
        int s=read(),t=read(),v=read();bb[i]=v;
        ps[s].push_back(v);
        pp[t+1].push_back(v);
    }
    sort(bb+1,bb+n+1);
    for(int i=1;i<=m;i++){
        rt[i]=rt[i-1];
        ff=1;
        for(int j=0;j<ps[i].size();j++){
            int x=ps[i][j];x=lower_bound(bb+1,bb+n+1,x)-bb;
            ins(rt[i],rt[i],1,n,x);
        }
        ff=-1;
        for(int j=0;j<pp[i].size();j++){
            int x=pp[i][j];x=lower_bound(bb+1,bb+n+1,x)-bb;
            ins(rt[i],rt[i],1,n,x);
        }
    }
}
void solve(){
    ll ans=1,k,a,b,c;
    for(int T=1;T<=m;T++){
        int pos=read();a=read(),b=read(),c=read();
        k=1+(a*ans+b)%c;
        ans=query(rt[pos],1,n,k);
        printf("%lld\n",ans);
    }
}
int main(){
    init();
    solve();
}

 

posted @ 2018-03-21 16:50  orzzz  阅读(251)  评论(0编辑  收藏  举报