QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#724847#5117. Find MaximumYurily#WA 2ms3944kbC++202.1kb2024-11-08 15:19:572024-11-08 15:19:58

Judging History

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

  • [2024-11-08 15:19:58]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:3944kb
  • [2024-11-08 15:19:57]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int L = 38;

    LL tri[L + 3];
    LL l, r;

LL pick(LL x, int i){
    return x / tri[i] % 3;
}

bool check(LL x, int i){
    for(int j = i; j >= 0; j--)
        if(pick(x, j) != 2)
            return false;
    return true;
}

bool check1(LL x, int i){
    if(i < 0)
        return false;
    bool c1 = false;
    for(int j = i, xi; j >= 0; j--){
        xi = pick(x, i);
        if(xi == 0)
            return false;
        if(xi == 1)
            if(c1)
                return false;
            else{
                c1 = true;
                continue;
            }
    }
    return true;
}

void sol(){
    scanf("%lld%lld", &l, &r);

    int sum = 0;
    int flag = -1;
    for(int k = L, li, ri; k >= 0; k--){
        li = pick(l, k);
        ri = pick(r, k);

        if(flag == -1 && ri > 0){
            flag = k;
            sum += k + 1;
        }

        if(li == ri){
            if(flag != -1)
                sum += li;
            continue;
        }
        
        if(ri == 1){
            if(check(r, k - 1)){
                printf("%d\n", sum + 1 + k * 2);        //[0..k-1]*2 => k * 2
                return ;
            }
            else {
                if(flag == k){
                    if(check1(r, k - 1))
                        printf("%d\n", sum + 1 + (k - 1) * 2 + 1);
                    else 
                        printf("%d\n", sum - 1 + k * 2);
                }
                else {
                    printf("%d\n", sum + 0 + k * 2);
                }
                return ;
            }
        }
        else {  //ri==2
            if(check(r, k - 1)){
                printf("%d\n", sum + 2 + k * 2);
                return ;
            }
            else {
                printf("%d\n", sum + 1 + k * 2);
                return ;
            }
        }
    }

    printf("%d\n", sum);
}

int main(){
    tri[0] = 1;
    for(int i = 1; i <= L; i++)
        tri[i] = tri[i - 1] * 3;

    int T;
    scanf("%d", &T);
    while(T--)
        sol();

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5

output:

3
3
4
5
3
4
5
4
5
5

result:

ok 10 numbers

Test #2:

score: -100
Wrong Answer
time: 2ms
memory: 3900kb

input:

5050
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 61...

output:

2
3
3
4
5
5
5
6
6
6
6
6
6
6
7
7
8
8
8
8
8
8
8
8
8
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
10
10
10
10
10
10
10
10
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12
3
3
4
5
5
5
6
6
6
6
6
6
6
7
7
8
8
8
8
8
8
8
...

result:

wrong answer 14th numbers differ - expected: '7', found: '6'