제출 #955538

#제출 시각아이디문제언어결과실행 시간메모리
955538ZeroCool봉쇄 시간 (IOI23_closing)C++17
75 / 100
1049 ms53664 KiB
#include "closing.h"
#include <bits/stdc++.h>
using ll = long long;

#define pb push_back
#define all(v) v.begin(), v.end()

const ll N = 3e5 + 10;
const ll INF = 1e18;

using namespace std;



ll n, s1, s2, k;

vector<pair<ll,ll> > g[N];

ll dist[N][2];

void dfs1(ll x,ll p,ll t){
    for(auto [u, w] : g[x]){
        if(u == p)continue;
        dist[u][t] = dist[x][t] + w;
        dfs1(u, x, t);
    }
}

ll C[2][N];

bool path[N];

vector<ll> curr;
void dfs2(ll x,ll p){
    curr.pb(x);
    if(x == s2){
        for(auto v : curr){
            path[v] = true;
        }
        return;
    }

    for(auto [u, w] : g[x]){
        if(u == p)continue;
        dfs2(u, x);
    }
    curr.pop_back();
}

int max_score(int _n, int _x, int _y, long long _k,vector<int> u, vector<int> v, vector<int> w){
    n = _n;
    s1 = _x;
    s2 = _y;
    k = _k;
    memset(path, 0, sizeof path);
    memset(dist, 0, sizeof dist);
    memset(C, 0, sizeof C);
    for(int i = 0;i<n;i++)g[i].clear();
    for(ll i = 0;i<u.size();i++){
        g[u[i]].pb({v[i], w[i]});
        g[v[i]].pb({u[i], w[i]});
    }
    curr.clear();
    dfs1(s1, -1, 0);
    //assert(0);
    dfs1(s2, -1, 1);

    for(ll i = 0;i<n;i++){
        C[0][i] = min(dist[i][0], dist[i][1]);
        C[1][i] = max(dist[i][0], dist[i][1]);
       // cout<<i<<": "<<C[0][i]<<" "<<C[1][i]<<endl;
    }

    vector<ll> vc;
    for(ll i = 0;i<n;i++)vc.pb(C[0][i]);

    sort(all(vc));
    ll sum = 0;
    ll cnt = 0;
    for(auto u : vc){
        sum += u;
        if(sum > k)break;
        cnt++;
    }
    ll ans = cnt;
    //return cnt;
    //vector<ll> dp[2];
    vector<ll> dp;
    
    dp.resize(2 * n + 5, INF);
    dfs2(s1, -1);
    dp[0] = 0;
    
    for(ll i = 0;i<n;i++){
    //    assert(0);
       // cout<<path[i]<<" ";
        vector<ll> ndp(2 * n + 5, INF);
      //  ndp.resize(2 * n + 5, INF);

        for(ll j = 0;j<=2 * n;j++){
            if(!path[i])ndp[j] = min(ndp[j], dp[j]);

            ndp[j+1] = min(ndp[j+1], dp[j] + C[0][i]);
            ndp[j+2] = min(ndp[j+2], dp[j] + C[1][i]);

        }
        swap(dp, ndp);
       
    }
    //cout<<endl;
  //  assert(0);
    for(ll i = ans+1;i<dp.size();i++){
       // cout<<dp[i]<<endl;
        if(dp[i] <= k)ans = i;
    }
    return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

closing.cpp: In function 'int max_score(int, int, int, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:59:19: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |     for(ll i = 0;i<u.size();i++){
      |                  ~^~~~~~~~~
closing.cpp:112:23: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |     for(ll i = ans+1;i<dp.size();i++){
      |                      ~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...