传送门

 

看到这个题有个很暴力的想法,

可以每一个时间点都建一颗主席树,主席树上叶子节点 i 表示优先级为 i 的任务有多少个。

当 x 到 y 有个优先级为 k 的任务时,循环 x 到 y 的每个点,都插入一个 k。

当然这样肯定完蛋。

 

x 到 y 插入一个优先级为 k 的任务?

想到差分,给时间点为 x 的主席树插入 k,给时间点为 y + 1 的主席树插入 -k。

那么求一个树状数组的前缀和就好了。

 

前缀和?

用树状数组优化。

 

这样就可以用 树状数组 套 主席树 来做。

 

——代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #define LL long long
 5 
 6 const int MAXN = 1e5 + 5, p = 200;
 7 int n, m, cnt, t;
 8 int S[MAXN], E[MAXN], P[MAXN], num[MAXN], root[MAXN], id[MAXN], q[21], s[MAXN * p], ls[MAXN * p], rs[MAXN * p];
 9 LL sum[MAXN * p], pre = 1;
10 
11 inline int read()
12 {
13     int x = 0, f = 1;
14     char ch = getchar();
15     for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
16     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
17     return x * f;
18 }
19 
20 inline bool cmp(int x, int y)
21 {
22     return P[x] < P[y];
23 }
24 
25 inline void insert(int last, int &now, int l, int r, int x, int v1, int v2)
26 {
27     if(!now) now = ++cnt;
28     sum[now] = sum[last] + v1, s[now] = s[last] + v2, ls[now] = ls[last], rs[now] = rs[last];
29     if(l == r) return;
30     int mid = (l + r) >> 1;
31     if(x <= mid) insert(ls[last], ls[now], l, mid, x, v1, v2);
32     else insert(rs[last], rs[now], mid + 1, r, x, v1, v2);
33 }
34 
35 inline LL query(int l, int r, int k)
36 {
37     if(l == r)
38     {
39         LL t2 = 0;
40         for(int i = 1; i <= t; i++) t2 += sum[q[i]];
41         return t2;
42     }
43     LL t2 = 0;
44     int t1 = 0, mid = (l + r) >> 1;
45     for(int i = 1; i <= t; i++) t1 += s[ls[q[i]]], t2 += sum[ls[q[i]]];
46     if(k <= t1)
47     {
48         for(int i = 1; i <= t; i++) q[i] = ls[q[i]];
49         return query(l, mid, k);
50     }
51     else
52     {
53         for(int i = 1; i <= t; i++) q[i] = rs[q[i]];
54         return t2 + query(mid + 1, r, k - t1);
55     }
56 }
57 
58 int main()
59 {
60     int i, j, x, a, b, c;
61     LL k;
62     n = read();
63     m = read();
64     for(i = 1; i <= n; i++)
65     {
66         S[i] = read();
67         E[i] = read();
68         P[i] = read();
69         id[i] = i;
70     }
71     std::sort(id + 1, id + n + 1, cmp);
72     for(i = 1; i <= n; i++) num[id[i]] = i;
73     for(i = 1; i <= n; i++)
74     {
75         for(j = S[i]; j <= n; j += j & -j) insert(root[j], root[j], 1, n, num[i], P[i], 1);
76         for(j = E[i] + 1; j <= n; j += j & -j) insert(root[j], root[j], 1, n, num[i], -P[i], -1);
77     }
78     for(i = 1; i <= m; i++)
79     {
80         scanf("%d %d %d %d", &x, &a, &b, &c);
81         k = 1 + (LL)(a * pre + b) % c;
82         t = 0;
83         for(j = x; j; j -= j & -j) q[++t] = root[j];
84         pre = query(1, n, k);
85         printf("%lld\n", pre);
86     }
87     return 0;
88 }
View Code

相关文章:

  • 2021-08-08
  • 2021-11-04
  • 2021-12-22
  • 2021-10-28
  • 2021-07-03
  • 2022-03-03
  • 2022-01-15
猜你喜欢
  • 2022-03-01
  • 2022-12-23
  • 2021-07-03
  • 2021-07-21
  • 2021-12-17
  • 2021-10-07
  • 2022-02-02
相关资源
相似解决方案