GCJãã³ãã¬ã¼ã
ååæ¥è¨ãæ¸ããã¨ãããä¸åãç·´ç¿ããã¦ããªããã¨ã«æ°ã¥ããã
ããããããã«è¿«ã£ã¦ãã¦ããã¨ããã®ã«ã
ãããµã¹ã«è¡ã£ãã¨ãã¯
ã¡ãã«ãæã¡å¸°ã£ã¦ãã¾ãããªã©ã¨èé¢ããªãè¨ã£ã¦ãããã
ä»åã¯ã¨ã¦ããããªããä½ãæå¾
ã§ããªãã
ãããªã«ä½ãããã«åã¦ããããªããããªãã
ããã¯ããã¨ãã¦ã
Round2ã®ã¨ãã«ãã¥ã¢ã«ã³ã¢ã使ãã¦ãã°å¾ä¸åéã£ãã®ã«ãã¨æã£ã¦
Round3ã®ã¨ãã«æºåãããã³ãã¬ã¼ãã§ãå
¬éãã¦ã¿ããã¨ã«ããã
Round3ãçµãã£ãã¨ãã«ã¯ããã£ã±ãããã°ã©ã ã¯ãªã¼ãã¼ã ã
ã¨ãæã£ã¦æ±äº¬Local大ä¼ã«ã¯æã£ã¦ãããªãã£ãã®ã ãã
è¨ç®æ©ã®æ°ã¾ããã§éãã¨ãã綱渡ãã«ãªã£ã¦ãã¾ã£ãã®ã§ã
Finalã«ã¯ãã£ã±ãæã£ã¦ãããã¨æãã
ãã¾ã大ããªãã³ãã¬ã¼ãã¯ãã°ãå
¥ã£ã¦ãããæãããã
ã§ããã°é¿ãããã£ãæãªã®ã ãè´ãæ¹ããã¾ãã
#include <iostream> #include <sstream> #include <iomanip> #include <string> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <cctype> #include <pthread.h> using namespace std; //----- template <class T> class parallel_scheduler{ public: parallel_scheduler(int cpu_num):cpu_num(cpu_num){ T::init(); init(); } void go(){ string line;getline(cin,line); int cases=atoi(line.c_str()); for (int i=1;i<=cases;i++){ T *t=new T(); t->read(); while (running>=cpu_num) usleep(10*1000); schedule(i,t); } while(running>0) usleep(10*1000); } private: void init(){ running=0; next=1; pthread_mutex_init(&run_m,NULL); pthread_mutex_init(&ans_m,NULL); } void schedule(int cn,T *t){ pthread_mutex_lock(&run_m); running++; pthread_mutex_unlock(&run_m); pthread_t tid; pair<int,pair<T*,parallel_scheduler*> > *p= new pair<int,pair<T*,parallel_scheduler*> >(cn,make_pair(t,this)); pthread_create(&tid,NULL,start,p); pthread_detach(tid); } static void *start(void *arg){ pair<int,pair<T*,parallel_scheduler*> > *p= (pair<int,pair<T*,parallel_scheduler*> >*)arg; int cn=p->first; T *t=p->second.first; parallel_scheduler *ps=p->second.second; delete p; ostringstream oss; t->solve(oss); delete t; ps->register_ans(cn,oss.str()); ps->end(); return NULL; } void end(){ pthread_mutex_lock(&run_m); running--; pthread_mutex_unlock(&run_m); } void register_ans(int cn,const string &ans){ pthread_mutex_lock(&ans_m); anss.insert(make_pair(cn,ans)); while(anss.count(next)!=0){ cout<<"Case #"<<next<<": "<<anss[next]<<endl; anss.erase(next); next++; } pthread_mutex_unlock(&ans_m); } int cpu_num; int running; map<int,string> anss; int next; pthread_mutex_t run_m; pthread_mutex_t ans_m; }; template <class T> class sequential_scheduler{ public: sequential_scheduler(){ T::init(); } void go(){ string line;getline(cin,line); int cases=atoi(line.c_str()); for (int i=1;i<=cases;i++){ T *t=new T(); t->read(); ostringstream oss; t->solve(oss); delete t; cout<<"Case #"<<i<<": "<<oss.str()<<endl; } } }; //----- class solver; #define PARALLEL int main(int argc,char *argv[]) { #ifdef PARALLEL int cpu_num=2; if (argc==2) cpu_num=atoi(argv[1]); cerr<<"PAR: "<<cpu_num<<endl; parallel_scheduler<solver>(cpu_num).go(); #else cerr<<"SEQ:"<<endl; sequential_scheduler<solver>().go(); #endif return 0; } //----- class solver{ public: solver(){ // ãã¹ãã±ã¼ã¹ãã¨ã®åæåå¦ç } ~solver(){ // ãã¹ãã±ã¼ã¹ãã¨ã®çµäºå¦ç } static void init(){ // å ¨ä½ã®åæåå¦ç } void read(){ // ãã¹ãã±ã¼ã¹ãcinããèªã¿è¾¼ã } void solve(ostream &cout){ // 解ããåºåã¯å¼æ°ã®coutã«ã } };
ã¹ã¬ããæ°ã®æå®ã¨ãä¸ä¸ã®æã®ããã®èªæãªã³ã¼ãã«ããé次çãç¨æã
ãã¹ãã±ã¼ã¹ãèªã¿è¾¼ã¿ãªãããCPUãåã¾ã£ã¦ããªããã°ãã®ãã¹ãã±ã¼ã¹ãã¹ã±ã¸ã¥ã¼ã«ããã
åã¾ã£ã¦ããã©ããã空ãã¾ã§å¾
æ©ã
åºåã¯ãããã¡ãã¦ãå
é ããé ã«ç¢ºå®ã次第åºåã
ä¾å¤ã®ãã¨ã¨ãä½ãèãããã¦ããªããªãã ããããããã
ãã¦ãã©ã¤ãã©ãªãä½ãä½æ¥ãããã°â¦ã