QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#775513 | #9791. Intrusive Donkey | ucup-team059# | WA | 1ms | 5880kb | C++20 | 3.3kb | 2024-11-23 16:07:31 | 2024-11-23 16:07:31 |
Judging History
answer
#include <bits/stdc++.h>
#define ll long long
constexpr int N = 2E5 + 7;
int n, q;
ll a[N];
struct tag{
ll mul, add;
};
struct Node{
ll val, siz;
tag t;
}seg[N * 4];
tag operator + (const tag &t1, const tag &t2){
return {t1.mul * t2.mul, (t1.add * t2.mul + t2.add)};
}
void update(int id){
seg[id].val = seg[id * 2].val + seg[id * 2 + 1].val;
}
void settag(int id, tag t){
seg[id].t = seg[id].t + t;
seg[id].val = seg[id].val * t.mul + t.add * seg[id].siz;
}
void pushdown(int id){
if (seg[id].t.mul != 1 || seg[id].t.add != 0){
settag(id * 2, seg[id].t);
settag(id * 2 + 1, seg[id].t);
seg[id].t = {1, 0};
}
}
void build(int id, int l, int r){
seg[id].siz = r - l + 1;
seg[id].t = {1, 0};
if (l == r){
seg[id].val = a[l];
return;
}
int mid = l + r >> 1;
build(2 * id, l, mid);
build(2 * id + 1, mid + 1, r);
update(id);
}
void modify(int id, int l, int r, int ql, int qr, tag t){
if (l == ql && r == qr){
settag(id, t);
return;
}
pushdown(id);
int mid = l + r >> 1;
if (qr <= mid){
modify(id * 2, l, mid, ql, qr, t);
}else if (ql > mid){
modify(id * 2 + 1, mid + 1, r, ql, qr, t);
}else{
modify(id * 2, l, mid, ql, mid, t);
modify(id * 2 + 1, mid + 1, r, mid + 1, qr, t);
}
update(id);
}
ll query(int id, int l, int r, int ql, int qr){
if (l == ql && r == qr){
return seg[id].val;
}
pushdown(id);
int mid = l + r >> 1;
if (qr <= mid){
return query(id * 2, l, mid, ql, qr);
}else if (ql > mid){
return query(id * 2 + 1, mid + 1, r, ql, qr);
}else{
return query(id * 2, l, mid, ql, mid) + query(id * 2 + 1, mid + 1, r, mid + 1, qr);
}
}
ll pre(int i){
return query(1, 1, n, 1, i);
}
int upper(int id, int l, int r, ll val){ // >= val , idx
if (l == r){
return l;
}
int mid = l + r >> 1;
if (seg[2 * id].val < val){
val -= seg[2 * id].val;
return upper(2 * id + 1, mid + 1, r, val);
}else{
return upper(2 * id, l, mid, val);
}
}
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin >> n >> q;
std::string s;
std::cin >> s;
s = " " + s;
for (int i = 1; i <= n; i++){
a[i] = 1;
}
build(1, 1, n);
// std::cout << seg
while (q--){
ll op;
std::cin >> op;
if (op == 1){
ll l, r;
std::cin >> l >> r;
ll idxl = upper(1, 1, n, l);
ll idxr = upper(1, 1, n, r);
// std::cerr << idxl << ' ' << idxr << '\n';
ll addl = pre(idxl) - l + 1;
// std::cerr << "ZZZ" << idxl << ' ' << idxr << '\n';
if (idxl != idxr){
ll addr = query(1, 1, n, idxr, idxr) - (pre(idxr) - r);
// std::cout << "AAA" << addl << " " << addr << '\n';
modify(1, 1, n, idxr, idxr, tag{1, addr});
// idxl++;
// idxr--;
if (idxl + 1 <= idxr - 1){
modify(1, 1, n, idxl + 1, idxr - 1, tag{2, 0});
}
modify(1, 1, n, idxl, idxl, tag{1, addl});
// for (int i = 1; i <= n; i++){
// std::cout << query(1, 1, n, i, i) << " \n"[i == n];
// }
// for (int i = 1; i <= n; i++){
// std::cout << pre(i) << " \n"[i == n];
// }
}else{
modify(1, 1, n, idxl, idxl, tag{1, addl});
}
}else{
ll x;
std::cin >> x;
std::cout << s[upper(1, 1, n, x)] << '\n';
}
// for (int i = 1; i <= n; i++){
// std::cout << query(1, 1, n, i, i) << " \n"[i == n];
// }
// std::cerr << "SSSS\n";
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 5652kb
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: 1ms
memory: 5604kb
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: 3616kb
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: 1ms
memory: 5652kb
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: 1ms
memory: 5880kb
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 f f f f f v f f f f f f f f f f f f f f f f f f f v
result:
wrong answer 2nd lines differ - expected: 'e', found: 'f'