Educational Codeforces Round 117 (Rated for Div. 2)
思路:
首先考虑,假如我们在加完第y层的时候被ban了,那之后的第y+1层,y+2层……依旧会被ban,同样的,如果我们在加完第y层没有被ban,那之前的第y-1层,y-2层……也没有被ban,所以我们可以二分答案y。
很明显我们可以分两种情况讨论:当y<=k时,他的和就是1加到y,我们写一个f函数来计算前n项和表示出来就是就是f(y),那这时我们只需看看是否>=x就好了,但当y>k时,我们要计算的是k-1,k-2……这些和,
我们可以举几个例子看看他应该到几,比如k是5,y是7的话,应该是加到1 2 3 4 5 4 3,是3,对应的就是k-(y-k) = 2k-y,所以我们要加到这一项,那他的和我们就可以用k-1项的和减去之后的和,之后的和这么考虑,由于我们要加到2k-y这一项,所以之后的项的和就是1加到2k-y-1,所以当y大于k时,我们的和可以表示成f(k)+f(k-1)-f(2k-y-1)
#include <bits/stdc++.h> #define IOS ios::sync_with_stdio(false);cin.tie(0) using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 200010; const double PI = acos(-1); LL f(LL x) { return (1 + x) * x / 2; } int main() { IOS; int T; cin >> T; while(T -- ) { LL k, x; cin >> k >> x; LL l = 1, r = 2 * k - 1; LL res = 0; bool over = false; while(l < r) { LL mid = l + r >> 1; if(mid <= k) over = (f(mid) >= x); else over = (f(k) + f(k - 1) - f(k - (mid - k) - 1) >= x); if(over) r = mid; else l = mid + 1; } cout << l << endl; } return 0; }

浙公网安备 33010602011771号