CF1810D 题解
思路
如果一只蜗牛在第 天爬到了顶,说明它在 天还没爬到,也就是说这棵树的高度在 之间。然后更新当前上下界(下界取较大值,上界取较小值),此时如果上界比下界还小说明矛盾,不采用,否则就采用这只蜗牛的说法。
然后如果有蜗牛来询问,那么就只要看它爬上界的天数和爬下界的天数是否相等即可,如果不相等说明有多种可能,回答 ,否则就回答天数 。
代码
# 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;
}

浙公网安备 33010602011771号