Submission #1233653

#TimeUsernameProblemLanguageResultExecution timeMemory
1233653Muhammad_AneeqClosing Time (IOI23_closing)C++17
83 / 100
1099 ms44400 KiB
#include "closing.h"
#include <set>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
#define pii pair<long long,int>
#define ll long long
int const N=2e5+10;
vector<pair<int,int>>nei[N]={};
long long dist[3][N]={};
long long dp[2*N]={};
int par[N]={};
bool wy[N]={};
vector<int>pth;
void bfs(int u,bool ind)
{
    dist[ind][u]=0;
    set<pair<long long,int>>s;
    s.insert({0,u});
    if (ind==0)
        par[u]=-1;
    while (s.size())
    {
        long long u=(*begin(s)).second,w=(*begin(s)).first;
        s.erase(*begin(s));
        if (dist[ind][u]!=w) continue;
        for (auto [i,w1]:nei[u])
        {
            if (dist[ind][i]>w+w1)
            {
                if (ind==0)
                    par[i]=u;
                dist[ind][i]=w+w1;
                s.insert({dist[ind][i],i});
            }
        }
    }
}
vector<int>s;
int n;
void dfs(int u)
{
    for (auto [i,w1]:nei[u])
    {
        if (wy[i]||i==par[u]) continue;
        s.push_back(i);
        dfs(i);
    }
}
void mk()
{
    s={};
    for (auto i:pth)
        dfs(i);
    for (int i=0;i<=2*n;i++)
        dp[i]=1e18+10;
    dp[0]=0;
    for (auto i:s)
    {
        for (int j=2*n;j>=1;j--)
        {
            dp[j]=min(dp[j],dp[j-1]+dist[0][i]);
            if (j>1)
                dp[j]=min(dp[j],dp[j-2]+dist[1][i]);
        }
    }
}
int fd(long long lef,int i,int j)
{
    // int cur=0;
    // for (int i=0;i<=2*n;i++)
    // {
    //     if (dp[i]<=lef)
    //         cur=i;
    // }
    int z=upper_bound(dp,dp+2*n+1,lef)-dp;
    return max(0,z-1);
    // return cur;
}
int max_score(int N, int X, int Y, long long k,vector<int> U, vector<int> V, vector<int> W)
{
    n=N;
    pth={};
    for (int i=0;i<N;i++)
    {
        wy[i]=0;
        nei[i]={};
    }
    for (int i=0;i<U.size();i++)
    {
        nei[U[i]].push_back({V[i],W[i]});
        nei[V[i]].push_back({U[i],W[i]});
    }
    for (int i=0;i<N;i++)
        dist[0][i]=dist[1][i]=1e18;
    bfs(X,0);
    bfs(Y,1);
    int ans=0;
    multiset<long long>s;
    for (int i=0;i<N;i++)
    {
        s.insert(dist[0][i]);
        s.insert(dist[1][i]);
        if (dist[0][i]>dist[1][i])
            swap(dist[0][i],dist[1][i]);
    }
    long long cur=0;
    while (s.size())
    {
        long long w=(*begin(s));
        if (cur+w>k)
            break;
        ans++;
        cur+=w;
        s.erase(begin(s));
    }
    if (dist[1][Y]>k+k)
        return ans;
    int f=Y;
    while (f!=-1)
    {
        pth.push_back(f);
        f=par[f];
    }
    for (auto i:pth)
        wy[i]=1;
    reverse(begin(pth),end(pth));
    mk();
    vector<long long>pre={0},pre1={0};
    int sz=pth.size();
    for (auto i:pth)
    {
        pre.push_back(pre.back()+dist[1][i]);
        pre1.push_back(pre1.back()+dist[0][i]);
    }
    s={};
    for (int i=0;i<sz;i++)
    {
        for (int j=i;j<sz;j++)
        {
            long long init=pre[j+1]-pre[i];
            init+=pre1[i];
            if (j+1<=sz)
                init+=(pre1[sz]-pre1[j+1]);
            if (init>k) continue;
            int g=fd(k-init,i,j);
            int tr=(j-i+1)+sz+g;
            ans=max(ans,tr);
        }
    }
    return ans;
}
#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...