結果
問題 | No.1526 Sum of Mex 2 |
ユーザー | nouka28 |
提出日時 | 2024-05-26 16:23:35 |
言語 | C++23 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 222 ms / 3,000 ms |
コード長 | 1,492 bytes |
コンパイル時間 | 6,549 ms |
コンパイル使用メモリ | 315,816 KB |
実行使用メモリ | 15,872 KB |
最終ジャッジ日時 | 2024-12-20 20:21:59 |
合計ジャッジ時間 | 12,791 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 60 ms
15,488 KB |
testcase_01 | AC | 58 ms
15,488 KB |
testcase_02 | AC | 60 ms
15,360 KB |
testcase_03 | AC | 61 ms
15,488 KB |
testcase_04 | AC | 60 ms
15,488 KB |
testcase_05 | AC | 61 ms
15,360 KB |
testcase_06 | AC | 61 ms
15,360 KB |
testcase_07 | AC | 60 ms
15,360 KB |
testcase_08 | AC | 61 ms
15,616 KB |
testcase_09 | AC | 62 ms
15,360 KB |
testcase_10 | AC | 61 ms
15,360 KB |
testcase_11 | AC | 59 ms
15,360 KB |
testcase_12 | AC | 62 ms
15,488 KB |
testcase_13 | AC | 78 ms
15,488 KB |
testcase_14 | AC | 81 ms
15,488 KB |
testcase_15 | AC | 92 ms
15,488 KB |
testcase_16 | AC | 203 ms
15,744 KB |
testcase_17 | AC | 154 ms
15,744 KB |
testcase_18 | AC | 72 ms
15,488 KB |
testcase_19 | AC | 70 ms
15,488 KB |
testcase_20 | AC | 118 ms
15,616 KB |
testcase_21 | AC | 206 ms
15,872 KB |
testcase_22 | AC | 139 ms
15,744 KB |
testcase_23 | AC | 206 ms
15,744 KB |
testcase_24 | AC | 211 ms
15,744 KB |
testcase_25 | AC | 201 ms
15,744 KB |
testcase_26 | AC | 209 ms
15,744 KB |
testcase_27 | AC | 218 ms
15,744 KB |
testcase_28 | AC | 222 ms
15,744 KB |
testcase_29 | AC | 200 ms
15,872 KB |
testcase_30 | AC | 220 ms
15,872 KB |
testcase_31 | AC | 214 ms
15,744 KB |
testcase_32 | AC | 209 ms
15,744 KB |
testcase_33 | AC | 126 ms
15,872 KB |
evil_largest | AC | 261 ms
16,640 KB |
ソースコード
#include<bits/stdc++.h> using namespace std; #include<atcoder/all> using namespace atcoder; int op(int a,int b){return min(a,b);} int e(){return 1e9;} int tar; bool f(int x){ return x>tar; } const int MAX_N=200009; int main(){ int n;cin>>n; vector<int> a(n);for(auto&e:a)cin>>e,e--; set<pair<int,int>> st; for(int i=0;i<MAX_N;i++)st.insert({i,-1}); long ans=0,sum=0; segtree<int,op,e> seg(vector<int>(MAX_N,-1)); vector<bool> update(MAX_N); for(int i=0;i<n;i++){ seg.set(a[i],i); update[a[i]]=1; int idx; if(a[i]==0){ idx=0; }else{ auto p=st.lower_bound({a[i],-1}); if(p->first!=a[i]){ ans+=sum; continue; } idx=(--p)->first; update[idx]=1; } while(update[idx]){ update[idx]=0; tar=seg.get(idx); int next_idx=seg.max_right(idx+1,f); //delete idx<=x<next_idx while(1){ auto p=st.lower_bound({idx,-1}); if(p->first>=next_idx)break; if(p!=st.begin()){ auto lp=p,rp=p;lp--;rp++; sum+=long(lp->second-p->second)*(rp->first-p->first); }else{ auto rp=p;rp++; sum-=long(p->second-rp->second)*rp->first; } st.erase(p); } //insert idx auto p=st.lower_bound({idx,-1}); if(p!=st.begin()){ auto lp=p;lp--; sum-=long(lp->second-seg.get(idx))*(p->first-idx); }else{ sum+=long(seg.get(idx)-p->second)*p->first; } st.insert({idx,seg.get(idx)}); if(!update[next_idx])continue; idx=next_idx; } ans+=sum; } ans+=long(n)*(n+1)/2; cout<<ans<<endl; }