#include "kollib.h" #include "message.h" #include<iostream> #include<vector> //#include<string> //#include<map> //#include<complex> //#include<stack> //#include<list> //#include<bitset> //#include<set> //#include<iterator> #include<cmath> //#include<queue> //#include<time.h> //#include<string.h> //#include<fstream> //#include<sstream> #include<algorithm> using namespace std; #define REP( x,y ) for( int x=0; x<(y); x++ ) #define FORD( x,y,z ) for( int x=y; x>=(z); x-- ) #define FOR(x,b,e) for( int x = b; x <= (e); ++x ) #define SIZE(v) (int)v.size() #define ALL(c) c.begin(),c.end() #define VAR(v,n) __typeof(n) v=(n) #define FOREACH(i,c) for( VAR(i,c.begin());i!=c.end();++i ) #define PB push_back #define MP make_pair #define ST first #define ND second #define WRITE( V ){ FOREACH(it,V) cout << *it << ", "; cout << endl; } #define WRITE_ALL(V,s,t) { cout << s << endl; REP( i,SIZE(V) ){ cout << i+1 << " ---- "; FOREACH(it,V[i]) cout << *it+t << ", "; cout << endl; } } #define WRP(p) p.ST << " " << p.ND #define CLEAR( dst,quant ) memset( dst,0, (quant)*sizeof( __typeof(*dst) ) ); #define WAR if( show_help ) #define ENDL(x) REP(crow,(x)) cout << endl; const bool show_help = 1; const int INF = 1000000001; int N,M,K,a,b,c,y,t,w,l_zest; const long double EPS = 1e-11; typedef vector<double> VD; typedef pair<double,int> PDI; typedef pair<double, double> PDD; typedef vector<bool> VB; typedef vector<int> VI; typedef vector< VI > VVI; typedef pair<int,int> PII; typedef long long LL; typedef pair<LL,LL> PLL; typedef vector<LL> VLL; typedef vector<VLL> VVLL; typedef vector<PII> VPII; int nodes, myinst; // ilosc wierzcholkow oraz numer mojej instancji void solveSmall(){ VI V; int beg = FirstNeighbor(1); V.PB(1); V.PB(beg); while( V[ SIZE(V)-1 ] != V[0] ){ // po tym whilu powinienem miec wszystkich juz w wektorze V if( FirstNeighbor( V[ SIZE(V)-1 ] ) != V[ SIZE(V)-2 ] ) V.PB( FirstNeighbor( V[ SIZE(V)-1 ] ) ); else V.PB( SecondNeighbor( V[ SIZE(V)-1 ] ) ); } V.pop_back(); // musze usunac ostatni element, bo to jest tak naprawde pierwszy(zerowy) element... VI poz(SIZE(V)); REP(i,SIZE(poz)) poz[ V[i]-1 ] = i; // osoba o numerze V[i] jest w V na miejscu i int M = NumberOfQueries(); int a,b,dist; FOR(i,1,M){ a = QueryFrom(i); b = QueryTo(i); dist = abs( poz[a-1] - poz[b-1] ); dist = min( dist, SIZE(V) - dist ); cout << dist << endl; } } int main(){ ios_base::sync_with_stdio(0); N = NumberOfStudents(); nodes = NumberOfNodes(); myinst = MyNodeId(); if( N <= 100000 ){ // dla malych danych moge to zrobic recznie, ale tylko w jednej, pierwszej instancji if( myinst == 0 ) solveSmall(); } else{ // dla wiekszych niech juz to bedzie rozproszone while(true); int m = myinst * N / nodes; // srodek mojego przedzialu int t = 0; // wskaznik rozchodzenia sie } 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 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include "kollib.h" #include "message.h" #include<iostream> #include<vector> //#include<string> //#include<map> //#include<complex> //#include<stack> //#include<list> //#include<bitset> //#include<set> //#include<iterator> #include<cmath> //#include<queue> //#include<time.h> //#include<string.h> //#include<fstream> //#include<sstream> #include<algorithm> using namespace std; #define REP( x,y ) for( int x=0; x<(y); x++ ) #define FORD( x,y,z ) for( int x=y; x>=(z); x-- ) #define FOR(x,b,e) for( int x = b; x <= (e); ++x ) #define SIZE(v) (int)v.size() #define ALL(c) c.begin(),c.end() #define VAR(v,n) __typeof(n) v=(n) #define FOREACH(i,c) for( VAR(i,c.begin());i!=c.end();++i ) #define PB push_back #define MP make_pair #define ST first #define ND second #define WRITE( V ){ FOREACH(it,V) cout << *it << ", "; cout << endl; } #define WRITE_ALL(V,s,t) { cout << s << endl; REP( i,SIZE(V) ){ cout << i+1 << " ---- "; FOREACH(it,V[i]) cout << *it+t << ", "; cout << endl; } } #define WRP(p) p.ST << " " << p.ND #define CLEAR( dst,quant ) memset( dst,0, (quant)*sizeof( __typeof(*dst) ) ); #define WAR if( show_help ) #define ENDL(x) REP(crow,(x)) cout << endl; const bool show_help = 1; const int INF = 1000000001; int N,M,K,a,b,c,y,t,w,l_zest; const long double EPS = 1e-11; typedef vector<double> VD; typedef pair<double,int> PDI; typedef pair<double, double> PDD; typedef vector<bool> VB; typedef vector<int> VI; typedef vector< VI > VVI; typedef pair<int,int> PII; typedef long long LL; typedef pair<LL,LL> PLL; typedef vector<LL> VLL; typedef vector<VLL> VVLL; typedef vector<PII> VPII; int nodes, myinst; // ilosc wierzcholkow oraz numer mojej instancji void solveSmall(){ VI V; int beg = FirstNeighbor(1); V.PB(1); V.PB(beg); while( V[ SIZE(V)-1 ] != V[0] ){ // po tym whilu powinienem miec wszystkich juz w wektorze V if( FirstNeighbor( V[ SIZE(V)-1 ] ) != V[ SIZE(V)-2 ] ) V.PB( FirstNeighbor( V[ SIZE(V)-1 ] ) ); else V.PB( SecondNeighbor( V[ SIZE(V)-1 ] ) ); } V.pop_back(); // musze usunac ostatni element, bo to jest tak naprawde pierwszy(zerowy) element... VI poz(SIZE(V)); REP(i,SIZE(poz)) poz[ V[i]-1 ] = i; // osoba o numerze V[i] jest w V na miejscu i int M = NumberOfQueries(); int a,b,dist; FOR(i,1,M){ a = QueryFrom(i); b = QueryTo(i); dist = abs( poz[a-1] - poz[b-1] ); dist = min( dist, SIZE(V) - dist ); cout << dist << endl; } } int main(){ ios_base::sync_with_stdio(0); N = NumberOfStudents(); nodes = NumberOfNodes(); myinst = MyNodeId(); if( N <= 100000 ){ // dla malych danych moge to zrobic recznie, ale tylko w jednej, pierwszej instancji if( myinst == 0 ) solveSmall(); } else{ // dla wiekszych niech juz to bedzie rozproszone while(true); int m = myinst * N / nodes; // srodek mojego przedzialu int t = 0; // wskaznik rozchodzenia sie } return 0; } |