結果
| 問題 |
No.3371 Add Insert Operations
|
| コンテスト | |
| ユーザー |
simasima_71
|
| 提出日時 | 2025-11-17 21:48:54 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 82 ms / 2,000 ms |
| コード長 | 1,632 bytes |
| コンパイル時間 | 5,848 ms |
| コンパイル使用メモリ | 337,884 KB |
| 実行使用メモリ | 20,992 KB |
| 最終ジャッジ日時 | 2025-11-17 21:49:03 |
| 合計ジャッジ時間 | 9,621 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 36 |
ソースコード
//https://www.youtube.com/watch?v=Po8C2i6_ua4
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
#define rep(i, l, r) for (ll i = (l); i < (r); ++i)
#define all(x) (x).begin(), (x).end()
using ll = long long;
using pl = pair<ll,ll>;
using vl = vector<ll>;
using vvl = vector<vector<ll>>;
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
using mint=modint998244353;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll n;
cin>>n;
vl z(n);
rep(i,0,n)cin>>z[i];
ll r=0;
rep(i,0,n){
r+=z[i];
}
if(r>2*n){
cout<<0<<endl;
return 0;
}
vector<mint> bik(310000);
vector<mint> gbik(310000);
bik[0]=1;
rep(i,0,300000){
bik[i+1]=bik[i]*(i+1);
gbik[i]=1/bik[i];
}
mint ans=1;
stack<ll> s;
rep(i,0,2*n+5)s.push(0);
stack<ll> u;
rep(i,0,2*n+5)u.push(0);
stack<ll> d;
rep(i,0,2*n+5)d.push(0);
rep(i,0,n){
z[i]+=2;
ll p=0;
while(s.top()==1){
ans*=bik[i+1-u.top()-2]*gbik[i+1-d.top()-1]*gbik[d.top()-u.top()-1];
p++;
s.pop();
u.pop();
d.pop();
}
d.pop();
d.push(i+1);
s.pop();
s.push(1);
if(p+2>z[i]){
cout<<0<<endl;
return 0;
}
rep(j,0,z[i]-p-2){
s.push(0);
u.push(i+1);
d.push(0);
}
}
while(s.top()==1){
ans*=bik[n+1-u.top()-2]*gbik[n+1-d.top()-1]*gbik[d.top()-u.top()-1];
s.pop();
u.pop();
d.pop();
}
while(!s.empty()){
if(s.top()==1){
cout<<0<<endl;
return 0;
}
s.pop();
}
cout<<ans.val()<<endl;
}
simasima_71