QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#845039 | #9916. Defeat the Enemies | Zawos | RE | 0ms | 0kb | C++23 | 3.0kb | 2025-01-06 14:08:36 | 2025-01-06 14:08:37 |
answer
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define FOR(i,a,b) for (int i = (a); i < (b); i++)
using namespace std;
using namespace __gnu_pbds;
using ll=long long;
using ld=long double;
using vi=vector<int>;
template<class T> using oset =tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update> ;
//上
const ll MOD = 998244353;
ll dp[21000][105][2];
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
freopen("01.01.2025\\input.txt","r",stdin);
freopen("01.01.2025\\output.txt","w",stdout);
int t;
cin >> t;
while(t--){
int n,m;
cin >> n >> m;
vector<pair<int,int>> v(n);
FOR(i,0,n) cin >> v[i].second;
FOR(i,0,n) cin >> v[i].first;
sort(v.begin(),v.end());
int k;
cin >> k;
vector<ll> cost(k);
FOR(i,0,k) cin >> cost[i];
FOR(i,0,2*m+210) FOR(j,0,105) dp[i][j][0] = 1e18;
dp[0][0][0] = 0;
dp[0][0][1] = 1;
int mm = 0;
for(int i = 0,p1 = 0; i <=2*m +k;i++){
while(p1<n && v[p1].first <= i){
mm = max(mm,v[p1].first+v[p1].second);
p1++;
}
int mx = 0;
int mr = mm;
for(int j = 0,p2 = p1; j <k;j++){
while(p2 < n && v[p2].first <= i+j+1){
mx = max(mx, v[p2].second);
mr = max(mr, v[p2].second+v[p2].first);
p2++;
}
for(int r = 0; r < k; r++){
if(dp[i][r][0] == 1e18) continue;
int nxt = max(mx+i+j+1-mr,r+mm-mr);
if(mx == 0) nxt = r;
if(dp[i][r][0] +cost[j] < dp[i+j+1][nxt][0]){
dp[i+j+1][nxt][0] =dp[i][r][0] +cost[j];
dp[i+j+1][nxt][1] = dp[i][r][1];
}else if(dp[i][r][0] +cost[j] == dp[i+j+1][nxt][0]){
dp[i+j+1][nxt][1] += dp[i][r][1];
if(dp[i+j+1][nxt][1]>= MOD) dp[i+j+1][nxt][1] -= MOD;
}
}
}
}
// for(int i = 0; i <= 16;i++){
// cout <<i<<'\n';
// for(int j = 0; j <3; j++) cout <<dp[i][j][0]<<" "<<dp[i][j][1]<<'\n';
// }
ll mn = 1e18;
for(int i = mm; i<=mm+200;i++){
for(int j = 0; j <k; j++) if(i >= mm +j) mn = min(mn,dp[i][j][0]);
}
ll ans = 0;
for(int i = mm; i<=mm+200;i++){
for(int j = 0; j <k; j++){
if(i >= mm+j && dp[i][j][0] == mn) ans += dp[i][j][1];
if(ans >= MOD) ans -= MOD;
}
}
cout <<mn <<" "<<ans<<'\n';
}
}
詳細信息
Test #1:
score: 0
Dangerous Syscalls
input:
4 5 5 3 5 2 1 2 3 1 3 2 3 3 2 3 4 3 2 2 2 2 2 2 2 3 2 3 3 7 6 5 3 4 6 6 3 4 4 6 4 2 3 5 5 4 2 4 6 7 10 100 38 49 79 66 49 89 21 55 13 23 67 56 26 39 56 16 84 50 92 82 11 6 6 7 8 9 9 9 9 9 9 9