답안 #879581

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
879581 2023-11-27T16:35:59 Z andrei_boaca 통행료 (IOI18_highway) C++17
51 / 100
792 ms 262144 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],par[100005],topar[100005],dp[21][100005],in[100005],out[100005],timp;
ll dist,AA,BB;
vector<pii> muchii[100005];
vector<pii> g;
vector<int> w;
ll memo[100005],calls;
bool isancestor(int a,int b)
{
    return in[a]<=in[b]&&out[a]>=out[b];
}
int LCA(int a,int b)
{
    if(niv[a]>niv[b])
        swap(a,b);
    if(isancestor(a,b))
        return a;
    for(int i=20;i>=0;i--)
        if(dp[i][a]!=-1&&!isancestor(dp[i][a],b))
            a=dp[i][a];
    return par[a];
}
void dfs(int nod)
{
    timp++;
    in[nod]=timp;
    dp[0][nod]=par[nod];
    for(int i=1;i<=20;i++)
    {
        if(dp[i-1][nod]==-1)
        {
            dp[i][nod]=-1;
            continue;
        }
        dp[i][nod]=dp[i-1][dp[i-1][nod]];
    }
    for(auto i:muchii[nod])
        if(i.first!=par[nod])
        {
            par[i.first]=nod;
            niv[i.first]=niv[nod]+1;
            topar[i.first]=i.second;
            dfs(i.first);
        }
    out[nod]=timp;
}
ll buildniv(int p)
{
    if(memo[p]!=0)
        return memo[p];
    for(int i=0;i<m;i++)
    {
        w[i]=1;
        if(min(niv[g[i].first],niv[g[i].second])<=p)
            w[i]=0;
    }
    calls++;
    assert(calls<=60);
    memo[p]=ask(w);
    return memo[p];
}
int getnode(vector<int> cand)
{
    while(true)
    {
        if(cand.size()==1)
            return cand[0];
        vector<int> x,y;
        int lg=cand.size();
        for(int i=0;i<cand.size();i++)
        {
            if(i<lg/2)
                x.push_back(cand[i]);
            else
                y.push_back(cand[i]);
        }
        for(int i=0;i<m;i++)
            w[i]=1;
        for(int i:x)
            w[topar[i]]=0;
        calls++;
        assert(calls<=60);
        ll val=ask(w);
        if(val<dist*BB)
            cand=x;
        else
            cand=y;
    }
    return -1;
}
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});
    }
    for(int i=0;i<n;i++)
        par[i]=-1;
    int root=rng()%n;
    niv[root]=1;
    dfs(root);
    int nivmax=0;
    for(int i=0;i<n;i++)
        nivmax=max(nivmax,niv[i]);
    for(int i=0;i<m;i++)
        w.push_back(0);
    calls++;
    assert(calls<=60);
    dist=ask(w)/A;
    int nivlca=nivmax;
    int st=1;
    int dr=nivmax-1;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        ll val=buildniv(mij);
        if(val<dist*B)
        {
            nivlca=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    int nivS=nivlca;
    int nivT=0;
    st=nivlca;
    dr=nivmax-1;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        ll val=buildniv(mij);
        if(val==dist*A)
        {
            nivT=mij+1;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    nivS=nivlca+(dist-(nivT-nivlca));
    //assert(nivS<=nivT);
    vector<int> c1,c2;
    for(int i=0;i<n;i++)
    {
        if(niv[i]==nivS)
            c1.push_back(i);
        if(niv[i]==nivT)
            c2.push_back(i);
    }
    int T=getnode(c2);
    c1.clear();
    for(int i=0;i<n;i++)
        if(niv[i]==nivS&&niv[LCA(i,T)]==nivlca)
            c1.push_back(i);
    int S=getnode(c1);
    //assert(S!=T);
    //assert(S!=-1&&T!=-1);
    answer(S,T);
}

Compilation message

highway.cpp: In function 'int getnode(std::vector<int>)':
highway.cpp:76:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |         for(int i=0;i<cand.size();i++)
      |                     ~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 12632 KB Output is correct
2 Correct 2 ms 12628 KB Output is correct
3 Correct 2 ms 12632 KB Output is correct
4 Correct 2 ms 12632 KB Output is correct
5 Correct 2 ms 12632 KB Output is correct
6 Correct 2 ms 12632 KB Output is correct
7 Correct 2 ms 12632 KB Output is correct
8 Correct 2 ms 12632 KB Output is correct
9 Correct 2 ms 12632 KB Output is correct
10 Correct 2 ms 12632 KB Output is correct
11 Correct 2 ms 12632 KB Output is correct
12 Correct 2 ms 12632 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 12788 KB Output is correct
2 Correct 11 ms 13580 KB Output is correct
3 Correct 85 ms 20060 KB Output is correct
4 Correct 89 ms 20052 KB Output is correct
5 Correct 95 ms 20056 KB Output is correct
6 Correct 91 ms 20056 KB Output is correct
7 Correct 88 ms 20064 KB Output is correct
8 Correct 82 ms 19832 KB Output is correct
9 Correct 98 ms 20064 KB Output is correct
10 Correct 110 ms 20056 KB Output is correct
11 Correct 138 ms 20832 KB Output is correct
12 Correct 114 ms 21396 KB Output is correct
13 Correct 144 ms 21920 KB Output is correct
14 Correct 126 ms 21000 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 14112 KB Output is correct
2 Correct 19 ms 15152 KB Output is correct
3 Correct 28 ms 16424 KB Output is correct
4 Correct 84 ms 23416 KB Output is correct
5 Correct 87 ms 24076 KB Output is correct
6 Correct 91 ms 23636 KB Output is correct
7 Correct 102 ms 24844 KB Output is correct
8 Correct 83 ms 22924 KB Output is correct
9 Correct 93 ms 22732 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 12728 KB Output is correct
2 Correct 14 ms 13580 KB Output is correct
3 Correct 83 ms 18608 KB Output is correct
4 Correct 121 ms 20048 KB Output is correct
5 Correct 108 ms 20304 KB Output is correct
6 Correct 111 ms 20068 KB Output is correct
7 Correct 100 ms 20052 KB Output is correct
8 Correct 114 ms 20052 KB Output is correct
9 Correct 128 ms 20052 KB Output is correct
10 Correct 92 ms 20064 KB Output is correct
11 Correct 136 ms 20772 KB Output is correct
12 Correct 114 ms 20652 KB Output is correct
13 Correct 112 ms 21264 KB Output is correct
14 Correct 103 ms 21152 KB Output is correct
15 Correct 118 ms 19820 KB Output is correct
16 Correct 116 ms 20056 KB Output is correct
17 Correct 136 ms 21160 KB Output is correct
18 Correct 123 ms 20996 KB Output is correct
19 Correct 86 ms 20100 KB Output is correct
20 Correct 103 ms 21876 KB Output is correct
21 Correct 116 ms 21744 KB Output is correct
22 Correct 81 ms 21500 KB Output is correct
23 Correct 100 ms 20784 KB Output is correct
24 Correct 138 ms 21524 KB Output is correct
25 Correct 107 ms 24168 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 792 ms 262144 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 485 ms 262144 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -