답안 #933957

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
933957 2024-02-26T15:36:14 Z kim 통행료 (IOI18_highway) C++17
82 / 100
224 ms 23128 KB
#include "highway.h"
#include<bits/stdc++.h>
using namespace std;
#define eb emplace_back
using ll=long long;
using pii=pair<int,int>;
#define f first
#define s second

int n,m;
pii edge[130005];
vector<pii> graph[90005];
vector<int> tmp,ans;
ll mn_ask,dist;
bitset<90005> vis;
int tour[90005];
int mid_node;

int solve1(int U){
    int id=0;
    queue<int> q;
    q.emplace(U);
    vis=0;
    vis[U]=1;
    tour[U]=0;
    while(q.size()){
        int u=q.front(); q.pop();
        for(auto &[v,i]:graph[u]){
            if(vis[v]) continue;
            vis[v]=1;
            q.emplace(v);
            tour[v]=++id;
        }
    }
    int l=dist,r=id;
    while(l<r){
        int mid=l+r>>1;
        for(int i=0;i<m;++i){
            auto &[u,v]=edge[i];
            if(tour[u]<=mid&&tour[v]<=mid) tmp[i]=0;
            else tmp[i]=1;
        }
        if(ask(tmp)==mn_ask) r=mid;
        else l=mid+1;
    }
    for(int i=0;i<n;++i){
        if(tour[i]==l){
            ans.eb(i);
            mid_node=i;
            return i;
        }
    }
}
int solve2(int U){
    int id=0;
    queue<int> q;
    q.emplace(U);
    vis=0;
    vis[U]=1;
    tour[U]=0;
    while(q.size()){
        int u=q.front(); q.pop();
        for(auto &[v,i]:graph[u]){
            if(vis[v]) continue;
            vis[v]=1;
            q.emplace(v);
            tour[v]=++id;
        }
    }
    int l=dist,r=id;
    while(l<r){
        int mid=l+r>>1;
        for(int i=0;i<m;++i){
            auto &[u,v]=edge[i];
            if(tour[u]<=mid&&tour[v]<=mid) tmp[i]=0;
            else tmp[i]=1;
        }
        if(ask(tmp)==mn_ask) r=mid;
        else l=mid+1;
    }
    for(int i=0;i<n;++i){
        graph[i].clear();
        if(tour[i]==l) ans.eb(i);
    }
    for(int i=0;i<m;++i){
        auto &[u,v]=edge[i];
        if(tour[u]<=l&&tour[v]<=l) graph[u].eb(v,i),graph[v].eb(u,i);
    }
    return ans.back();
}
void solve3(int U){
    using A=tuple<int,int,bool>;
    queue<A> q;
    q.emplace(U,0,0);
    vis=0;
    vis[U]=1;
    vector<int> tmp2(tmp.size(),1);
    vector<pii> vec;
    while(q.size()){
        auto [u,d,ok]=q.front(); q.pop();
        for(auto &[v,id]:graph[u]){
            if(vis[v]) continue;
            bool ok2=ok|(v==mid_node);
            if(d+1<dist) q.emplace(v,d+1,ok2), tmp2[id]=0;
            else if(d+1==dist&&ok2) vec.eb(v,id);
            vis[v]=1;
        }
    }
    int l=0,r=(int)vec.size()-1;
    while(l<r){
        int mid=l+r>>1;
        tmp=tmp2;
        for(int i=0;i<=mid;++i) tmp[vec[i].s]=0;
        if(ask(tmp)==mn_ask) r=mid;
        else l=mid+1;
    }
    ans.eb(vec[l].f);
}

void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) {
    n=N,m=U.size();
    for(int i=0;i<m;++i){
        edge[i]={U[i],V[i]};
        graph[U[i]].eb(V[i],i);
        graph[V[i]].eb(U[i],i);
    }
    tmp.assign(m,0);
    mn_ask=ask(tmp), dist=mn_ask/A;
    solve3(solve2(solve1(0)));
    answer(ans[1],ans[2]);
}
/*
15 15  99 100  9 10
0 1
1 3
3 5
5 7
7 9
9 11
11 13
13 14
14 12
12 10
10 8
8 6
6 4
4 2
2 0
*/

Compilation message

highway.cpp: In function 'int solve1(int)':
highway.cpp:37:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   37 |         int mid=l+r>>1;
      |                 ~^~
highway.cpp: In function 'int solve2(int)':
highway.cpp:72:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   72 |         int mid=l+r>>1;
      |                 ~^~
highway.cpp: In function 'void solve3(int)':
highway.cpp:111:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  111 |         int mid=l+r>>1;
      |                 ~^~
highway.cpp: In function 'int solve1(int)':
highway.cpp:21:16: warning: control reaches end of non-void function [-Wreturn-type]
   21 |     queue<int> q;
      |                ^
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2756 KB Output is correct
2 Correct 1 ms 2760 KB Output is correct
3 Correct 1 ms 2756 KB Output is correct
4 Correct 1 ms 2756 KB Output is correct
5 Correct 1 ms 2748 KB Output is correct
6 Correct 1 ms 2748 KB Output is correct
7 Correct 1 ms 2760 KB Output is correct
8 Correct 1 ms 2756 KB Output is correct
9 Correct 1 ms 2752 KB Output is correct
10 Correct 1 ms 2756 KB Output is correct
11 Correct 1 ms 2752 KB Output is correct
12 Correct 1 ms 2756 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2816 KB Output is correct
2 Correct 15 ms 3452 KB Output is correct
3 Correct 110 ms 10028 KB Output is correct
4 Correct 141 ms 9748 KB Output is correct
5 Correct 115 ms 9296 KB Output is correct
6 Correct 121 ms 9280 KB Output is correct
7 Correct 126 ms 9520 KB Output is correct
8 Correct 103 ms 9296 KB Output is correct
9 Correct 111 ms 9068 KB Output is correct
10 Correct 127 ms 9520 KB Output is correct
11 Correct 128 ms 8688 KB Output is correct
12 Correct 117 ms 9168 KB Output is correct
13 Correct 123 ms 9164 KB Output is correct
14 Correct 99 ms 8724 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 3384 KB Output is correct
2 Correct 16 ms 4012 KB Output is correct
3 Correct 18 ms 4616 KB Output is correct
4 Correct 89 ms 8460 KB Output is correct
5 Correct 65 ms 8456 KB Output is correct
6 Correct 101 ms 8708 KB Output is correct
7 Correct 72 ms 8456 KB Output is correct
8 Correct 90 ms 8456 KB Output is correct
9 Correct 88 ms 8456 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2812 KB Output is correct
2 Correct 12 ms 3476 KB Output is correct
3 Correct 71 ms 7792 KB Output is correct
4 Correct 95 ms 9064 KB Output is correct
5 Correct 104 ms 9052 KB Output is correct
6 Correct 141 ms 9296 KB Output is correct
7 Correct 85 ms 9316 KB Output is correct
8 Correct 98 ms 9272 KB Output is correct
9 Correct 117 ms 9504 KB Output is correct
10 Correct 123 ms 9772 KB Output is correct
11 Correct 109 ms 8684 KB Output is correct
12 Correct 100 ms 8456 KB Output is correct
13 Correct 105 ms 8492 KB Output is correct
14 Correct 116 ms 8920 KB Output is correct
15 Correct 97 ms 9244 KB Output is correct
16 Correct 96 ms 9512 KB Output is correct
17 Correct 111 ms 8676 KB Output is correct
18 Correct 110 ms 8696 KB Output is correct
19 Correct 100 ms 9292 KB Output is correct
20 Correct 92 ms 8504 KB Output is correct
21 Correct 87 ms 10020 KB Output is correct
22 Correct 81 ms 9540 KB Output is correct
23 Correct 92 ms 9600 KB Output is correct
24 Correct 91 ms 9520 KB Output is correct
25 Correct 93 ms 8572 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 3476 KB Output is correct
2 Correct 14 ms 3544 KB Output is correct
3 Correct 128 ms 9968 KB Output is correct
4 Correct 129 ms 10516 KB Output is correct
5 Correct 165 ms 12092 KB Output is correct
6 Correct 179 ms 12096 KB Output is correct
7 Correct 224 ms 11820 KB Output is correct
8 Runtime error 177 ms 23128 KB Execution killed with signal 11
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 3516 KB Output is correct
2 Correct 14 ms 3544 KB Output is correct
3 Correct 114 ms 9564 KB Output is correct
4 Correct 196 ms 10668 KB Output is correct
5 Correct 128 ms 10752 KB Output is correct
6 Correct 183 ms 11700 KB Output is correct
7 Correct 120 ms 10016 KB Output is correct
8 Correct 137 ms 10216 KB Output is correct
9 Correct 138 ms 10508 KB Output is correct
10 Correct 176 ms 11852 KB Output is correct
11 Correct 133 ms 11416 KB Output is correct
12 Correct 151 ms 11636 KB Output is correct
13 Correct 162 ms 11040 KB Output is correct
14 Correct 134 ms 10640 KB Output is correct
15 Correct 146 ms 11220 KB Output is correct
16 Correct 127 ms 10152 KB Output is correct
17 Correct 121 ms 10524 KB Output is correct
18 Correct 144 ms 10216 KB Output is correct
19 Correct 188 ms 12112 KB Output is correct
20 Correct 190 ms 11512 KB Output is correct
21 Correct 153 ms 12104 KB Output is correct
22 Correct 156 ms 12088 KB Output is correct
23 Correct 145 ms 11860 KB Output is correct
24 Correct 160 ms 12116 KB Output is correct
25 Correct 147 ms 11624 KB Output is correct
26 Correct 146 ms 12080 KB Output is correct
27 Correct 118 ms 10184 KB Output is correct
28 Correct 98 ms 10132 KB Output is correct
29 Correct 141 ms 10340 KB Output is correct
30 Correct 100 ms 9740 KB Output is correct
31 Correct 119 ms 10164 KB Output is correct
32 Correct 126 ms 9828 KB Output is correct
33 Correct 104 ms 10096 KB Output is correct
34 Correct 102 ms 9752 KB Output is correct
35 Correct 130 ms 10072 KB Output is correct
36 Correct 117 ms 9840 KB Output is correct
37 Correct 99 ms 9788 KB Output is correct
38 Correct 115 ms 9996 KB Output is correct
39 Correct 157 ms 11812 KB Output is correct
40 Correct 148 ms 11592 KB Output is correct
41 Correct 135 ms 11124 KB Output is correct
42 Correct 169 ms 11344 KB Output is correct