Đăng nhập để hỏi chi tiết


Cao nhất bờ rô tin giúp e code bài này với ạ . Đa tạ đa tạ.Cao nhất cho e xin ý tưởng nữa nhaa
Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
`\color{black}{#Jadess౨ৎ}`
$\rm(C++)$
#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
long long a[N];
long long st[4 * N], lz1[4 * N], lz0[4 * N];
long long sumid(int l, int r) {
return 1LL * (l + r) * (r - l + 1) / 2;
}
void down(int id, int l, int r) {
if (!lz1[id] && !lz0[id]) return;
int m = (l + r) / 2;
st[id * 2] += lz1[id] * sumid(l, m)
+ lz0[id] * (m - l + 1);
st[id * 2 + 1] += lz1[id] * sumid(m + 1, r)
+ lz0[id] * (r - m);
lz1[id * 2] += lz1[id];
lz0[id * 2] += lz0[id];
lz1[id * 2 + 1] += lz1[id];
lz0[id * 2 + 1] += lz0[id];
lz1[id] = lz0[id] = 0;
}
void build(int id, int l, int r) {
if (l == r) {
st[id] = a[l];
return;
}
int m = (l + r) / 2;
build(id * 2, l, m);
build(id * 2 + 1, m + 1, r);
st[id] = st[id * 2] + st[id * 2 + 1];
}
void update(int id, int l, int r, int u, int v, long long A, long long B) {
if (v < l || r < u) return;
if (u <= l && r <= v) {
st[id] += A * sumid(l, r)
+ B * (r - l + 1);
lz1[id] += A;
lz0[id] += B;
return;
}
down(id, l, r);
int m = (l + r) / 2;
update(id * 2, l, m, u, v, A, B);
update(id * 2 + 1, m + 1, r, u, v, A, B);
st[id] = st[id * 2] + st[id * 2 + 1];
}
long long get(int id, int l, int r, int u, int v) {
if (v < l || r < u) return 0;
if (u <= l && r <= v) return st[id];
down(id, l, r);
int m = (l + r) / 2;
return get(id * 2, l, m, u, v)
+ get(id * 2 + 1, m + 1, r, u, v);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
build(1, 1, n);
int q;
cin >> q;
while (q--) {
int t, l, r;
cin >> t >> l >> r;
if (t == 1) {
update(1, 1, n, l, r, 1, 1 - l);
} else {
cout << get(1, 1, n, l, r) << '\n';
}
}
}
`\color{#1AD5F7}{꧁⋆⟡T}\color{#1AD5F7}{D}\color{#4DA6E6}{u}\color{#668EDD}{n}\color{#8077D5}{g}\color{#B28DFF}{\ }\color{#995FCD}{G}\color{#EA2F90}{M⟡⋆꧂}`
Hãy giúp mọi người biết câu trả lời này thế nào?
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct BIT {
int n;
vector<ll> t;
BIT(int n) : n(n), t(n + 2, 0) {}
void add(int i, ll v) {
for (; i <= n; i += i & -i) t[i] += v;
}
ll query(int i) {
ll s = 0;
for (; i > 0; i -= i & -i) s += t[i];
return s;
}
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
vector<ll> a(n + 1);
vector<ll> pre(n + 1, 0);
for (int i = 1; i <= n; i++) {
cin >> a[i];
pre[i] = pre[i - 1] + a[i];
}
BIT A(n), B(n);
BIT C(n), D(n);
auto prefix_P = [&](int p) -> ll {
if (p <= 0) return 0;
return (ll)p * (p + 1) / 2 * A.query(p) - B.query(p) / 2;
};
auto prefix_Q = [&](int p) -> ll {
if (p <= 0) return 0;
return (ll)p * C.query(p) - D.query(p);
};
int q;
cin >> q;
while (q--) {
int type, l, r;
cin >> type >> l >> r;
if (type == 1) {
A.add(l, 1);
if (r + 1 <= n) A.add(r + 1, -1);
B.add(l, (ll)l * (l - 1));
if (r + 1 <= n) B.add(r + 1, -(ll)(r + 1) * r);
ll c = 1LL - l;
C.add(l, c);
if (r + 1 <= n) C.add(r + 1, -c);
D.add(l, c * (l - 1));
if (r + 1 <= n) D.add(r + 1, -c * r);
} else {
ll ans = pre[r] - pre[l - 1];
ans += prefix_P(r) - prefix_P(l - 1);
ans += prefix_Q(r) - prefix_Q(l - 1);
cout << ans << "\n";
}
}
return 0;
}Hãy giúp mọi người biết câu trả lời này thế nào?
Bảng tin
1468
2185
1055
Bé ngoan `=>` nghe hay thí
1003
633
1989
:))))))))))
1468
2185
1055
Rùi nè cj
1468
2185
1055
Cj đổi ii
1003
633
1989
ocee
1468
2185
1055
Nhìn hài quá, cute nx
1468
2185
1055
Cj ơi út offf nhá
1468
2185
1055
Bbai cj