#include <bits/stdc++.h>
#define N 75
using namespace std;
size_t conn[N]; // dodatkowe powiązania
size_t traceback[N + 1]; // kolejne ilości dróg, ostatnia ma być jeden
set<pair<size_t, size_t>> hopki; // -dokąd, skąd
vector<size_t> majahopki;
void init() { traceback[N] = 1; }
bool ma_hopke(const size_t a) { return conn[a] > a + 1; }
void usun_losowa_hopke() {
size_t r = rand() % majahopki.size(); // wylosuj
hopki.erase({-conn[majahopki[r]], majahopki[r]}); // wyrzuć połączenie
conn[majahopki[r]] = 0; // usuń hopkę
swap(majahopki[r], *(majahopki.end() - 1)); // zapomnij
majahopki.pop_back();
}
void nadpisz_hopke(size_t a, size_t b) {
if(ma_hopke(a)) { // musimy usunąć stary
hopki.erase({-conn[a], a});
} else {
majahopki.push_back(a);
}
conn[a] = b;
hopki.insert({-b, a});
}
void zmien_losowa_hopke() {
size_t a = rand() % (N - 2);
size_t b = 2 + a + rand() % (N - a - 2);
nadpisz_hopke(a, b);
}
size_t policz_sciezki() {
set<pair<size_t, size_t>>::iterator it = hopki.begin();
for(size_t i = N - 1; i != (size_t) -1; --i) {
if(ma_hopke(i))
traceback[i] += traceback[i + 1];
else
traceback[i] = traceback[i + 1];
while(it != hopki.end() && it->first == -i) {
traceback[it->second] = traceback[i];
++it;
}
}
return traceback[0];
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
size_t sciezek, aktualnie;
cin >> sciezek;
init();
while((aktualnie = policz_sciezki()) != sciezek)
if(aktualnie < sciezek)
zmien_losowa_hopke();
else
usun_losowa_hopke();
cout << N << '\n';
for(size_t i = 0; i < N - 1; ++i)
cout << i + 2 << ' ' << (ma_hopke(i) ? (int) (conn[i] + 1) : -1) << '\n';
cout << "-1 -1\n";
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <bits/stdc++.h> #define N 75 using namespace std; size_t conn[N]; // dodatkowe powiązania size_t traceback[N + 1]; // kolejne ilości dróg, ostatnia ma być jeden set<pair<size_t, size_t>> hopki; // -dokąd, skąd vector<size_t> majahopki; void init() { traceback[N] = 1; } bool ma_hopke(const size_t a) { return conn[a] > a + 1; } void usun_losowa_hopke() { size_t r = rand() % majahopki.size(); // wylosuj hopki.erase({-conn[majahopki[r]], majahopki[r]}); // wyrzuć połączenie conn[majahopki[r]] = 0; // usuń hopkę swap(majahopki[r], *(majahopki.end() - 1)); // zapomnij majahopki.pop_back(); } void nadpisz_hopke(size_t a, size_t b) { if(ma_hopke(a)) { // musimy usunąć stary hopki.erase({-conn[a], a}); } else { majahopki.push_back(a); } conn[a] = b; hopki.insert({-b, a}); } void zmien_losowa_hopke() { size_t a = rand() % (N - 2); size_t b = 2 + a + rand() % (N - a - 2); nadpisz_hopke(a, b); } size_t policz_sciezki() { set<pair<size_t, size_t>>::iterator it = hopki.begin(); for(size_t i = N - 1; i != (size_t) -1; --i) { if(ma_hopke(i)) traceback[i] += traceback[i + 1]; else traceback[i] = traceback[i + 1]; while(it != hopki.end() && it->first == -i) { traceback[it->second] = traceback[i]; ++it; } } return traceback[0]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); size_t sciezek, aktualnie; cin >> sciezek; init(); while((aktualnie = policz_sciezki()) != sciezek) if(aktualnie < sciezek) zmien_losowa_hopke(); else usun_losowa_hopke(); cout << N << '\n'; for(size_t i = 0; i < N - 1; ++i) cout << i + 2 << ' ' << (ma_hopke(i) ? (int) (conn[i] + 1) : -1) << '\n'; cout << "-1 -1\n"; return 0; } |
English