Submission #1201108

#TimeUsernameProblemLanguageResultExecution timeMemory
1201108GrayFinding Routers (IOI20_routers)C++20
100 / 100
1 ms328 KiB
#include "routers.h"
#include <bits/stdc++.h>
#define ll int // 🗿

using namespace std;


void gen(ll l, ll r, ll cl, ll cr, vector<ll> &bound){
    // cout << l << "-" << r << " : " << cl << "-" << cr << endl;
    if (cl>cr) return;
    if (l>=r){
        for (ll i=cl; i<=cr; i++) bound[i]=max(bound[i], l);
    }else{
        ll m = (l+r)/2;
        ll idx = use_detector(m+1);
        bound[idx]=max(bound[idx], m+1);
        // cout << idx << " <- " << m << endl;
        gen(l, m, cl, idx-1, bound);
        gen(m+1, r, idx, cr, bound);
    }
}

vector<ll> case1(ll length, ll n, ll q){
    vector<ll> bounds(n, 0);
    gen(0, length, 0, n-2, bounds);
    // for (ll i=0; i<n; i++) cout << bounds[i] << " ";
    // cout << endl;
    vector<ll> ans = {0};
    for (ll i=0; i<n-1; i++){
        ans.push_back(ans.back()+2*(bounds[i]-ans.back()));
    }
    return ans;
}

vector<ll> case2(ll len, ll n, ll q){
    ll l=0, r=len;
    while (l+1<r){
        ll mid = (l+r)/2;
        ll idx = use_detector(mid);
        if (idx==0) l=mid;
        else r=mid;
    }
    return {0, l*2};
}

vector<int> find_routers(int l, int n, int q) {
    if (n==2) return case2(l, n, q);
	return case1(l, n, q);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...