[CF1542D] Priority Queue 题解
aeiouaoeiu · · 题解
直接考虑整个集合有点困难,考虑从单个元素入手,计数这个元素在多少种情况中在最终集合里面。
我们将这个元素到最小元素的距离称之为这个元素的安全度,则删除最小值后,集合内所有元素的安全度减一;加入
有了安全度就可以直接对一个元素
首先有不进行本次操作的情况,即
对每个
::::info[code]
#include<bits/stdc++.h>
#define pb emplace_back
#define pob pop_back
#define mp make_pair
using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
const ll maxn=507,ee=1e18,p=998244353;
ll n,X[maxn],f[maxn][maxn],ans;
char O[maxn];
void ups(ll &a,ll b){a=(a+b>=p)?(a+b-p):(a+b);}
void solve(ll x){
memset(f,0,sizeof(f));
f[0][0]=1;
for(ll i=1;i<=n;i++){
for(ll j=0;j<=n;j++)if(f[i-1][j]){
if(i!=x) ups(f[i][j],f[i-1][j]);
if(O[i]=='-'){
if(!j&&i>x) continue;
ups(f[i][max(0ll,j-1)],f[i-1][j]);
}else{
if((X[i]<X[x])||(X[i]==X[x]&&i<x)) ups(f[i][j+1],f[i-1][j]);
else ups(f[i][j],f[i-1][j]);
}
}
}
for(ll i=0;i<=n;i++) ups(ans,f[n][i]*X[x]%p);
}
int main(void){
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for(ll i=1;i<=n;i++){
cin>>O[i];
if(O[i]=='+') cin>>X[i];
}
for(ll i=1;i<=n;i++)if(O[i]=='+') solve(i);
cout<<ans<<"\n";
return 0;
}
::::