Submission #925470

#TimeUsernameProblemLanguageResultExecution timeMemory
925470bachhoangxuan한자 끝말잇기 (JOI14_kanji)C++17
100 / 100
109 ms17992 KiB
#include "Annalib.h"
#include<bits/stdc++.h>
using namespace std;

#define ll long long
const int maxn = 305;
const int maxm = maxn*maxn;
const ll inf = 4e18;
ll dist[maxn][maxn];
bool check[maxm];

void Anna(int N, int M, int A[], int B[], ll C[], int Q, int S[], int T[], int K, int U[]) {
    for(int i=0;i<N;i++) for(int j=0;j<N;j++) dist[i][j]=inf;
    for(int i=0;i<K;i++) check[U[i]]=true;
    for(int i=0;i<M;i++){
        if(!check[i]) dist[A[i]][B[i]]=C[i];
    }
    for(int i=0;i<N;i++) dist[i][i]=0;
    for(int k=0;k<N;k++){
        for(int i=0;i<N;i++) for(int j=0;j<N;j++) dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
    }
    vector<vector<int>> g(K+1);
    for(int i=0;i<Q;i++) g[0].push_back(i);
    auto f = [&](int s,int t,int id){
        if(id==K) return dist[s][t];
        else return min(inf,dist[s][A[U[id]]]+dist[B[U[id]]][t]);
    };
    vector<pair<int,int>> p;
    for(int i=1;i<=K;i++){
        ll c=(i==K?0:C[U[i]]);
        for(int j=0;j<i;j++){
            sort(g[j].begin(),g[j].end(),[f,S,T,i,j](int x,int y){
                ll dx=f(S[x],T[x],i)-f(S[x],T[x],j);
                ll dy=f(S[y],T[y],i)-f(S[y],T[y],j);
                return dx<dy;
            });
            ll dd=C[U[j]]-c;
            int pos=0;
            while(pos<(int)g[j].size()){
                int x=g[j][pos];
                ll dx=f(S[x],T[x],i)-f(S[x],T[x],j);
                if(dx<=dd) pos++;
                else break;
            }
            p.push_back({pos,(int)g[j].size()+1});
            for(int k=0;k<pos;k++) g[i].push_back(g[j][k]);
            g[j].erase(g[j].begin(),g[j].begin()+pos);
        }
    }
    __int128 total=0;
    for(int i=(int)p.size()-1;i>=0;i--) total=total*p[i].second+p[i].first;
    while(total) Tap(total&1),total/=2;
}
#include "Brunolib.h"
#include<bits/stdc++.h>
using namespace std;

#define ll long long
const int maxn = 305;
const int maxm = maxn*maxn;
const ll inf = 4e18;
ll dist[maxn][maxn];
bool check[maxm];

int w[maxn][maxn];
void Bruno(int N, int M, int A[], int B[], long long C[], int Q, int S[], int T[], int K, int U[], int L, int X[]) {
    __int128 total=0;
    for(int i=L-1;i>=0;i--) total=total*2+X[i];

    for(int i=0;i<N;i++) for(int j=0;j<N;j++) w[i][j]=-1,dist[i][j]=inf;
    for(int i=0;i<K;i++) check[U[i]]=true;
    for(int i=0;i<M;i++){
        if(!check[i]){
            dist[A[i]][B[i]]=C[i];
            w[A[i]][B[i]]=i;
        }
    }
    for(int i=0;i<N;i++) dist[i][i]=0;
    for(int k=0;k<N;k++){
        for(int i=0;i<N;i++) for(int j=0;j<N;j++) dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
    }
    int cur=0;
    vector<vector<int>> g(K+1);
    for(int i=0;i<Q;i++) g[0].push_back(i);
    auto f = [&](int s,int t,int id){
        if(id==K) return dist[s][t];
        else return min(inf,dist[s][A[U[id]]]+dist[B[U[id]]][t]);
    };
    for(int i=1;i<=K;i++){
        for(int j=0;j<i;j++){
            sort(g[j].begin(),g[j].end(),[f,S,T,i,j](int x,int y){
                ll dx=f(S[x],T[x],i)-f(S[x],T[x],j);
                ll dy=f(S[y],T[y],i)-f(S[y],T[y],j);
                return dx<dy;
            });
            int pos=total%((int)g[j].size()+1);
            total/=((int)g[j].size()+1);
            for(int k=0;k<pos;k++) g[i].push_back(g[j][k]);
            g[j].erase(g[j].begin(),g[j].begin()+pos);
        }
    }
    vector<int> num(Q,-1);
    for(int i=0;i<=K;i++) for(int x:g[i]) num[x]=i;
    function<void(int,int)> path = [&](int s,int t){
        if(s==t) return;
        for(int u=0;u<N;u++){
            if(w[s][u]==-1) continue;
            if(C[w[s][u]]+dist[u][t]==dist[s][t]){
                Answer(w[s][u]);
                return path(u,t);
            }
        }
    };
    for(int i=0;i<Q;i++){
        int id=num[i];
        //cout << i << ' ' << id << '\n';
        if(id<K){
            path(S[i],A[U[id]]);
            Answer(U[id]);
            path(B[U[id]],T[i]);
        }
        else path(S[i],T[i]);
        Answer(-1);
    }
}

Compilation message (stderr)

Bruno.cpp: In function 'void Bruno(int, int, int*, int*, long long int*, int, int*, int*, int, int*, int, int*)':
Bruno.cpp:29:9: warning: unused variable 'cur' [-Wunused-variable]
   29 |     int cur=0;
      |         ^~~
#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...