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

    树状数组不用动脑子真爽啊

    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    using namespace std;
    typedef long long ll;
    int m, n, b[100005], rem, rot[100005], lson[20000005], rson[20000005], siz[20000005];
    int cnt, xi, ai, bi, ci, ki, qque[45], len;
    ll sum[20000005], lst=1;
    struct Task{
        int fro, too, val;
    }tsk[100005];
    int lowbit(int x){
        return x&-x;
    }
    void update(int &rt, int l, int r, int x, int val){
        if(!rt)	rt = ++cnt;
        siz[rt] += val;
        sum[rt] += val * b[x];
        if(l==r)	return ;
        int mid=(l+r)>>1;
        if(x<=mid)	update(lson[rt], l, mid, x, val);
        if(mid<x)	update(rson[rt], mid+1, r, x, val);
    }
    ll query(int l, int r, int k){
        if(l==r)	return (ll)k*b[l];
        int tmp=0;
        ll tat=0;
        for(int i=1; i<=len; i++)
            tmp += siz[lson[qque[i]]], tat += sum[lson[qque[i]]];
        int mid=(l+r)>>1;
        if(k<=tmp){
            for(int i=1; i<=len; i++)
                qque[i] = lson[qque[i]];
            return query(l, mid, k);
        }
        else{
            for(int i=1; i<=len; i++)
                qque[i] = rson[qque[i]];
            return query(mid+1, r, k-tmp)+tat;
        }
    }
    int main(){
        cin>>m>>n;
        for(int i=1; i<=m; i++){
            scanf("%d %d %d", &tsk[i].fro, &tsk[i].too, &tsk[i].val);
            b[i] = tsk[i].val;
        }
        sort(b+1, b+1+m);
        rem = unique(b+1, b+1+m) - (b + 1);
        for(int i=1; i<=m; i++){
            int tmp=lower_bound(b+1, b+1+rem, tsk[i].val)-b;
            for(int j=tsk[i].fro; j<=n; j+=lowbit(j))
                update(rot[j], 1, rem, tmp, 1);
            for(int j=tsk[i].too+1; j<=n; j+=lowbit(j))
                update(rot[j], 1, rem, tmp, -1);
        }
        for(int i=1; i<=n; i++){
            scanf("%d %d %d %d", &xi, &ai, &bi, &ci);
            ki = 1 + ((ll)ai*lst+bi) % ci;
            int tmp=0;
            ll ppp=0;
            for(int i=xi; i; i-=lowbit(i)){
                tmp += siz[rot[i]];
                ppp += sum[rot[i]];
            }
            if(tmp<ki)	lst = ppp;
            else{
                len = 0;
                for(int i=xi; i; i-=lowbit(i))
                    qque[++len] = rot[i];
                lst = query(1, rem, ki);
            }
            printf("%lld
    ", lst);
        }
        return 0;
    }
    
  • 相关阅读:
    Linux下安装firefox最新版
    php开发网站编码统一问题
    WordPress前台后台页面打开慢的解决方法
    超链接标签简单的几个样式属性
    jQuery结合Ajax实现简单的前端验证和服务端查询
    Javascript配合jQuery实现流畅的前端验证
    Code-Validator:验证只包含英文字母
    Code-Validator:验证小数
    Code-Validator:验证正整数
    Code-Validator:验证非负整数
  • 原文地址:https://www.cnblogs.com/poorpool/p/8343224.html
Copyright © 2011-2022 走看看