/* Arek Wróbel - skater
*
* Zadanie: Kółko informatyczne
* Konkurs: PA2014, runda 4B
*/
#include "message.h"
#include "kollib.h"
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef vector<int> VI;
#define REP(I, N) for(int I=0; I<(N); ++I)
#define FOR(I, M, N) for(int I=(M); I<=(N); ++I)
#define FORD(I, M, N) for(int I=(M); I>=(N); --I)
#define FOREACH(IT, CON) for(__typeof(CON.begin()) IT=CON.begin(); IT!=CON.end(); ++IT)
#define ST first
#define ND second
#define MP make_pair
#define PB push_back
const int INF=1000000000;
const LL INFLL=1000000000000000000LL;
int numberOfNodes;
int myNodeId;
int N;
int Q;
PII queries[201];
VI t;
VI nr;
void make_distributed() {
if (numberOfNodes > N)
numberOfNodes = N;
if (myNodeId >= numberOfNodes)
exit(0);
}
inline int search(int v) {
int pocz = 0;
int sred;
int kon = t.size();
while (pocz + 1 < kon) {
sred = (pocz+kon) >> 1;
if (t[sred] > v)
kon = sred;
else
pocz = sred;
}
return pocz;
}
void make_static() {
if (myNodeId > 0)
exit(0);
FOR(i, 1, Q) {
queries[i].ST = QueryFrom(i);
queries[i].ND = QueryTo(i);
t.PB(queries[i].ST);
t.PB(queries[i].ND);
}
sort(t.begin(), t.end());
t.resize( distance(t.begin(), unique(t.begin(), t.end())) );
nr.resize(t.size());
if (t[0] == 1)
nr[0] = 0;
int prev = 1;
int v = FirstNeighbor(1);
for (int i = 1; v != 1; ++i) {
// printf("(%d)\n", v);
int x = search(v);
if (t[x] == v)
nr[x] = i;
int next = FirstNeighbor(v);
if (next == prev)
next = SecondNeighbor(v);
prev = v;
v = next;
}
// FOR(i, 1, N) printf("%d: %d\n", i, nr[i]);
FOR(i, 1, Q) {
int a, b;
a = nr[search( queries[i].ST )];
b = nr[search( queries[i].ND )];
if (a>b)
swap(a, b);
printf("%d\n", min(b-a, N-b+a));
}
}
int main()
{
numberOfNodes = NumberOfNodes();
myNodeId = MyNodeId();
N = NumberOfStudents();
Q = NumberOfQueries();
/* if (N >= 219000000)
make_distributed();
else
make_static();
*/ make_static();
// printf("KONIEC!\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 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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | /* Arek Wróbel - skater * * Zadanie: Kółko informatyczne * Konkurs: PA2014, runda 4B */ #include "message.h" #include "kollib.h" #include <cstdio> #include <algorithm> #include <cmath> #include <vector> #include <map> using namespace std; typedef long long LL; typedef pair<int, int> PII; typedef vector<int> VI; #define REP(I, N) for(int I=0; I<(N); ++I) #define FOR(I, M, N) for(int I=(M); I<=(N); ++I) #define FORD(I, M, N) for(int I=(M); I>=(N); --I) #define FOREACH(IT, CON) for(__typeof(CON.begin()) IT=CON.begin(); IT!=CON.end(); ++IT) #define ST first #define ND second #define MP make_pair #define PB push_back const int INF=1000000000; const LL INFLL=1000000000000000000LL; int numberOfNodes; int myNodeId; int N; int Q; PII queries[201]; VI t; VI nr; void make_distributed() { if (numberOfNodes > N) numberOfNodes = N; if (myNodeId >= numberOfNodes) exit(0); } inline int search(int v) { int pocz = 0; int sred; int kon = t.size(); while (pocz + 1 < kon) { sred = (pocz+kon) >> 1; if (t[sred] > v) kon = sred; else pocz = sred; } return pocz; } void make_static() { if (myNodeId > 0) exit(0); FOR(i, 1, Q) { queries[i].ST = QueryFrom(i); queries[i].ND = QueryTo(i); t.PB(queries[i].ST); t.PB(queries[i].ND); } sort(t.begin(), t.end()); t.resize( distance(t.begin(), unique(t.begin(), t.end())) ); nr.resize(t.size()); if (t[0] == 1) nr[0] = 0; int prev = 1; int v = FirstNeighbor(1); for (int i = 1; v != 1; ++i) { // printf("(%d)\n", v); int x = search(v); if (t[x] == v) nr[x] = i; int next = FirstNeighbor(v); if (next == prev) next = SecondNeighbor(v); prev = v; v = next; } // FOR(i, 1, N) printf("%d: %d\n", i, nr[i]); FOR(i, 1, Q) { int a, b; a = nr[search( queries[i].ST )]; b = nr[search( queries[i].ND )]; if (a>b) swap(a, b); printf("%d\n", min(b-a, N-b+a)); } } int main() { numberOfNodes = NumberOfNodes(); myNodeId = MyNodeId(); N = NumberOfStudents(); Q = NumberOfQueries(); /* if (N >= 219000000) make_distributed(); else make_static(); */ make_static(); // printf("KONIEC!\n"); return 0; } |
English