CF1810D 题解

思路

如果一只蜗牛在第 nn 天爬到了顶,说明它在 n1n-1 天还没爬到,也就是说这棵树的高度在 (n2)(ab)+a+1(n1)(ab)+a(n-2)(a-b)+a+1\sim(n-1)(a-b)+a 之间。然后更新当前上下界(下界取较大值,上界取较小值),此时如果上界比下界还小说明矛盾,不采用,否则就采用这只蜗牛的说法。

然后如果有蜗牛来询问,那么就只要看它爬上界的天数和爬下界的天数是否相等即可,如果不相等说明有多种可能,回答 1-1,否则就回答天数 max(0,lb1ab)+1\max(0,\lceil\frac{l-b-1}{a-b}\rceil)+1

代码

# include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int t, q, op;
ll l, r, x, y, a, b, n;
int main () {
	ios::sync_with_stdio (0);
	cin.tie (0);
	cout.tie (0);
	cin >> t;
	while (t --) {
		l = 0, r = 1e18;
		cin >> q;
		while (q --) {
			cin >> op >> a >> b;
			if (op ^ 2) {
				cin >> n;
				x = max (l, (n ^ 1 ? (n - 2) * (a - b) + a + 1 : 0ll)), y = min (r, (n - 1) * (a - b) + a);
				if (x > y)
					cout << "0 ";
				else
					cout << "1 ", l = x, r = y;
			} else {
				x = max (0ll, (l - b - 1) / (a - b)) + 1, y = max (0ll, (r - b - 1) / (a - b)) + 1;
				if (y > x)
					cout << "-1 ";
				else
					cout << x << ' ';
			}
		}
		cout << '\n';
	}
	return 0;
}
posted @ 2024-04-26 19:38  Vitamin_B  阅读(11)  评论(0)    收藏  举报  来源