結果
| 問題 |
No.2898 Update Max
|
| コンテスト | |
| ユーザー |
momoyuu
|
| 提出日時 | 2024-09-23 03:00:38 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 108 ms / 2,000 ms |
| コード長 | 2,381 bytes |
| コンパイル時間 | 1,377 ms |
| コンパイル使用メモリ | 114,300 KB |
| 実行使用メモリ | 7,216 KB |
| 最終ジャッジ日時 | 2024-09-23 03:00:43 |
| 合計ジャッジ時間 | 4,735 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
using ll = long long;
#include<queue>
#include<atcoder/modint>
using mint = atcoder::modint998244353;
int main(){
cin.tie(nullptr);
ios::sync_with_stdio(false);
int n;
cin>>n;
vector<int> a(n);
int cnt = 0;
for(int i = 0;i<n;i++){
cin>>a[i];
if(a[i]!=-1) a[i]--;
if(a[i]==-1) cnt++;
}
vector<mint> fac(n+1,1),ifac(n+1,1);
for(int i = 1;i<=n;i++) fac[i] = fac[i-1] * i;
for(int i = 1;i<=n;i++) ifac[i] = fac[i].inv();
mint ans = 0;
auto comb = [&](int n,int r) -> mint {
if(n<r) return 0;
return fac[n] * ifac[r] * ifac[n-r];
};
{
deque<int> b;
vector<int> use(n,0);
for(int i = 0;i<n;i++) if(a[i]!=-1) use[a[i]] = 1;
for(int i = 0;i<n;i++) if(use[i]==0) b.push_back(i);
int mx = 0;
int res = cnt;
for(int i = 0;i<n;i++){
if(a[i]!=-1){
mx = max(mx,a[i]);
continue;
}
while(b.size()){
int ni = b.front();
if(ni<mx){
b.pop_front();
continue;
}
break;
}
if(b.size()==0) {
res--;
continue;
}
int left = cnt - b.size();
int right = cnt - 1;
int x = cnt - res ;
mint tmp = comb(cnt-1,x).inv();
tmp *= comb(right+1,x+1) - comb(left,x+1);
tmp /= cnt;
ans += tmp;
res--;
}
}
//cout<<(ans*fac[cnt]).val()<<endl;
{
vector<int> use(n,0);
for(int i = 0;i<n;i++) if(a[i]!=-1) use[a[i]] = 1;
vector<int> sum(n+1,0);
for(int i = 0;i<n;i++) if(use[i]==0) sum[i+1]++;
for(int i = 0;i<n;i++) sum[i+1] += sum[i];
int left = 0;
int mx = -1;
for(int i = 0;i<n;i++){
if(a[i]==-1){
left++;
continue;
}
mx = max(mx,a[i]);
if(mx!=a[i]) continue;
mint tmp = comb(cnt,left).inv();
int all = sum[a[i]];
tmp *= comb(all,left);
ans += tmp;
}
}
ans *= fac[cnt];
cout<<ans.val()<<endl;
}
momoyuu