Educational Codeforces Round 117 (Rated for Div. 2)

C. Chat Ban

思路:

首先考虑,假如我们在加完第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;
}

 

posted @ 2021-11-25 09:09  彦辰kkkkk  阅读(59)  评论(0)    收藏  举报