제출 #1305012

#제출 시각아이디문제언어결과실행 시간메모리
1305012Zbyszek99Spy 3 (JOI24_spy3)C++20
100 / 100
187 ms5908 KiB
#include "Aoi.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ll long long
#define ld long double
#define ull unsigned long long
#define ff first
#define ss second
#define pii pair<int,int>
#define pll pair<long long, long long>
#define vi vector<int>
#define vl vector<long long>
#define pb push_back
#define rep(i, b) for(int i = 0; i < (b); ++i)
#define rep2(i,a,b) for(int i = a; i <= (b); ++i)
#define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c)
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define siz(x) (int)(x).size()
#define forall(it,x) for(auto& it:(x))
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set;
//mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());}
//ll los(ll a, ll b) {return a + (mt() % (b-a+1));}
const ll INF = 1e16+50;
const ll INF_L = 1e18+40;
const ll MOD = 1e9+7;

namespace {
vector<pii> graph[10001];
ll costs[20001];
pii up_vert[10001];
int color[20001];
bool odw[10001];
bool is_special[20001];
int path_beg[17];
int path_end[17];
int color_cnt[17];
int special_ind[20001];
ll dist[10001];
int n,m,q,k;
int dead_group = 16;

string ans;

void add_int(int x, int s)
{
    rep(i,s)
    {
        if(x & (1 << i)) ans += '1';
        else ans += '0';
    }
}

void dijkstra()
{
    priority_queue<pair<ll,pair<int,pii>>,vector<pair<ll,pair<int,pii>>>,greater<pair<ll,pair<int,pii>>>> pq;
    pq.push({0,{0,{-1,-1}}});
    while(!pq.empty())
    {
        pair<ll,pair<int,pii>> t = pq.top();
        pq.pop();
        if(odw[t.ss.ff]) continue;
        odw[t.ss.ff] = 1;
        dist[t.ss.ff] = t.ff;
        up_vert[t.ss.ff] = t.ss.ss;
        forall(it,graph[t.ss.ff])
        {
            pq.push({t.ff+costs[it.ss],{it.ff,{t.ss.ff,it.ss}}});
        }
    }
}

void swap_groups(int a, int b)
{
    if(a == dead_group) dead_group = b;
    else if(b == dead_group) dead_group = a;
    swap(path_beg[a],path_beg[b]);
    rep(i,m)
    {
        if(color[i] == a) color[i] = b;
        else if(color[i] == b) color[i] = a;
    }
    swap(color_cnt[a],color_cnt[b]);
}

}

// swap(T,X)
string aoi(int N, int M, int Q, int K, vi A, vi B, vl C, vi X, vi T) 
{
    n = N; m = M; q = Q; k = K;
    sort(all(T));
    rep(i,m)
    {
        costs[i] = C[i];
        color[i] = 16;
        graph[A[i]].pb({B[i],i});
        graph[B[i]].pb({A[i],i});
    }
    rep(i,17) path_beg[i] = -1;
    rep(i,17) path_end[i] = -1;
    int cur = 0;
    rep(i,k) 
    {
        is_special[T[i]] = 1;
        special_ind[T[i]] = cur++;
    }
    dijkstra();
    rep(i,q)
    {
        int v = X[i];
        while(v != 0)
        {
            if(is_special[up_vert[v].ss])
            {
                if(path_end[i] == -1) path_end[i] = up_vert[v].ss;
                if(color[up_vert[v].ss] == 16) color[up_vert[v].ss] = i;
                else
                {
                    path_beg[i] = up_vert[v].ss;
                    break;
                }
            } 
            v = up_vert[v].ff;
        }
    }
    rep(i,k) color_cnt[color[T[i]]]++;
    pii best = {1e9,-1};
    rep(i,17) best = min(best,{color_cnt[i],i});
    if(best.ss != 16) swap_groups(best.ss,16);
    best = {1e9,-1};
    rep(i,16) best = min(best,{color_cnt[i],i});
    if(best.ss != 0) swap_groups(best.ss,0);
    rep(i,k) add_int(color[T[i]],4);
    add_int(dead_group,5);
    rep(i,k) if(color[T[i]] % 16 == 0)
    {
        add_int(color[T[i]] == 16,1);
    }
    rep(i,17) add_int((path_beg[i] != -1 ? special_ind[path_beg[i]] : 301),9);
    rep(i,q) add_int((path_end[i] != -1 ? special_ind[path_end[i]] : 301),9);
    return ans;
}
#include "Bitaro.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ll long long
#define ld long double
#define ull unsigned long long
#define ff first
#define ss second
#define pii pair<int,int>
#define pll pair<long long, long long>
#define vi vector<int>
#define vl vector<long long>
#define pb push_back
#define rep(i, b) for(int i = 0; i < (b); ++i)
#define rep2(i,a,b) for(int i = a; i <= (b); ++i)
#define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c)
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define siz(x) (int)(x).size()
#define forall(it,x) for(auto& it:(x))
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set;
//mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());}
//ll los(ll a, ll b) {return a + (mt() % (b-a+1));}
const ll INF = 1e16+50;
const ll INF_L = 1e18+40;
const ll MOD = 1e9+7;

namespace {
vector<pii> graph[10001];
ll costs[20001];
int color[20001];
int path_beg[17];
pair<int,vi> root_path[10001];
int rel_end[20001];
bool was[17];
int n,m,q,k;
int dead_group = 16;
pii up_vert[10001];
ll dist[10001];
vi A,B;

string ans;
int cur_poz = 0;

int get_int(int s)
{
    int x = 0;
    rep(i,s) if(ans[cur_poz++] == '1') x += (1<<i);
    return x;
}

void dijkstra(int x)
{
    priority_queue<pair<ll,pair<int,pii>>,vector<pair<ll,pair<int,pii>>>,greater<pair<ll,pair<int,pii>>>> pq;
    pq.push({0,{x,{-1,0}}});
    rep(i,n) dist[i] = -1;
    while(!pq.empty())
    {
        pair<ll,pair<int,pii>> t = pq.top();
        pq.pop();
        if(dist[t.ss.ff] != -1) continue;
        dist[t.ss.ff] = t.ff;
        up_vert[t.ss.ff] = t.ss.ss;
        forall(it,graph[t.ss.ff])
        {
            pq.push({t.ff+costs[it.ss],{it.ff,{t.ss.ff,it.ss}}});
        }
    }
}

vi get_path(int v, int beg)
{
    vi path;
    while(v != beg && v != -1)
    {
        path.pb(up_vert[v].ss);
        v = up_vert[v].ff;
    }
    return path;
}

void add_path(int beg, vi x)
{
    forall(it,x) costs[it] = 0;
    dijkstra(beg);
    forall(it,x) costs[it] = INF;
    forall(it,x)
    {
        if(up_vert[A[it]].ff == B[it]) rel_end[it] = A[it];
        else rel_end[it] = B[it];
        int v = rel_end[it];
        root_path[v] = {beg,get_path(v,beg)};
    }
}


}

//swap(T,X)
void bitaro(int N, int M, int Q, int K, vi A2, vi B2, vl C, vi X, vi T, string S) 
{
    A = A2;
    B = B2;
    ans = S;
    n = N; m = M; q = Q; k = K;
    sort(all(T));
    rep(i,m)
    {
        costs[i] = C[i];
        color[i] = 18;
        graph[A[i]].pb({B[i],i});
        graph[B[i]].pb({A[i],i});
        rel_end[i] = -1;
    }
    int cur = 0;
    rep(i,k) 
    {
        costs[T[i]] = INF;
    }
    while(siz(T) != 302) T.pb(-1);
    rep(i,k) color[T[i]] = get_int(4);
    dead_group = get_int(5);
    rep(i,m) if(color[i] == 18) color[i] = dead_group;
    rep(i,k) if(color[T[i]] % 16 == 0)
    {
        if(get_int(1)) color[T[i]] = 16;
    }
    rep(i,17) 
    {
        path_beg[i] = get_int(9);
        if(path_beg[i] == 301) path_beg[i] = -1;
        else path_beg[i] = T[path_beg[i]];
    }
    while(true)
    {
        int x = -1;
        rep(j,17)
        {
            if(j == dead_group || was[j]) continue;
            if(path_beg[j] == -1 || rel_end[path_beg[j]] != -1) x = j;
        }
        if(x == -1) break;
        was[x] = 1;
        vi path;
        rep(i,k) if(color[T[i]] == x) path.pb(T[i]);
        if(siz(path) == 0) continue;
        add_path((path_beg[x] != -1 ? rel_end[path_beg[x]] : 0),path);
    }
    rep(i,q)
    {
        int p = get_int(9);
        int beg = 0;
        if(p != 301) beg = rel_end[T[p]];
        int v = X[i];
        dijkstra(beg);
        vi ans = get_path(v,beg);
        v = beg;
        while(v != 0)
        {
            forall(it,root_path[v].ss) ans.pb(it);
            v = root_path[v].ff;
        }
        reverse(all(ans));
        answer(ans);
        
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...