Submission #133979

#TimeUsernameProblemLanguageResultExecution timeMemory
133979BenqTwo Transportations (JOI19_transportations)C++14
100 / 100
1778 ms90024 KiB
#pragma GCC optimize ("O3") #pragma GCC target ("sse4") #include <bits/stdc++.h> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> #include <ext/rope> using namespace std; using namespace __gnu_pbds; using namespace __gnu_cxx; typedef long long ll; typedef long double ld; typedef complex<ld> cd; typedef pair<int, int> pi; typedef pair<ll,ll> pl; typedef pair<ld,ld> pd; typedef vector<int> vi; typedef vector<ld> vd; typedef vector<ll> vl; typedef vector<pi> vpi; typedef vector<pl> vpl; typedef vector<cd> vcd; template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>; #define FOR(i, a, b) for (int i = (a); i < (b); i++) #define F0R(i, a) for (int i = 0; i < (a); i++) #define FORd(i,a,b) for (int i = (b)-1; i >= (a); i--) #define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--) #define trav(a, x) for (auto& a : x) #define mp make_pair #define pb push_back #define f first #define s second #define lb lower_bound #define ub upper_bound #define sz(x) (int)x.size() #define beg(x) x.begin() #define en(x) x.end() #define all(x) beg(x), en(x) #define resz resize const int MOD = 1000000007; // 998244353 const ll INF = 1e18; const int MX = 2000; const ld PI = 4*atan((ld)1); template<class T> void ckmin(T &a, T b) { a = min(a, b); } template<class T> void ckmax(T &a, T b) { a = max(a, b); } template<class A, class B> A operator+=(A& l, const B& r) { return l = l+r; } template<class A, class B> A operator-=(A& l, const B& r) { return l = l-r; } template<class A, class B> A operator*=(A& l, const B& r) { return l = l*r; } template<class A, class B> A operator/=(A& l, const B& r) { return l = l/r; } #include "Azer.h" namespace { int N; vpi adj[MX]; // constant bool done[MX]; vi dist; // fill these vi turn; int lastDist = 0, cturn = 0, step; int BES; pi bes; void genBes() { bes = {MOD,MOD}; F0R(i,N) if (!done[i]) ckmin(bes,{dist[i],i}); BES = min(511,bes.f-lastDist); } int received = 0, bits = 0; void process(bool t) { received = 2*received+t; bits ++; } void sendInt(int bits, int x) { if (x >= (1<<bits)) { cerr << "ERROR " << bits << " " << x << " " << step << endl; assert(x<(1<<bits)); } F0Rd(i,bits) SendA((x>>i)&1); } void run0() { genBes(); sendInt(9,BES); step = 2; } void goNext() { // cerr << "AA " << cturn << " " << bes.f << " " << bes.s << endl; done[bes.s] = 1; dist[bes.s] = bes.f; trav(i,adj[bes.s]) ckmin(dist[i.f],bes.f+i.s); lastDist = bes.f; cturn ++; if (cturn == sz(turn)) return; // cerr << "AA " << turn[cturn] << endl; if (turn[cturn] == 0) run0(); else step = 1; } void run1(bool t) { process(t); if (bits == 9) { int r = received; received = bits = 0; genBes(); if (r > BES) { SendA(0); sendInt(9,BES); sendInt(11,bes.s); goNext(); } else { bes.f = r+lastDist; SendA(1); step = 3; } } } bool receiving = 0; vi v; void run2(bool t) { if (!receiving) { if (t == 0) receiving = true; else { sendInt(11,bes.s); goNext(); } return; } process(t); if (sz(v) == 0) { if (bits == 9) { v.pb(received); received = bits = 0; } } else { if (bits == 11) { v.pb(received); received = bits = receiving = 0; bes = {lastDist+v[0],v[1]}; v.clear(); goNext(); } } } void run3(bool t) { process(t); if (bits == 11) { bes.s = received; received = bits = 0; goNext(); } } } // namespace void ReceiveA(bool t) { // cerr << "HA Azer " << t << " " << cturn << " " << step << endl; switch (step) { case 1: run1(t); break; case 2: run2(t); break; case 3: run3(t); break; default: exit(5); } } void InitA(int _N, int A, vi U, vi V, vi C) { N = _N; F0R(i,A) { adj[U[i]].pb({V[i],C[i]}); adj[V[i]].pb({U[i],C[i]}); } dist.resz(N); F0R(i,N) dist[i] = MOD; srand(5); F0R(i,N) turn.pb(rand()&1); bes = {0,0}; goNext(); } vi Answer() { return dist; }
#pragma GCC optimize ("O3") #pragma GCC target ("sse4") #include <bits/stdc++.h> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> #include <ext/rope> using namespace std; using namespace __gnu_pbds; using namespace __gnu_cxx; typedef long long ll; typedef long double ld; typedef complex<ld> cd; typedef pair<int, int> pi; typedef pair<ll,ll> pl; typedef pair<ld,ld> pd; typedef vector<int> vi; typedef vector<ld> vd; typedef vector<ll> vl; typedef vector<pi> vpi; typedef vector<pl> vpl; typedef vector<cd> vcd; template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>; #define FOR(i, a, b) for (int i = (a); i < (b); i++) #define F0R(i, a) for (int i = 0; i < (a); i++) #define FORd(i,a,b) for (int i = (b)-1; i >= (a); i--) #define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--) #define trav(a, x) for (auto& a : x) #define mp make_pair #define pb push_back #define f first #define s second #define lb lower_bound #define ub upper_bound #define sz(x) (int)x.size() #define beg(x) x.begin() #define en(x) x.end() #define all(x) beg(x), en(x) #define resz resize const int MOD = 1000000007; // 998244353 const ll INF = 1e18; const int MX = 100001; const ld PI = 4*atan((ld)1); template<class T> void ckmin(T &a, T b) { a = min(a, b); } template<class T> void ckmax(T &a, T b) { a = max(a, b); } template<class A, class B> A operator+=(A& l, const B& r) { return l = l+r; } template<class A, class B> A operator-=(A& l, const B& r) { return l = l-r; } template<class A, class B> A operator*=(A& l, const B& r) { return l = l*r; } template<class A, class B> A operator/=(A& l, const B& r) { return l = l/r; } #include "Baijan.h" namespace { int N; vpi adj[MX]; // constant bool done[MX]; vi dist; // fill these vi turn; int lastDist = 0, cturn = 0, step; int BES; pi bes; void genBes() { bes = {MOD,MOD}; F0R(i,N) if (!done[i]) ckmin(bes,{dist[i],i}); BES = min(511,bes.f-lastDist); } int received = 0, bits = 0; void process(bool t) { received = 2*received+t; bits ++; } void sendInt(int bits, int x) { assert(x<(1<<bits)); F0Rd(i,bits) SendB((x>>i)&1); } void run0() { genBes(); sendInt(9,BES); step = 2; } void goNext() { // cerr << "BB " << cturn << " " << bes.f << " " << bes.s << endl; done[bes.s] = 1; dist[bes.s] = bes.f; trav(i,adj[bes.s]) ckmin(dist[i.f],bes.f+i.s); lastDist = bes.f; cturn ++; if (cturn == sz(turn)) return; // cerr << "BB " << turn[cturn] << endl; if (turn[cturn] == 1) run0(); else step = 1; } void run1(bool t) { process(t); if (bits == 9) { int r = received; received = bits = 0; genBes(); if (r > BES) { SendB(0); sendInt(9,BES); sendInt(11,bes.s); goNext(); } else { bes.f = r+lastDist; SendB(1); step = 3; } } } bool receiving = 0; vi v; void run2(bool t) { if (!receiving) { if (t == 0) receiving = true; else { sendInt(11,bes.s); goNext(); } return; } process(t); if (sz(v) == 0) { if (bits == 9) { v.pb(received); received = bits = 0; } } else { if (bits == 11) { v.pb(received); received = bits = receiving = 0; bes = {lastDist+v[0],v[1]}; v.clear(); goNext(); } } } void run3(bool t) { process(t); if (bits == 11) { bes.s = received; received = bits = 0; goNext(); } } } // namespace void ReceiveB(bool t) { // cerr << "HA Baijan " << t << " " << cturn << " " << step << endl; switch (step) { case 1: run1(t); break; case 2: run2(t); break; case 3: run3(t); break; default: exit(5); } } void InitB(int _N, int A, vi U, vi V, vi C) { N = _N; F0R(i,A) { adj[U[i]].pb({V[i],C[i]}); adj[V[i]].pb({U[i],C[i]}); } dist.resz(N); F0R(i,N) dist[i] = MOD; srand(5); F0R(i,N) turn.pb(rand()&1); bes = {0,0}; goNext(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...