样例都过不了,求助大佬!
查看原帖
样例都过不了,求助大佬!
105222
zhangyuzhe楼主2020/11/21 15:58
#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;
int n, m, len, b[2 * N];
int cnt, root[N];
struct ins {
	int k, w;
}a[N * 2];
struct node {
	int l, r;
	long long sum, tot;
}tree[N * 40];

int get (int x) {
	return lower_bound (b + 1, b + 1 + len, x) - b;
}

int cmp (ins x, ins y) {
	return x.k < y.k;
}

inline void build (int &p, int l, int r) {
	p = ++cnt;
	if (l == r) return ;
	int mid = l + r >> 1;
	build (tree[p].l, l, mid);
	build (tree[p].r, mid + 1, r);
}

inline void change (int &p, int l, int r, int k, int s) {
	tree[++cnt] = tree[p]; p = cnt; tree[cnt].sum ++; tree[cnt].tot += s;
	if (l == r) return ;
	int mid = l + r >> 1;
	if (k <= mid) change (tree[p].l, l, mid, k, s);
	else change (tree[p].r, mid + 1, r, k, s);
}

inline long long ask (int p, int l, int r, int k) {
	if (l == r) return tree[p].tot;
	int mid = l + r >> 1;
	long long total = 0;
	if (tree[tree[p].l].sum >= k) total += ask (tree[p].l, l, mid, k);
	else {
		total += tree[tree[p].l].tot;
		total += ask (tree[p].r, mid + 1, r, k - tree[tree[p].l].sum);
	}
	return total;
}

int main () {
	long long pre = 1;
	scanf ("%d%d", &m, &n);
	for (int s, e, p, i = 1; i <= m; i ++ ) {
		scanf ("%d%d%d", &s, &e, &p);
		b[i] = p; b[i + m] = -p;
		a[i].k = s; a[i].w = p;
		a[i + m].k = e; a[i + m].w = -p;
	}
	sort (b + 1, b + 1 + 2 * m);
	len = unique (b + 1, b + 1 + 2 * m) - b - 1;
	build (root[0], 1, len);
	sort (a + 1, a + 1 + m * 2, cmp);
	for (int i = 1; i <= m * 2; i ++ ) {
		if (!root[a[i].k]) {
			int p = a[i].k;
			while (!root[--p]);
			root[a[i].k] = root[p];
		}
		change (root[a[i].k], 1, len, get (a[i].w), a[i].w);
	}
	for (int i = 1; i <= n; i ++ ) {
		int x, a, b, c, k;
		scanf ("%d%d%d%d", &x, &a, &b, &c);
		k = 1 + (a * pre + b) % c;
		pre = ask (root[x], 1, len, k);
		printf ("%lld\n", pre);
	}
	return 0;
}
2020/11/21 15:58
加载中...