zoukankan      html  css  js  c++  java
  • 洛谷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
    ",pre);
        }    
    }    
    int main()
    {
        //freopen("data.in","r",stdin);
        init();
        solve();
        return 0;
    }
  • 相关阅读:
    linux sar 命令详解
    linux perf
    Linux下的内核测试工具——perf使用简介
    系统级性能分析工具 — Perf
    使用truss、strace或ltrace诊断软件的“疑难杂症”
    6.数组类型和数组指针类型
    5.二级指针
    4.const
    3.字符串
    C/C++ 错误笔记-如果要释放内存,必须拿到内存的首地址进行释放
  • 原文地址:https://www.cnblogs.com/w-h-h/p/8169364.html
Copyright © 2011-2022 走看看