提出 #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;
}

提出情報

提出日時
問題 Ex - Beautiful Subsequences
ユーザ cromarmot
言語 C++ (GCC 9.2.1)
得点 600
コード長 2726 Byte
結果 AC
実行時間 256 ms
メモリ 17964 KiB

コンパイルエラー

./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
結果
AC × 3
AC × 50
セット名 テストケース
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