[CQOI 2015] 任务查询系统

[题目链接]

          https://www.lydsy.com/JudgeOnline/problem.php?id=3932

[算法]

        首先 , 我们可以将(Si , Ei , Pi)转化为在Si处加入Pi , 在(Ei + 1)出删除Pi

        建立可持久化线段树 , 维护每秒出现任务的个数和优先级的和 , 即可

        时间复杂度 : O(NlogN)

[代码]

       

#include<bits/stdc++.h>
using namespace std;
#define MAXN 200010
typedef long long LL;

int n , m , idx , version;
int S[MAXN] , E[MAXN] , P[MAXN] , root[MAXN * 40] , cnt[MAXN * 40] , tmp[MAXN * 40] , lson[MAXN * 40] , rson[MAXN * 40] , rt[MAXN * 40];
LL sum[MAXN * 40];
multiset< int > ins[MAXN] , del[MAXN];

template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{
    T f = 1; x = 0;
    char c = getchar();
    for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
    for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
    x *= f;
}
inline void build(int &k , int l , int r)
{
        k = ++idx;
        cnt[k] = sum[k] = 0;
        if (l == r) return;
        int mid = (l + r) >> 1;
        build(lson[k] , l , mid);
        build(rson[k] , mid + 1 , r);        
}
inline void modify(int &k , int old , int l , int r , int x , int value)
{
        k = ++idx;
        lson[k] = lson[old] , rson[k] = rson[old];
        cnt[k] = cnt[old] + value;
        sum[k] = sum[old] + 1LL * tmp[x] * value;    
        if (l == r) return;
        int mid = (l + r) >> 1;
        if (mid >= x) modify(lson[k] , lson[k] , l , mid , x , value);
        else modify(rson[k] , rson[k] , mid + 1 , r , x , value);
}
inline LL query(int &k , int l , int r , int x)
{
    if (l == r) return 1LL * tmp[l] * min(x , cnt[k]);
    int mid = (l + r)    >> 1;
    if (cnt[lson[k]] >= x) return query(lson[k] , l , mid , x);
    else return sum[lson[k]] + query(rson[k] , mid + 1 , r , x - cnt[lson[k]]); 
}
 
int main()
{
        
        read(n); read(m);
        for (int i = 1; i <= n; i++)
        {
              read(S[i]);
                read(E[i]);
              read(P[i]);
              tmp[i] = P[i];
        }
        sort(tmp + 1 , tmp + n + 1);
        int len = unique(tmp +  1 , tmp + n + 1) - tmp - 1;
        for (int i = 1; i <= n; i++) 
        {
                P[i] = lower_bound(tmp +  1 , tmp + len + 1 , P[i]) - tmp;
                ins[S[i]].insert(P[i]);
                del[E[i] + 1].insert(P[i]);
        }
        build(root[version = 0] , 1 , len);
        for (int i = 1; i <= n; i++)
        {
                for (multiset< int > :: iterator it = ins[i].begin(); it != ins[i].end(); it++)
                {
                        int t = (*it);
                        modify(root[++version] , root[version] , 1 , n , t , 1);    
                }        
                for (multiset< int > :: iterator it = del[i].begin(); it != del[i].end(); it++)
                {
                        int t = (*it);
                        modify(root[++version] , root[version] , 1 , n , t , -1);
                }
                rt[i] = version;
        }
        LL pre = 1;
        for (int i = 1; i <= m; i++)
        {
            LL xi , ai , bi , ci;
            read(xi); read(ai); read(bi); read(ci);
            int ki = (1LL * ai * (pre % ci) % ci + bi % ci) % ci + 1;
            printf("%lld
" , pre = query(root[rt[xi]] , 1 , n , ki));        
        }
        
        return 0;
    
}
原文地址:https://www.cnblogs.com/evenbao/p/9975381.html