提出 #73080336
ソースコード 拡げる
#include<bits/stdc++.h>
#include"atcoder/all"
using namespace std;
using namespace atcoder;
#define int long long
int inf = 2000000000000000000;
struct SegmentTreemin {
vector<int> data;
int size;
// 配列の初期値を決めておく
int syoki=inf;
int f(int a,int b){
// 最大値: max 最小値: min 総和 a+b
return min(a,b);
}
SegmentTreemin(int n) {
size = 1;
while (size < n) {
size <<= 1;
}
data.assign(2 * size, syoki);
}
int query(int a, int b, int k, int l, int r) {
if (r <= a || b <= l) {
return(syoki);
}
if (a <= l && r <= b) {
return(data[k]);
}
return(f(query(a, b, 2 * k + 1, l, (l + r) >> 1), query(a, b, 2 * k + 2, (l + r) >> 1, r)));
}
int query(int a, int b) {
return(query(a, b, 0, 0, size));
}
void update(int k, int x) {
k += size - 1;
data[k] = x;
while (k > 0) {
k = (k - 1) >> 1;
data[k] = f(data[2 * k + 1], data[2 * k + 2]);
}
}
};
struct SegmentTreemax {
vector<int> data;
int size;
// 配列の初期値を決めておく
int syoki=0;
int f(int a,int b){
// 最大値: max 最小値: min 総和 a+b
return max(a,b);
}
SegmentTreemax(int n) {
size = 1;
while (size < n) {
size <<= 1;
}
data.assign(2 * size, syoki);
}
int query(int a, int b, int k, int l, int r) {
if (r <= a || b <= l) {
return(syoki);
}
if (a <= l && r <= b) {
return(data[k]);
}
return(f(query(a, b, 2 * k + 1, l, (l + r) >> 1), query(a, b, 2 * k + 2, (l + r) >> 1, r)));
}
int query(int a, int b) {
return(query(a, b, 0, 0, size));
}
void update(int k, int x) {
k += size - 1;
data[k] = x;
while (k > 0) {
k = (k - 1) >> 1;
data[k] = f(data[2 * k + 1], data[2 * k + 2]);
}
}
};
signed main(){
int n,d;cin>>n>>d;
int a[n];
for(int i=0;i<n;i++)cin>>a[i];
SegmentTreemin Smin(n);
SegmentTreemax Smax(n);
for(int i=0;i<n;i++){
Smin.update(i,a[i]);
Smax.update(i,a[i]);
}
int R=0;
int ans=0;
for(int l=0;l<n;l++){
if(R<l)R=l;
for(int j=R+1;j<n;j++){
//cout<<Smin.query(l,j)<<"\n";
if(a[j]<=Smin.query(l,j)-d || a[j]>=Smax.query(l,j)+d){
R++;
}else{
break;
}
}
ans+=R-l+1;
//cout<<l<<" "<<R<<" "<<ans<<"\n";
}
//cout<<ans<<"\n";
for(int i=0,j=n-1;i<j;i++,j--){
swap(a[i],a[j]);
}
for(int i=0;i<n;i++){
Smin.update(i,a[i]);
Smax.update(i,a[i]);
}
R=0;
int ans2=0;
for(int l=0;l<n;l++){
if(R<l)R=l;
for(int j=R+1;j<n;j++){
//cout<<Smin.query(l,j)<<"\n";
if(a[j]<=Smin.query(l,j)-d || a[j]>=Smax.query(l,j)+d){
R++;
}else{
break;
}
}
ans2+=R-l+1;
//cout<<l<<" "<<R<<" "<<ans<<"\n";
}
cout<<max(ans,ans2)<<"\n";
}
提出情報
| 提出日時 |
|
| 問題 |
E - Sparse Range |
| ユーザ |
Sabakanmelm |
| 言語 |
C++23 (GCC 15.2.0) |
| 得点 |
0 |
| コード長 |
3387 Byte |
| 結果 |
WA |
| 実行時間 |
475 ms |
| メモリ |
22980 KiB |
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
0 / 450 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
sample_01.txt, sample_02.txt, sample_03.txt |
| All |
min1.txt, min2.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, sample_01.txt, sample_02.txt, sample_03.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| min1.txt |
AC |
1 ms |
3560 KiB |
| min2.txt |
AC |
1 ms |
3416 KiB |
| random_01.txt |
WA |
475 ms |
22848 KiB |
| random_02.txt |
WA |
401 ms |
22344 KiB |
| random_03.txt |
WA |
475 ms |
22832 KiB |
| random_04.txt |
WA |
412 ms |
22468 KiB |
| random_05.txt |
WA |
474 ms |
22980 KiB |
| random_06.txt |
WA |
265 ms |
13248 KiB |
| random_07.txt |
WA |
474 ms |
22904 KiB |
| random_08.txt |
WA |
353 ms |
22088 KiB |
| random_09.txt |
WA |
474 ms |
22860 KiB |
| random_10.txt |
WA |
317 ms |
21752 KiB |
| random_11.txt |
WA |
384 ms |
22212 KiB |
| random_12.txt |
AC |
77 ms |
8188 KiB |
| random_13.txt |
AC |
385 ms |
22864 KiB |
| random_14.txt |
WA |
473 ms |
22864 KiB |
| random_15.txt |
WA |
472 ms |
22864 KiB |
| random_16.txt |
WA |
474 ms |
22908 KiB |
| sample_01.txt |
AC |
1 ms |
3460 KiB |
| sample_02.txt |
AC |
1 ms |
3416 KiB |
| sample_03.txt |
AC |
1 ms |
3420 KiB |