我是游戏王求吊
查看原帖
我是游戏王求吊
758679
phoenixzhan楼主2023/10/31 21:38

@phelixzhen

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define pii pair<int, int>
#define piii tuple<int, int, int>
#define mp make_pair
#define mt make_tuple
#define fi first
#define se second
#define deb(var) cerr << #var << '=' << (var) << "; "
#define int long long
namespace IO {
	#define BF 65536
	char buf[BF], *p1 = buf, *p2 = buf;
	#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, BF, stdin), p1 == p2) ? EOF : *p1++)
//	template<typename T>
	inline int uread() {
		int x = 0; char c = getchar();
		while (!isdigit(c)) c = getchar();
		while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar(); return x;
	}
//	template<typename T>
	inline int read() {
		int x = 0, f = 0; char c = getchar();
		while (!isdigit(c)) f |= c == '-', c = getchar();
		while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar(); return f ? -x : x;
	}
	char obuf[BF + 30]; int o1, o2, num[30];
	#define flush() fwrite(obuf, 1, o1, stdout), o1 = 0
	inline void putchar(const char &c) {
		obuf[o1++] = c; if (o1 >= BF) flush();
	}
//	template<typename T>
	inline void uwrite(int x) {
		do num[++o2] = x % 10; while (x /= 10);
		do obuf[o1++] = num[o2] ^ 48; while (--o2); obuf[o1++] = '\n'; if (o1 >= BF) flush();
	}
//	template<typename T>
	inline void write(const int& x) {
		if (x < 0) obuf[o1++] = '-', uwrite(-x); else uwrite(x);
	}
} using namespace IO;
namespace Maths {
	const int mod = 998244353;
	int power(int x, int y) {
		int ans = 1; while (y) {
			if (y & 1) ans = 1ll * ans * x % mod; y >>= 1; x = 1ll * x * x % mod;
		} return ans;
	}
	int fac[1000010], inv[1000010];
	void init() {
		fac[0] = fac[1] = inv[0] = inv[1] = 1;
		for (int i = 2; i <= 1e6; i++) fac[i] = 1ll * fac[i - 1] * i % mod, inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
		for (int i = 2; i <= 1e6; i++) inv[i] = 1ll * inv[i] * inv[i - 1] % mod;
	}
	int binom(int n, int m) {
		return n < m || m < 0 ? 0 : 1ll * fac[n] * inv[n - m] % mod * inv[m] % mod;
	}
} using namespace Maths;
namespace Loser {
	int n, v, m, ans[200010], mx[200010]; vector<pii> a[100010]; vector<piii> q[400010];
	void upd(int u, int l, int r, int L, int R, int id) {
		int mid = (l + r) >> 1;
		if (L <= mid && R > mid) q[u].pb(mt(L, R, id));
		else {
			int mid = (l + r) >> 1;
			if (R <= mid) upd(u << 1, l, mid, L, R, id); else upd(u << 1 | 1, mid + 1, r, L, R, id);
		}
	}
	struct Node {
		static const int blk = 333;
		int f[blk + 5], g[100010 / blk + 5];
		void clear() {
			memset(f, 0xcf, sizeof f);
			memset(g, 0xcf, sizeof g);
		}
		int& operator [](const int &k) { return k <= blk ? f[k] : g[v / k]; }
	} f[200010];
	void sol(int u, int l, int r) {
		if (l == r) return;
		int mid = (l + r) >> 1;
		sol(u << 1, l, mid), sol(u << 1 | 1, mid + 1, r);
		for (int i = mid; i >= l; i--) {
			f[i] = f[i + 1];
			int _ = 1;
			while (_ <= v) {
				int m = v / _; _ = v / (v / _) + 1;
				for (auto t: a[i]) {
					if (i < mid) f[i][m / t.se] = max(f[i][m / t.se], f[i + 1][m] + t.fi);
					else f[i][m / t.se] = max(f[i][m / t.se], t.fi);
				} 
			}
		}
		for (int i = mid + 1; i <= r; i++) {
			f[i] = f[i - 1];
			int _ = 1;
			while (_ <= v) {
				int m = v / _; _ = v / (v / _) + 1;
				for (auto t: a[i]) {
					if (i > mid + 1) f[i][m / t.se] = max(f[i][m / t.se], f[i - 1][m] + t.fi);
					else f[i][m / t.se] = max(f[i][m / t.se], t.fi);
				} 
			}
		}
		for (auto t: q[u]) {
			int l, r, id;
			tie(l, r, id) = t;
			int _ = 1; 
			while (_ <= v) {
				int m = v / _; _ = v / (v / _) + 1;
				ans[id] = max(ans[id], f[l][m] + f[r][v / (v / m)]); 
			}
		}
	} 
	void main() {
		cin >> n >> v;
		for (int i = 1, t; i <= n; i++) {
			cin >> t;
			for (int k = 1, x, y; k <= t; k++) cin >> x >> y, a[i].pb({x, y}), mx[i] = max(mx[i], x);
		}
		cin >> m;
		for (int i = 1, l, r; i <= m; i++) {
			cin >> l >> r;
			if (l != r) upd(1, 1, n, l, r, i);
			else {
				ans[i] = mx[l];
			}
		}
		sol(1, 1, n);
		for (int i = 1; i <= m; i++) cout << ans[i] << '\n';
	}
}
signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int T = 1; while (T--) Loser::main(); return 0;
}

2023/10/31 21:38
加载中...