結果
問題 |
No.1526 Sum of Mex 2
|
ユーザー |
![]() |
提出日時 | 2021-05-31 20:21:46 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 301 ms / 3,000 ms |
コード長 | 1,332 bytes |
コンパイル時間 | 4,786 ms |
コンパイル使用メモリ | 269,000 KB |
最終ジャッジ日時 | 2025-01-21 20:51:27 |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 32 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:49:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 49 | scanf("%d",&A[i]); | ~~~~~^~~~~~~~~~~~
ソースコード
#include <stdio.h> #include <bits/stdc++.h> #include <atcoder/all> using namespace atcoder; using namespace std; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf 1000000001 vector<int> A; struct Data{ long long v = 0; long long sz = 0; }; Data op(Data a,Data b){ a.v += b.v; a.sz += b.sz; return a; } Data e(){ return Data(); } Data mapping(long long a,Data b){ if(a==-1)return b; b.v = a * b.sz; return b; } long long composition(long long a,long long b){ if(a==-1)return b; if(b==-1)return a; return a; } long long id(){ return -1; } int main(){ int N; cin>>N; A.resize(N); rep(i,N){ scanf("%d",&A[i]); } vector<int> Nxt(N+1,N); vector<int> nxt(N); for(int i=N-1;i>=0;i--){ nxt[i] = Nxt[A[i]]; Nxt[A[i]] = i; } vector<Data> mexs(N); set<int> S; map<int,int> mp; for(int i=1;i<=N+1;i++){ S.insert(i); } rep(i,N){ mp[A[i]]++; S.erase(A[i]); mexs[i].v = (*S.begin()); mexs[i].sz = 1; } lazy_segtree<Data,op,e,long long,mapping,composition,id> seg(mexs); long long ans = 0LL; rep(i,N){ ans += seg.prod(i,N).v; //cout<<seg.prod(i,N).v<<endl; int ok = nxt[i],ng = i; while(ok-ng>1){ int mid = (ok+ng)/2; if(seg.get(mid).v >= A[i])ok = mid; else ng= mid; } seg.apply(ok,nxt[i],A[i]); } cout<<ans<<endl; return 0; }