#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int m, n;
ll cnt[6400010];
ll sum[6400010];
int lson[6400010], rson[6400010], tot;
int root[200010];
struct task{
int l, r;
ll p;
};
inline bool operator<(const task& a, const task& b){
return a.p < b.p;
}
task tasks[100010];
void build(int &x, int l, int r){
if(!x) x = ++tot;
if(l == r) return;
int mid = (l + r) >> 1;
build(lson[x], l, mid);
build(rson[x], mid + 1, r);
}
void update(int &x, int base, int l, int r, int pos, int d1, ll d2){
if(!x) x = ++tot;
if(l == r){
cnt[x] = cnt[base] + d1;
sum[x] = sum[base] + d2;
return;
}
int mid = (l + r) >> 1;
if(pos <= mid){
update(lson[x], lson[base], l, mid, pos, d1, d2);
rson[x] = rson[base];
}else{
update(rson[x], rson[base], mid + 1, r, pos, d1, d2);
lson[x] = lson[base];
}
cnt[x] = cnt[lson[x]] + cnt[rson[x]];
sum[x] = sum[lson[x]] + sum[rson[x]];
}
int query_cnt(int &x, int l, int r, int l2, int r2){
if(!x) x = ++tot;
if(l2 <= l && r <= r2) return cnt[x];
int mid = (l + r) >> 1;
int ans = 0;
if(l2 <= mid) ans += query_cnt(lson[x], l, mid, l2, r2);
if(r2 > mid) ans += query_cnt(rson[x], mid + 1, r, l2, r2);
return ans;
}
int query_sum(int &x, int l, int r, int l2, int r2){
if(!x) x = ++tot;
if(l2 <= l && r <= r2) return sum[x];
int mid = (l + r) >> 1;
ll ans = 0;
if(l2 <= mid) ans += query_sum(lson[x], l, mid, l2, r2);
if(r2 > mid) ans += query_sum(rson[x], mid + 1, r, l2, r2);
return ans;
}
int main(){
cin >> m >> n;
for(int i = 1; i <= m; i ++){
cin >> tasks[i].l >> tasks[i].r >> tasks[i].p;
}
sort(tasks + 1, tasks + m + 1);
build(root[0], 1, n + 1);
for(int i = 1; i <= m; i ++){
update(root[(i << 1) - 1], root[(i << 1) - 2], 1, n + 1, tasks[i].l, 1, tasks[i].p);
update(root[(i << 1)], root[(i << 1) - 1], 1, n + 1, tasks[i].r + 1, -1, -tasks[i].p);
}
ll pre = 1;
for(int e = 1; e <= n; e ++){
int x, a, b, c;
cin >> x >> a >> b >> c;
int k = 1 + (1ll * a * pre + b) % c;
int l = 1, r = m + 1;
while(r - l > 1){
int mid = (l + r) >> 1;
int cur = query_cnt(root[mid << 1], 1, n + 1, 1, x);
// printf("%d %d %d %d\n", l, r, mid, cur);
if(cur <= k) l = mid;
else r = mid;
}
cout << (pre = query_sum(root[l << 1], 1, n + 1, 1, x)) << endl;
}
}
总体来说就是按优先级排序,然后二分,不知道为什么在 hack 数据上 WA,其它数据都过了,https://www.luogu.com.cn/record/227898855
看了前人的警示后人,没有找到问题,请问问题出在哪里?