Submission #881487

# Submission time Handle Problem Language Result Execution time Memory
881487 2023-12-01T09:48:10 Z andrei_boaca Highway Tolls (IOI18_highway) C++17
51 / 100
109 ms 13848 KB
#include "highway.h"
#include <bits/stdc++.h>
//#include "grader.cpp"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
mt19937 rng(chrono::steady_clock().now().time_since_epoch().count());
int n,m,niv[100005],roots[5];
ll dist,AA,BB,d[3][100005];
int where[100005];
vector<pii> muchii[100005];
vector<pii> g;
vector<int> w;
ll memo[100005],calls;
bool inarb[300005],inx[300005];
int IND;
void bfs(int ind)
{
    for(int i=0;i<n;i++)
        d[ind][i]=1e9;
    d[ind][roots[ind]]=0;
    queue<int> coada;
    coada.push(roots[ind]);
    while(!coada.empty())
    {
        int nod=coada.front();
        coada.pop();
        for(auto i:muchii[nod])
            if(d[ind][i.first]>d[ind][nod]+1)
            {
                d[ind][i.first]=d[ind][nod]+1;
                coada.push(i.first);
            }
    }
}
ll buildniv(ll nivmax,ll ind)
{
    for(int i=0;i<m;i++)
    {
        if(inarb[i]==0)
        {
            w[i]=1;
            continue;
        }
        int a=g[i].first,b=g[i].second;
        if(max(d[ind][a],d[ind][b])<=nivmax)
            w[i]=0;
        else
            w[i]=1;
    }
    return ask(w);
}
ll buildx(int ind)
{
    for(int i=0;i<m;i++)
    {
        if(inarb[i]==0)
        {
            w[i]=1;
            continue;
        }
        int a=g[i].first,b=g[i].second;
        if(d[ind][a]<d[ind][b])
            swap(a,b);
        if(inx[a])
            w[i]=0;
        else
            w[i]=1;
    }
    return ask(w);
}
bool byniv(int i,int j)
{
    int a=max(d[IND][g[i].first],d[IND][g[i].second]);
    int b=max(d[IND][g[j].first],d[IND][g[j].second]);
    return a<b;
}
int plsfind(int ind)
{
    IND=ind;
    for(int i=0;i<m;i++)
        inarb[i]=0;
    for(int i=0;i<n;i++)
        d[ind][i]=1e9;
    ll nivmax=0;
    d[ind][roots[ind]]=0;
    queue<int> coada;
    coada.push(roots[ind]);
    vector<int> edges;
    while(!coada.empty())
    {
        int nod=coada.front();
        nivmax=max(nivmax,d[ind][nod]);
        coada.pop();
        for(auto i:muchii[nod])
            if(where[i.first]==ind&&d[ind][i.first]>d[ind][nod]+1)
            {
                d[ind][i.first]=d[ind][nod]+1;
                inarb[i.second]=1;
                edges.push_back(i.second);
                coada.push(i.first);
            }
    }
    sort(edges.begin(),edges.end(),byniv);
    for(int i=0;i<m;i++)
        w[i]=1;
    for(int j:edges)
        w[j]=0;
    ll val=ask(w);
    if(val==dist*BB)
        return roots[ind];
    ll st=0;
    ll dr=edges.size();
    dr--;
    ll ans=0;
    while(st<=dr)
    {
        ll mij=(st+dr)/2;
        for(int i=0;i<m;i++)
            w[i]=1;
        for(int j=0;j<=mij;j++)
            w[edges[j]]=0;
        ll x=ask(w);
        if(x==val)
        {
            int p=edges[mij];
            int a=g[p].first;
            int b=g[p].second;
            if(d[ind][a]<d[ind][b])
                swap(a,b);
            ans=a;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    return ans;
}
void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B)
{
    AA=A;
    BB=B;
    n=N;
    m=U.size();
    for(int i=0;i<m;i++)
    {
        int a=U[i],b=V[i];
        g.push_back({a,b});
        muchii[a].push_back({b,i});
        muchii[b].push_back({a,i});
    }
    w.resize(m);
    dist=ask(w)/A;
    ll st=0;
    ll dr=m-1;
    while(st<=dr)
    {
        ll mij=(st+dr)/2;
        for(int i=0;i<m;i++)
        {
            if(i<=mij)
                w[i]=1;
            else
                w[i]=0;
        }
        ll val=ask(w);
        if(val>dist*A)
        {
            roots[1]=g[mij].first;
            roots[2]=g[mij].second;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    bfs(1);
    bfs(2);
    for(int i=0;i<n;i++)
    {
        if(d[1][i]<d[2][i])
            where[i]=1;
        else
            where[i]=2;
    }
    int S=plsfind(1);
    int T=plsfind(2);
    answer(S,T);
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 6608 KB Output is correct
2 Correct 2 ms 6616 KB Output is correct
3 Correct 2 ms 6616 KB Output is correct
4 Correct 1 ms 6616 KB Output is correct
5 Correct 1 ms 6612 KB Output is correct
6 Correct 1 ms 6616 KB Output is correct
7 Correct 1 ms 6616 KB Output is correct
8 Correct 1 ms 6612 KB Output is correct
9 Correct 1 ms 6616 KB Output is correct
10 Correct 1 ms 6612 KB Output is correct
11 Correct 1 ms 6612 KB Output is correct
12 Correct 1 ms 6620 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 6680 KB Output is correct
2 Correct 11 ms 7396 KB Output is correct
3 Correct 97 ms 13608 KB Output is correct
4 Correct 98 ms 13392 KB Output is correct
5 Correct 99 ms 13400 KB Output is correct
6 Correct 99 ms 13644 KB Output is correct
7 Correct 102 ms 13632 KB Output is correct
8 Correct 96 ms 13616 KB Output is correct
9 Correct 85 ms 13848 KB Output is correct
10 Correct 96 ms 13616 KB Output is correct
11 Correct 94 ms 12648 KB Output is correct
12 Correct 103 ms 12956 KB Output is correct
13 Correct 103 ms 12796 KB Output is correct
14 Correct 98 ms 12788 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 7392 KB Output is correct
2 Correct 18 ms 7936 KB Output is correct
3 Correct 24 ms 8876 KB Output is correct
4 Correct 82 ms 12788 KB Output is correct
5 Correct 70 ms 12428 KB Output is correct
6 Correct 71 ms 12760 KB Output is correct
7 Correct 72 ms 12812 KB Output is correct
8 Correct 66 ms 12452 KB Output is correct
9 Correct 71 ms 12776 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 6680 KB Output is correct
2 Correct 11 ms 7412 KB Output is correct
3 Correct 68 ms 12420 KB Output is correct
4 Correct 95 ms 13408 KB Output is correct
5 Correct 98 ms 13744 KB Output is correct
6 Correct 89 ms 13388 KB Output is correct
7 Correct 88 ms 13392 KB Output is correct
8 Correct 94 ms 13376 KB Output is correct
9 Correct 99 ms 13584 KB Output is correct
10 Correct 107 ms 13624 KB Output is correct
11 Correct 100 ms 13032 KB Output is correct
12 Correct 99 ms 13240 KB Output is correct
13 Correct 103 ms 12740 KB Output is correct
14 Correct 97 ms 12676 KB Output is correct
15 Correct 89 ms 13596 KB Output is correct
16 Correct 78 ms 13560 KB Output is correct
17 Correct 100 ms 13480 KB Output is correct
18 Correct 95 ms 12800 KB Output is correct
19 Correct 88 ms 13484 KB Output is correct
20 Correct 99 ms 12784 KB Output is correct
21 Correct 88 ms 13796 KB Output is correct
22 Correct 80 ms 13560 KB Output is correct
23 Correct 92 ms 13844 KB Output is correct
24 Correct 97 ms 13312 KB Output is correct
25 Correct 109 ms 12888 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 13 ms 7404 KB Output is incorrect: {s, t} is wrong.
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 11 ms 7380 KB Output is incorrect: {s, t} is wrong.
2 Halted 0 ms 0 KB -