제출 #831772

#제출 시각아이디문제언어결과실행 시간메모리
831772NoName14159Two Transportations (JOI19_transportations)C++17
84 / 100
583 ms49316 KiB
#include "Azer.h" #include <stdlib.h> #include <cassert> #include <queue> #define MAXN 2007 #define MAXM 500007 #define vi std::vector<int> #define pii std::pair<int,int> #define vpii std::vector<pii> #define pqpii std::priority_queue<pii,vpii,std::greater<pii>> #define LOOP(I,X) for(int I=0;I<X;I++) #define pub push_back namespace{ enum Mode{ CL, // choose leader RE, // recommend edge DW, // determine winner SR, // send relax RX // relax }; Mode mode; bool leader; bool winner; int n; int dis[MAXN]; bool visited[MAXN]={}; vpii e[MAXN]; pqpii pq; pii rec; int rec_other; int relax_w=0; int relax_v; bool buf[58007]; int buf_size=0; int buf_now=0; int t=0; int bits_next; //int cnt=0; int Read(int bits){ int ans=0; LOOP(i,bits){ ans<<=1; ans|=(int)buf[buf_now+i]; } buf_now+=bits; return ans; } void Send(int bits,int x){ LOOP(i,bits){ //cnt++; //assert(buf_size+cnt<=58000); SendA((bool)((x>>(bits-1-i))&1)); } } void Do(){ while(t<n-1){ if(mode==CL){ mode=RE; if(leader){ bool new_leader=true;//(bool)(std::rand()%2); Send(1,(int)new_leader); assert((int)new_leader==0||(int)new_leader==1); if(new_leader){ leader=!leader; } }else{ bool new_leader=(bool)Read(1); if(new_leader){ leader=!leader; } } if(leader){ bits_next=9; return; } } if(mode==RE){ mode=DW; while(!pq.empty()){ pii x=pq.top(); if(!visited[x.second]){ break; } pq.pop(); } if(pq.empty()){ rec={511,-1}; }else{ rec=pq.top(); rec.first-=relax_w; } if(leader){ rec_other=Read(9); }else{ Send(9,rec.first); assert(rec.first>=0&&rec.first<=511); bits_next=1; return; } } if(mode==DW){ mode=SR; if(leader){ if(rec.first<=rec_other){ Send(1,1); winner=true; }else{ Send(1,0); winner=false; } }else{ winner=!(bool)Read(1); } if(!winner){ if(leader){ bits_next=11; }else{ bits_next=20; } return; } } if(mode==SR){ mode=RX; if(leader){ if(winner){ Send(11,rec.second); assert(rec.second>=0&&rec.second<n); relax_v=rec.second; Send(9,rec.first); assert(rec.first>=0&&rec.first<=500); relax_w+=rec.first; }else{ relax_v=Read(11); relax_w+=rec_other; } }else{ if(winner){ Send(11,rec.second); assert(rec.second>=0&&rec.second<n); relax_v=rec.second; relax_w+=rec.first; }else{ relax_v=Read(11); relax_w+=Read(9); } } } if(mode==RX){ mode=CL; dis[relax_v]=relax_w; visited[relax_v]=true; for(pii x:e[relax_v]){ if(!visited[x.first]){ pq.push({relax_w+x.second,x.first}); } } t++; if(!leader){ bits_next=1; return; } } } } } void InitA(int N,int A,vi U,vi V,vi C){ std::srand(7749); n=N; LOOP(i,A){ e[U[i]].pub({V[i],C[i]}); e[V[i]].pub({U[i],C[i]}); } dis[0]=0; visited[0]=true; for(pii x:e[0]){ pq.push({x.second,x.first}); } mode=CL; leader=true; Do(); } void ReceiveA(bool x){ buf[buf_size]=x; buf_size++; if(buf_size-buf_now==bits_next){ Do(); } } vi Answer(){ vi ans; LOOP(i,n){ ans.pub(dis[i]); } return ans; }
#include "Baijan.h" #include <stdlib.h> #include <cassert> #include <queue> #define MAXN 2007 #define MAXM 500007 #define vi std::vector<int> #define pii std::pair<int,int> #define vpii std::vector<pii> #define pqpii std::priority_queue<pii,vpii,std::greater<pii>> #define LOOP(I,X) for(int I=0;I<X;I++) #define pub push_back namespace{ enum Mode{ CL, // choose leader RE, // recommend edge DW, // determine winner SR, // send relax RX // relax }; Mode mode; bool leader; bool winner; int n; int dis[MAXN]; bool visited[MAXN]={}; vpii e[MAXN]; pqpii pq; pii rec; int rec_other; int relax_w=0; int relax_v; bool buf[58007]; int buf_size=0; int buf_now=0; int t=0; int bits_next; //int cnt=0; int Read(int bits){ int ans=0; LOOP(i,bits){ ans<<=1; ans|=(int)buf[buf_now+i]; } buf_now+=bits; return ans; } void Send(int bits,int x){ LOOP(i,bits){ //cnt++; //assert(buf_size+cnt<=58000); SendB((bool)((x>>(bits-1-i))&1)); } } void Do(){ while(t<n-1){ if(mode==CL){ mode=RE; if(leader){ bool new_leader=(bool)(std::rand()%2); Send(1,(int)new_leader); if(new_leader){ leader=!leader; } }else{ bool new_leader=(bool)Read(1); if(new_leader){ leader=!leader; } } if(leader){ bits_next=9; return; } } if(mode==RE){ mode=DW; while(!pq.empty()){ pii x=pq.top(); if(!visited[x.second]){ break; } pq.pop(); } if(pq.empty()){ rec={511,-1}; }else{ rec=pq.top(); rec.first-=relax_w; } if(leader){ rec_other=Read(9); }else{ Send(9,rec.first); bits_next=1; return; } } if(mode==DW){ mode=SR; if(leader){ if(rec.first<=rec_other){ Send(1,1); winner=true; }else{ Send(1,0); winner=false; } }else{ winner=!(bool)Read(1); } if(!winner){ if(leader){ bits_next=11; }else{ bits_next=20; } return; } } if(mode==SR){ mode=RX; if(leader){ if(winner){ Send(11,rec.second); relax_v=rec.second; Send(9,rec.first); relax_w+=rec.first; }else{ relax_v=Read(11); relax_w+=rec_other; } }else{ if(winner){ Send(11,rec.second); relax_v=rec.second; relax_w+=rec.first; }else{ relax_v=Read(11); relax_w+=Read(9); } } } if(mode==RX){ mode=CL; dis[relax_v]=relax_w; visited[relax_v]=true; for(pii x:e[relax_v]){ if(!visited[x.first]){ pq.push({relax_w+x.second,x.first}); } } t++; if(!leader){ bits_next=1; return; } } } } } void InitB(int N,int B,vi S,vi T,vi D){ std::srand(7749); n=N; LOOP(i,B){ e[S[i]].pub({T[i],D[i]}); e[T[i]].pub({S[i],D[i]}); } dis[0]=0; visited[0]=true; for(pii x:e[0]){ pq.push({x.second,x.first}); } mode=CL; leader=false; bits_next=1; } void ReceiveB(bool x){ buf[buf_size]=x; buf_size++; if(buf_size-buf_now==bits_next){ Do(); } }
#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...