BZOJ 3932任務查詢系統

題意

最近實驗室正在爲其管理的超級計算機編制一套任務管理系統,而你被安排完成其中的查詢部分。超級計算機中的任務用三元組(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任務從第Si秒開始,在第Ei秒後結束(第Si秒和Ei秒任務也在運行),其優先級爲Pi。同一時間可能有多個任務同時執行,它們的優先級可能相同,也可能不同。調度系統會經常向查詢系統詢問,第Xi秒正在運行的任務中,優先級最小的Ki個任務(即將任務按照優先級從小到大排序後取前Ki個)的優先級之和是多少。特別的,如果Ki大於第Xi秒正在運行的任務總數,則直接回答第Xi秒正在運行的任務優先級之和。上述所有參數均爲整數,時間的範圍在1到n之間(包含1和n)。

主席數差分一下,再每個節點記一個和就好了

代碼

#include<cstdio>
#include<cstring>
#include<algorithm> 
#include<cstdlib>
#include<vector>
#include<queue>
#define For(i,j,k) for(int i=(j);i<=(int)k;i++)
#define Forr(i,j,k) for(int i=(j);i>=(int)k;i--)
#define Rep(i,u) for(int i=Begin[u],v=to[i];i;i=Next[i],v=to[i])
#define Set(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define ll long long 
#define getchar getchar_unlocked 
#define L(i) (T[i].s[0])
#define R(i) (T[i].s[1])
#define S(i) (T[i].sum)
#define s(i) (T[i].ss)
using namespace std;
const int N=100001,INF=0x3f3f3f3f;
int m,n;
template <class T>inline void read(T &x){
    x=0;char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
}
int P[N];
vector<int>ins[N],del[N];
struct A{
    ll x;
    int id;
    bool operator <(const A &r)const{
        return x<r.x;
    }
};
struct node{
    int s[2],sum;
    ll ss;
};
struct cht{
    node T[N*40];
    int rk[N],rt[N],cnt,n,tot,nn;
    A a[N];
    #define mid ((l+r)>>1)
    inline void init(int num,int S){
        cnt=0;nn=num,tot=1;
        For(i,1,nn)a[i].id=i,a[i].x=P[i];
        sort(a+1,a+nn+1);
        For(i,1,nn)rk[a[i].id]=i;
        For(i,1,S){
            rt[i]=rt[i-1];
            For(j,0,ins[i].size()-1)
                insert(rk[ins[i][j]],rt[i],1,nn,1);
            For(j,0,del[i].size()-1)
                insert(rk[del[i][j]],rt[i],1,nn,-1);
        }
    }
    void insert(int val,int &x,int l,int r,ll add){
        T[++cnt]=T[x],x=cnt,S(x)+=add,s(x)+=add*a[val].x;
        if(l==r)return ;
        if(val<=mid)insert(val,L(x),l,mid,add);
        else insert(val,R(x),mid+1,r,add);
    }
    ll query(int x,ll k){
        k=min((ll)S(rt[x]),k);
        return query(rt[x],1,nn,k); 
    }
    ll query(int u,int l,int r,int k){
        int sum=S(L(u));
        if(l==r)return s(u);
        if(k<=sum)return query(L(u),l,mid,k);
        else return query(R(u),mid+1,r,k-sum)+s(L(u));
    }
}t;
int main(){
    ll pre=1;
    read(m),read(n);
    For(i,1,m){
        ll s,e,p;
        read(s),read(e),read(p);
        P[i]=p;
        ins[s].pb(i);
        del[e+1].pb(i);
    }
    t.init(m,n);    
    For(i,1,n){
        ll x,a,b,c,k;
        read(x),read(a),read(b),read(c);
        k=(a*pre+b)%c+1;
        printf("%lld\n",pre=t.query(x,k));
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章