QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#820858#9791. Intrusive DonkeykkzyrWA 0ms5700kbC++172.7kb2024-12-19 08:29:242024-12-19 08:29:24

Judging History

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

  • [2024-12-19 08:29:24]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:5700kb
  • [2024-12-19 08:29:24]
  • 提交

answer

#include <iostream>
#include <string>
using namespace std;

const int MAX_N = 2e5 + 5;

int n, q;
string s;

int num_ranges;
int ranges[MAX_N];

struct node{
    int left, right;
    long long size;
};
node merge(node x, node y){
    return {x.left, y.right, x.size + y.size};
}

int size_tree;
node tree[4 * MAX_N];

int find(long long index){
    long long curr_sum = 0;
    int tree_node = 1;
    while (tree_node < size_tree){
        if (curr_sum + tree[2 * tree_node].size + 1 <= index){
            curr_sum += tree[2 * tree_node].size;
            tree_node = 2 * tree_node + 1;
        }
        else{
            tree_node *= 2;
        }
    }
    return tree_node - (size_tree - 1);
}

void double_range(long long l, long long r){
    int leftmost = find(l);
    int rightmost = find(r);
    if (leftmost == rightmost){
        tree[size_tree - 1 + leftmost].size += r - l + 1;
        leftmost += size_tree - 1;
        leftmost /= 2;
        while (leftmost >= 1){
            tree[leftmost] = merge(tree[2 * leftmost], tree[2 * leftmost + 1]);
            leftmost /= 2;
        }
    }
    else{
        tree[size_tree - 1 + leftmost].size += tree[size_tree - 1 + leftmost].right - l + 1;
        tree[size_tree - 1 + rightmost].size += r - tree[size_tree - 1 + rightmost].left + 1;
        for (int i = leftmost + 1;i <= rightmost - 1;i++){
            tree[size_tree - 1 + i].size *= 2;
        }
        leftmost += size_tree - 1, rightmost += size_tree - 1;
        while (leftmost >= 1){
            leftmost /= 2, rightmost /= 2;
            for (int i = leftmost;i <= rightmost;i++){
                tree[i] = merge(tree[2 * i], tree[2 * i + 1]);
            }
        }
    }
}

int main(){
    cin >> n >> q >> s;
    int pos = 0;
    while (pos < s.size()){
        int original = pos;
        while (pos < s.size() and s[pos] == s[original]){
            pos++;
        }
        num_ranges++;
        ranges[num_ranges] = pos - original;
    }
    size_tree = 1;
    while (size_tree < num_ranges){
        size_tree *= 2;
    }
    for (int i = 1;i <= size_tree;i++){
        tree[size_tree - 1 + i] = {i, i};
        if (i <= num_ranges){
            tree[size_tree - 1 + i].size = ranges[i];
        }
    }
    for (int i = size_tree - 1;i >= 1;i--){
        tree[i] = merge(tree[2 * i], tree[2 * i + 1]);
    }
    for (int i = 1;i <= q;i++){
        int type;
        cin >> type;
        if (type == 1){
            long long l, r;
            cin >> l >> r;
            double_range(l, r);
        }
        else{
            long long index;
            cin >> index;
            cout << s[find(index) - 1] << '\n';
        }
    }
    return 0;
}

詳細信息

Test #1:

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

input:

4 7
abac
2 2
2 3
1 2 3
2 3
2 4
2 5
2 6

output:

b
a
b
a
a
c

result:

ok 6 lines

Test #2:

score: 0
Accepted
time: 0ms
memory: 5700kb

input:

5 4
shrek
1 1 2
2 7
1 1 7
2 7

output:

k
h

result:

ok 2 lines

Test #3:

score: 0
Accepted
time: 0ms
memory: 3568kb

input:

4 7
abac
2 2
2 3
1 2 3
2 3
2 4
2 5
2 6

output:

b
a
b
a
a
c

result:

ok 6 lines

Test #4:

score: 0
Accepted
time: 0ms
memory: 5700kb

input:

5 4
shrek
1 1 2
2 7
1 1 7
2 7

output:

k
h

result:

ok 2 lines

Test #5:

score: -100
Wrong Answer
time: 0ms
memory: 3588kb

input:

3 55
vfe
1 2 3
1 2 2
1 3 5
2 4
1 1 2
2 9
2 7
2 5
1 10 10
1 1 1
2 9
1 8 12
2 8
1 7 10
2 1
1 5 6
1 1 4
1 20 24
1 14 32
1 19 38
2 48
1 56 64
2 58
2 19
1 64 72
1 36 86
2 11
1 117 124
2 38
2 108
2 85
1 112 118
2 153
2 40
2 114
2 80
1 11 18
2 27
2 73
1 159 162
2 84
1 130 164
2 163
2 65
1 150 156
1 101 109...

output:

f
e
e
f
e
e
v
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
v

result:

wrong answer 3rd lines differ - expected: 'f', found: 'e'