QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#845039#9916. Defeat the EnemiesZawosRE 0ms0kbC++233.0kb2025-01-06 14:08:362025-01-06 14:08:37

Judging History

你现在查看的是最新测评结果

  • [2025-01-06 14:08:37]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2025-01-06 14:08:36]
  • 提交

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';
    }
}

Details

Tip: Click on the bar to expand more detailed information

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

output:


result: