結果
| 問題 | No.876 Range Compress Query |
| コンテスト | |
| ユーザー |
SSRS
|
| 提出日時 | 2021-12-18 18:24:18 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 234 ms / 2,000 ms |
| コード長 | 2,395 bytes |
| コンパイル時間 | 1,874 ms |
| コンパイル使用メモリ | 173,440 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2024-09-15 13:50:48 |
| 合計ジャッジ時間 | 5,563 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct dual_segment_tree{
int N;
vector<long long> ST;
dual_segment_tree(vector<int> &A){
int N2 = A.size();
N = 1;
while (N < N2){
N *= 2;
}
ST = vector<long long>(N * 2 - 1, 0);
for (int i = 0; i < N2; i++){
ST[N - 1 + i] = A[i];
}
}
long long operator [](int k){
k += N - 1;
long long ans = ST[k];
while (k > 0){
k = (k - 1) / 2;
ans += ST[k];
}
return ans;
}
void range_add(int L, int R, int x, int i, int l, int r){
if (r <= L || R <= l){
return;
} else if (L <= l && r <= R){
ST[i] += x;
} else {
int m = (l + r) / 2;
range_add(L, R, x, i * 2 + 1, l, m);
range_add(L, R, x, i * 2 + 2, m, r);
}
}
void range_add(int L, int R, int x){
range_add(L, R, x, 0, 0, N);
}
};
struct binary_indexed_tree{
int N;
vector<int> BIT;
binary_indexed_tree(vector<int> &A){
N = A.size();
BIT = vector<int>(N + 1, 0);
for (int i = 0; i < N; i++){
BIT[i + 1] += A[i];
}
for (int i = 1; i < N; i++){
BIT[i + (i & -i)] += BIT[i];
}
}
void add(int i, int x){
i++;
while (i <= N){
BIT[i] += x;
i += i & -i;
}
}
int sum(int i){
int ans = 0;
while (i > 0){
ans += BIT[i];
i -= i & -i;
}
return ans;
}
int sum(int L, int R){
return sum(R) - sum(L);
}
};
int main(){
int N, Q;
cin >> N >> Q;
vector<int> a(N);
for (int i = 0; i < N; i++){
cin >> a[i];
}
vector<int> b(N - 1, 0);
for (int i = 0; i < N - 1; i++){
if (a[i] != a[i + 1]){
b[i]++;
}
}
dual_segment_tree ST(a);
binary_indexed_tree BIT(b);
for (int i = 0; i < Q; i++){
int t;
cin >> t;
if (t == 1){
int l, r, x;
cin >> l >> r >> x;
l--;
if (l > 0){
if (ST[l] != ST[l - 1]){
BIT.add(l - 1, -1);
}
}
if (r < N){
if (ST[r] != ST[r - 1]){
BIT.add(r - 1, -1);
}
}
ST.range_add(l, r, x);
if (l > 0){
if (ST[l] != ST[l - 1]){
BIT.add(l - 1, 1);
}
}
if (r < N){
if (ST[r] != ST[r - 1]){
BIT.add(r - 1, 1);
}
}
}
if (t == 2){
int l, r;
cin >> l >> r;
l--;
cout << BIT.sum(l, r - 1) + 1 << endl;
}
}
}
SSRS