QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#370564#6744. Squarekinoko777AC ✓26ms3620kbC++142.1kb2024-03-29 11:21:422024-03-29 11:21:42

Judging History

你现在查看的是最新测评结果

  • [2024-03-29 11:21:42]
  • 评测
  • 测评结果:AC
  • 用时:26ms
  • 内存:3620kb
  • [2024-03-29 11:21:42]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> p11;
typedef pair<string, int> ps1;
typedef pair<ll, ll> p1111;
#define vv vector
#define pb emplace_back
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define endl '\n'
#define Endl '\n'
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define per(a, b, c) for(int a = (b); a <= (c); a ++)
#define rep(a, b, c) for(int a = (b); a >= (c); a --)
#define aper(A) for(auto i : A) cout << i << ' ';cout << '\n'
#define lowbit(x) ((x) & (-x))
#define yes cout << "Yes" << endl
#define no cout << "No" << endl
#define YES cout << "YES" << endl
#define NO cout << "NO" << endl
#define PAI acos(-1)
#define int long long
using ll = long long;
void umin(int &x,int y){if(x>y)x=y;}
void umax(int &x,int y){if(x<y)x=y;}

void pre_work()
{
    
}

int up(int n)
{
    int l = 1, r = 2e9;
    while(l < r)
    {
        int mid = l + r >> 1;
        if(mid * (mid + 1) / 2 >= n) r = mid;
        else l = mid + 1;
    }
    return l;
}

int pos(int n, int m)
{
    return n - (m - 1) * m / 2;
}

int sum(int n)
{
    return n * (n + 1) / 2 - (n - 1) * n / 2;
}

void solve()
{
    int n, m;
    cin >> n >> m;
    int now = sqrt(2 * n) + 1.5;
    if (n >= m)
    {
        cout << n - m << endl;
    }
    else
    {   
        int n1 = up(n), m1 = up(m);
        int ans = m1 - n1;
        int npos = sum(n1) - pos(n, n1) + 1;
        int mpos = sum(m1) - pos(m, m1) + 1;
        if(npos <= mpos)
            ans += mpos - npos;
        else
        {
            ans ++;
            int suml = sum(n1 + 1);
            int lnpos = suml - npos + 1;
            ans += mpos + lnpos - 1;
            int res = m1 - n1;
            res += n - n1 * (n1 - 1) / 2;
            res += mpos;
            ans = min(ans, res);
        }
        cout << ans << endl;
    }
}

signed main()
{
  	IOS;
	int tt = 1;
	cin >> tt;
	pre_work();
	while(tt --)
	{
		solve();
	}
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3604kb

input:

2
5 1
1 5

output:

4
3

result:

ok 2 number(s): "4 3"

Test #2:

score: 0
Accepted
time: 26ms
memory: 3620kb

input:

100000
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
1 15
1 16
1 17
1 18
1 19
1 20
1 21
1 22
1 23
1 24
1 25
1 26
1 27
1 28
1 29
1 30
1 31
1 32
1 33
1 34
1 35
1 36
1 37
1 38
1 39
1 40
1 41
1 42
1 43
1 44
1 45
1 46
1 47
1 48
1 49
1 50
1 51
1 52
1 53
1 54
1 55
1 56
1 57
1 58
1 59
1 60
1 ...

output:

0
2
1
4
3
2
6
5
4
3
8
7
6
5
4
10
9
8
7
6
5
12
11
10
9
8
7
6
14
13
12
11
10
9
8
7
16
15
14
13
12
11
10
9
8
18
17
16
15
14
13
12
11
10
9
20
19
18
17
16
15
14
13
12
11
10
22
21
20
19
18
17
16
15
14
13
12
11
24
23
22
21
20
19
18
17
16
15
14
13
12
26
25
24
23
22
21
20
19
18
1
0
2
2
1
3
4
3
2
4
6
5
4
3
5
...

result:

ok 100000 numbers