Submission #980166

#TimeUsernameProblemLanguageResultExecution timeMemory
980166vjudge1Closing Time (IOI23_closing)C++17
29 / 100
307 ms20280 KiB
#include "closing.h"
using namespace std;
#include <bits/stdc++.h>
#define pb push_back

using lli=long long;
#define deb(x) cout<<#x<<": "<<x<<endl;
int  max_score(int N, int X, int Y, long long K,
              vector<int> U, vector<int> V, vector<int> W)
{
   if(N>500){
    vector<vector<pair<lli,lli>>> adj (N);
    for(lli i=0; i<N-1; ++i){
        adj[U[i]].pb({W[i], V[i]});
        adj[V[i]].pb({W[i], U[i]});
    }
    priority_queue<pair<lli,lli>, vector<pair<lli,lli>>, greater<pair<lli,lli>>> pq;
    pq.push({0, X});
    pq.push({0,Y});
    vector<bool> visited (N, false);
    int ans=0;
    while(!pq.empty()){
        lli a=pq.top().first;
        lli b=pq.top().second;
        pq.pop();
        if(visited[b]) continue;
        if(K<a) break;
        visited[b]=true;
        ans++;
        K-=a;
        for(lli i=0; i<adj[b].size(); ++i){
            if(!visited[adj[b][i].second]){
            pq.push({adj[b][i].first+a, adj[b][i].second});
            }
        }
    }
    return ans;
   } 
   int ans=0;
    vector<vector<pair<lli,lli>>> adj (N);
    vector<vector<lli>> mat (N, vector<lli> (N, -1));
    for(lli i=0; i<N-1; ++i){
        adj[U[i]].pb({W[i], V[i]});
        adj[V[i]].pb({W[i], U[i]});
        mat[U[i]][V[i]]=W[i];
        mat[V[i]][U[i]]=W[i];
    }

    int ini=0;
    int ant=0;
    while(adj[ini].size()!=1){
        if(adj[ini][0].second!=ant){
            ant=ini;
            ini=adj[ini][0].second;
        }
        else{
            ant=ini;
            ini=adj[ini][1].second;
        }
    }
    int last=adj[ini][0].second;
    ant=ini;
    while(adj[last].size()!=1){
        if(adj[last][0].second!=ant){
            ant=last;
            last=adj[last][0].second;
        }
        else{
            ant=last;
            last=adj[last][1].second;
        }
    }
    
    vector<int> ord;
    ord.pb(ini);
    int rec=adj[ini][0].second;
    while(rec!=last){
        ord.pb(rec);
        if(adj[rec][0].second!=ord[ord.size()-2]){
            rec=adj[rec][0].second;
        }
        else{
            rec=adj[rec][1].second;
        }
    }
    ord.pb(rec);
    vector<int> pos (N);
    for(int i=0; i<N; ++i){
        pos[ord[i]]=i;
    }


    for(int i=pos[X]; i>=0; --i){
        vector<int> values(N,0);
        lli cant=K;
        for(lli a=pos[X]-1; a>=i; --a){
            values[a]=values[a+1]+mat[ord[a]][ord[a+1]];
            cant-=values[a];
        }
        lli help=cant;
        
        if(cant<0) break;
        for(lli j=pos[X]; j<N; ++j){
            cant=help;
         
            if(j!=pos[X]){
                values[j]=values[j-1]+mat[ord[j]][ord[j-1]];
                help-=values[j];
                cant-=values[j];
            
            }
            if(cant<0) break;
            priority_queue<pair<pair<lli,lli>, lli>, vector<pair<pair<lli,lli>, lli>>, greater<pair<pair<lli,lli>, lli>>> pq;
            pq.push({{0,0}, pos[Y]});
            int aux=j-i+1;
            vector<bool> visited(N, false);
            while(!pq.empty()){
                lli a=pq.top().first.first;
                lli b=pq.top().first.second;
                lli c=pq.top().second;
                pq.pop();
                if(visited[c]) continue;
                visited[c]=true;
         
                if(cant<a) break;
                aux++;
                cant-=a;
                if(c+1<N && !visited[c+1]){
                    pq.push({{max(b+mat[ord[c]][ord[c+1]]-values[c+1],0ll), b+mat[ord[c]][ord[c+1]]}, c+1});
                }
                if(c-1>=0 && !visited[c-1]){
                     pq.push({{max(b+mat[ord[c]][ord[c-1]]-values[c-1],0ll), b+mat[ord[c]][ord[c-1]]}, c-1});
                }

            }
        
            ans=max(ans,aux );
      
        }

    }



   return ans;

}

Compilation message (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:31:23: warning: comparison of integer expressions of different signedness: 'lli' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   31 |         for(lli i=0; i<adj[b].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...