#include <cstdlib> #include <iostream> #include <vector> #include <set> #include "krazki.h" #include "message.h" #define ll long long const ll INF = 1LL << 62; using namespace std; int bs(vector<ll>& v, ll x, int from, int to) { int f = from; int t = to; while(t - f >= 2) { int mid = (f+t)/2; if(v[mid] < x) { t = mid; } else { f = mid; } } int k=-1; for(;;) { int g = f+k; if(g >= from && g < to) { if(v[g] < x) { return g-1; } } else if(g == to) { return g; } k++; } } void nonincr(vector<ll>& h) { ll max = INF; for(vector<ll>::iterator it = h.begin();it != h.end();it++) { if(*it < max) { max = *it; } else { *it = max; } } } int main() { int hc = PipeHeight(); int dc = NumberOfDiscs(); int n = NumberOfNodes(); if(hc < dc) { if(MyNodeId() == 0) { cout<<0<<endl; } return 0; } int maxc = max(hc,dc); int me = MyNodeId(); if (me != 0) { return 0; } vector<ll> h, d; for(int i=0;i<hc;i++) { h.push_back(HoleDiameter(i+1)); } h.push_back(0); nonincr(h); for(int i=0;i<dc;i++) { d.push_back(DiscDiameter(i+1)); } int from = 0; int to = h.size()-1; int i = 0; while(i < dc && to > 0) { if(d[i] <= h[from]) { to = bs(h,d[i],from,to+1); h[to] = 0; } else { break; } i++; } cout<<(i<dc?0:(to+1))<<endl; 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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #include <cstdlib> #include <iostream> #include <vector> #include <set> #include "krazki.h" #include "message.h" #define ll long long const ll INF = 1LL << 62; using namespace std; int bs(vector<ll>& v, ll x, int from, int to) { int f = from; int t = to; while(t - f >= 2) { int mid = (f+t)/2; if(v[mid] < x) { t = mid; } else { f = mid; } } int k=-1; for(;;) { int g = f+k; if(g >= from && g < to) { if(v[g] < x) { return g-1; } } else if(g == to) { return g; } k++; } } void nonincr(vector<ll>& h) { ll max = INF; for(vector<ll>::iterator it = h.begin();it != h.end();it++) { if(*it < max) { max = *it; } else { *it = max; } } } int main() { int hc = PipeHeight(); int dc = NumberOfDiscs(); int n = NumberOfNodes(); if(hc < dc) { if(MyNodeId() == 0) { cout<<0<<endl; } return 0; } int maxc = max(hc,dc); int me = MyNodeId(); if (me != 0) { return 0; } vector<ll> h, d; for(int i=0;i<hc;i++) { h.push_back(HoleDiameter(i+1)); } h.push_back(0); nonincr(h); for(int i=0;i<dc;i++) { d.push_back(DiscDiameter(i+1)); } int from = 0; int to = h.size()-1; int i = 0; while(i < dc && to > 0) { if(d[i] <= h[from]) { to = bs(h,d[i],from,to+1); h[to] = 0; } else { break; } i++; } cout<<(i<dc?0:(to+1))<<endl; return 0; } |