提出 #35152743
ソースコード 拡げる
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,n) for (ll i=a;i<(ll)n;i++)
#define SEG_ROOT 1,0,n-1
#define SEG_L (o<<1)
#define SEG_R (o<<1|1)
#define mid (l+r)/2
#define SEG_L_CHILD SEG_L,l,mid
#define SEG_R_CHILD SEG_R,mid+1,r
ll read(){ll r;scanf("%lld",&r);return r;}
const int N = 140000;
const int K = 4;
int a[N+10];
struct node{ // 维护 max[l..r] - min[l..r] + l - r
int min; // 最小值
int lazy; // lazy tag未向下传递的add
array<int,K> cnt = {0,0,0,0}; // 最小值+0,+1,+2,+3出现的次数
}t[N*4+10];
// merge {min,count array}
pair<int,array<int,K>> merge(const pair<int,array<int,K> >&mc0,const pair<int,array<int,K>>&mc1){
auto [m0,c0] = mc0;
auto [m1,c1] = mc1;
int m = min(m0,m1);
array<int,K> c = {0,0,0,0};
rep(i,0,K) if(m0+i<m+K) c[m0+i-m] += c0[i];
rep(i,0,K) if(m1+i<m+K) c[m1+i-m] += c1[i];
return {m,c};
}
void range_add(int o,int v){
t[o].min+=v;
t[o].lazy+=v;
}
void down(int o){
if (!t[o].lazy) return;
range_add(SEG_L,t[o].lazy);
range_add(SEG_R,t[o].lazy);
t[o].lazy=0;
}
void build(int o,int l,int r){
if (l==r) {
t[o].min = l;
t[o].cnt[0] = 1;
return;
}
build(SEG_L_CHILD);
build(SEG_R_CHILD);
tie(t[o].min,t[o].cnt) = merge({t[SEG_L].min,t[SEG_L].cnt},{t[SEG_R].min,t[SEG_R].cnt});
}
void add(int o, int l,int r,int ql,int qr,int v){
if (ql <= l && r <= qr) return range_add(o,v);
down(o);
if (ql<=mid) add(SEG_L_CHILD,ql,qr,v);
if (qr> mid) add(SEG_R_CHILD,ql,qr,v);
tie(t[o].min,t[o].cnt) = merge({t[SEG_L].min,t[SEG_L].cnt},{t[SEG_R].min,t[SEG_R].cnt});
}
pair<int,array<int,K>> query(int o,int l,int r,int ql,int qr){ // {min, count array}
if (ql <= l && r <= qr) return {t[o].min,t[o].cnt};
down(o);
auto ret = pair(0,array<int,K>{0,0,0,0}); // {min, count array}
if (ql<=mid) ret = merge(ret,query(SEG_L_CHILD,ql,qr));
if (qr> mid) ret = merge(ret,query(SEG_R_CHILD,ql,qr));
return ret;
}
int main(){
int n = read();
int k = read();
rep(i,0,n) a[i] = read();
build(SEG_ROOT);
ll ans = 0;
vector<int> mx; // 区间最大值 下标, 单调递减栈 维护
vector<int> mn; // 区间最小值 下标, 单调递增栈 维护
rep(i,0,n){
for(;mx.size()&&a[mx.back()]<a[i];mx.pop_back())add(SEG_ROOT,mx.size()>1?mx[mx.size()-2]+1:0,mx.back(),a[i]-a[mx.back()]); // [a[mx.size()-2]+1...a[mx.back()]] 全部增量
mx.push_back(i);
for(;mn.size()&&a[mn.back()]>a[i];mn.pop_back())add(SEG_ROOT,mn.size()-1?mn[mn.size()-2]+1:0,mn.back(),a[mn.back()]-a[i]);
mn.push_back(i);
auto [_,c] = query(SEG_ROOT,0,i);
rep(j,0,k+1) ans += c[j];
add(SEG_ROOT,0,n-1,-1); // r增加, 全部-1
}
printf("%lld\n",ans);
return 0;
}
提出情報
コンパイルエラー
./Main.cpp: In function ‘ll read()’:
./Main.cpp:14:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
14 | ll read(){ll r;scanf("%lld",&r);return r;}
| ~~~~~^~~~~~~~~~~
ジャッジ結果
セット名 |
Sample |
All |
得点 / 配点 |
0 / 0 |
600 / 600 |
結果 |
|
|
セット名 |
テストケース |
Sample |
00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt |
All |
00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 02_max_01.txt, 02_max_02.txt, 02_max_03.txt, 02_max_04.txt, 02_max_05.txt, 03_random_01.txt, 03_random_02.txt, 03_random_03.txt, 03_random_04.txt, 03_random_05.txt, 04_handmade_01.txt, 04_handmade_02.txt, 04_handmade_03.txt, 04_handmade_04.txt, 04_handmade_05.txt, 04_handmade_06.txt, 04_handmade_07.txt, 04_handmade_08.txt, 04_handmade_09.txt, 04_handmade_10.txt, 04_handmade_11.txt, 04_handmade_12.txt, 04_handmade_13.txt, 04_handmade_14.txt, 04_handmade_15.txt, 04_handmade_16.txt, 04_handmade_17.txt, 04_handmade_18.txt, 04_handmade_19.txt, 04_handmade_20.txt, 04_handmade_21.txt, 04_handmade_22.txt, 04_handmade_23.txt, 04_handmade_24.txt, 04_handmade_25.txt, 04_handmade_26.txt, 04_handmade_27.txt |
ケース名 |
結果 |
実行時間 |
メモリ |
00_sample_01.txt |
AC |
14 ms |
16764 KiB |
00_sample_02.txt |
AC |
13 ms |
16764 KiB |
00_sample_03.txt |
AC |
13 ms |
16712 KiB |
01_random_01.txt |
AC |
13 ms |
16812 KiB |
01_random_02.txt |
AC |
12 ms |
16776 KiB |
01_random_03.txt |
AC |
13 ms |
16696 KiB |
01_random_04.txt |
AC |
12 ms |
16828 KiB |
01_random_05.txt |
AC |
11 ms |
16820 KiB |
01_random_06.txt |
AC |
16 ms |
16772 KiB |
01_random_07.txt |
AC |
13 ms |
16836 KiB |
01_random_08.txt |
AC |
13 ms |
16820 KiB |
01_random_09.txt |
AC |
16 ms |
16712 KiB |
01_random_10.txt |
AC |
15 ms |
16744 KiB |
02_max_01.txt |
AC |
224 ms |
17320 KiB |
02_max_02.txt |
AC |
228 ms |
17268 KiB |
02_max_03.txt |
AC |
223 ms |
17312 KiB |
02_max_04.txt |
AC |
226 ms |
17424 KiB |
02_max_05.txt |
AC |
226 ms |
17300 KiB |
03_random_01.txt |
AC |
118 ms |
17116 KiB |
03_random_02.txt |
AC |
215 ms |
17344 KiB |
03_random_03.txt |
AC |
136 ms |
17044 KiB |
03_random_04.txt |
AC |
223 ms |
17276 KiB |
03_random_05.txt |
AC |
129 ms |
17120 KiB |
04_handmade_01.txt |
AC |
164 ms |
17956 KiB |
04_handmade_02.txt |
AC |
166 ms |
17712 KiB |
04_handmade_03.txt |
AC |
165 ms |
17964 KiB |
04_handmade_04.txt |
AC |
255 ms |
17416 KiB |
04_handmade_05.txt |
AC |
256 ms |
17516 KiB |
04_handmade_06.txt |
AC |
234 ms |
17412 KiB |
04_handmade_07.txt |
AC |
234 ms |
17440 KiB |
04_handmade_08.txt |
AC |
237 ms |
17380 KiB |
04_handmade_09.txt |
AC |
235 ms |
17448 KiB |
04_handmade_10.txt |
AC |
242 ms |
17476 KiB |
04_handmade_11.txt |
AC |
226 ms |
17320 KiB |
04_handmade_12.txt |
AC |
225 ms |
17328 KiB |
04_handmade_13.txt |
AC |
229 ms |
17376 KiB |
04_handmade_14.txt |
AC |
224 ms |
17404 KiB |
04_handmade_15.txt |
AC |
230 ms |
17264 KiB |
04_handmade_16.txt |
AC |
224 ms |
17372 KiB |
04_handmade_17.txt |
AC |
222 ms |
17236 KiB |
04_handmade_18.txt |
AC |
225 ms |
17428 KiB |
04_handmade_19.txt |
AC |
230 ms |
17244 KiB |
04_handmade_20.txt |
AC |
227 ms |
17320 KiB |
04_handmade_21.txt |
AC |
223 ms |
17376 KiB |
04_handmade_22.txt |
AC |
229 ms |
17364 KiB |
04_handmade_23.txt |
AC |
225 ms |
17316 KiB |
04_handmade_24.txt |
AC |
13 ms |
16840 KiB |
04_handmade_25.txt |
AC |
11 ms |
16696 KiB |
04_handmade_26.txt |
AC |
15 ms |
16872 KiB |
04_handmade_27.txt |
AC |
14 ms |
16764 KiB |