寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

AtCoder Programming Guide for beginners (APG4b) #3.02 ~ 3.06 in C++

AtCoder Programming Guide for beginners (APG4b)から、「第3章 競技プログラミングに役立つ知識」の提出コードの解答例です。
AtCoderとは、コンテストを通じて、プログラミングやアルゴリズムを学習するサービスです。
atcoder.jp
プログラミングコンテストとは、「与えられた問題をいかに素早く、正確に」解くことができるかを競うものです。
競技プログラミング」を略して、「競プロ」などと呼ばれています。

AtCoder Programming Guide for beginners (APG4b)
atcoder.jp

僕が作成、提出したコードは、以下のとおりです。

/*
AtCoder Programming Guide for beginners (APG4b) in C++
#EX22. 3.02 - 2つ目の値でソート
https://atcoder.jp/contests/APG4b/tasks/APG4b_ca
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
  int n;
  cin>>n;
  vector<int> a(n),b(n),c(n);
  for(int i=0;i<n;i++){
    cin>>a[i]>>b[i];
    c[i]=b[i];
  }
  sort(c.begin(),c.end());
  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
      if(c[i]==b[j]){
        cout<<a[j]<<" "<<b[j]<<endl;
      }
    }
  }
  return 0;
}
/*
AtCoder Programming Guide for beginners (APG4b) in C++
#EX23. 3.03 - 最頻値
https://atcoder.jp/contests/APG4b/tasks/APG4b_bz
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
  int n,ans0=0,ans1=0;
  cin>>n;
  vector<int> a(n);
  for(int i=0;i<n;i++){
    cin>>a[i];
  }
  map<int,int> mp;
  for(int i : a){
    if(mp.count(i)){
      mp[i]+=1;
    }else{
      mp[i]=1;
    }
  }
  for(int i : a){
    if(ans1<mp[i]){
      ans1=mp[i];
      ans0=i;
    }
  }
  cout<<ans0<<" "<<ans1<<endl;
  return 0;
}
/*
AtCoder Programming Guide for beginners (APG4b) in C++
#EX24. 3.04 - 時計の実装
https://atcoder.jp/contests/APG4b/tasks/APG4b_by
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
struct Clock{
  int hour,minute,second;
  void set(int h,int m,int s){
    hour=h;
    minute=m;
    second=s;
  }
  string to_str(void){
    string HH,MM,SS;
    if(hour<10){
      HH+="0";
    }
    if(minute<10){
      MM+="0";
    }
    if(second<10){
      SS+="0";
    }
    HH+=to_string(hour);
    MM+=to_string(minute);
    SS+=to_string(second);
    return HH+":"+MM+":"+SS;
  }
  void shift(int diff_second){
    int sec;
    sec=3600*hour+60*minute+second+diff_second;
    if(sec>=0){
      sec%=86400;
      hour=sec/3600;
      minute=(sec-3600*hour)/60;
      second=sec-3600*hour-60*minute;
    }else{
      while(sec<0){
        sec+=86400;
      }
      hour=sec/3600;
      minute=(sec-3600*hour)/60;
      second=sec-3600*hour-60*minute;
    }
  }
};
int main(void){
  int hour,minute,second,diff_second;
  cin>>hour>>minute>>second>>diff_second;
  Clock c;
  c.set(hour,minute,second);
  cout<<c.to_str()<<endl;
  c.shift(diff_second);
  cout<<c.to_str()<<endl;
}
/*
AtCoder Programming Guide for beginners (APG4b) in C++
#EX25. 3.05 - 集合の操作
https://atcoder.jp/contests/APG4b/tasks/APG4b_bx
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
bitset<50> intersection(bitset<50> A,bitset<50> B){
  return A&B;
}
bitset<50> union_set(bitset<50> A, bitset<50> B){
  return A|B;
}
bitset<50> symmetric_diff(bitset<50> A, bitset<50> B){
  return A^B;
}
bitset<50> subtract(bitset<50> A, int x){
  return A.set(x,0);
}
bitset<50> increment(bitset<50> A){
  if(A.test(49)){
    return (A<<1).set(0);
  }
  return A<<1;
}
bitset<50> decrement(bitset<50> A){
  if(A.test(0)){
    return (A>>1).set(49);
  }
  return A>>1;
}
bitset<50> add(bitset<50> S,int x){
  S.set(x,1);
  return S;
}
void print_set(bitset<50> S){
  vector<int> cont;
  for(int i=0;i<50;i++){
    if(S.test(i)){
      cont.push_back(i);
    }
  }
  for(int i=0;i<cont.size();i++){
    if(i>0){
      cout<<" ";
    }
    cout<<cont[i];
  }
  cout<<endl;
}
int main(void){
  bitset<50> A,B;
  int N;
  cin>>N;
  for(int i=0;i<N;i++){
    int x;
    cin>>x;
    A=add(A,x);
  }
  int M;
  cin>>M;
  for(int i=0;i<M;i++){
    int x;
    cin>>x;
    B=add(B,x);
  }
  string com;
  cin>>com;
  if(com=="intersection"){
    print_set(intersection(A,B));
  }else if(com=="union_set"){
    print_set(union_set(A,B));
  }else if(com=="symmetric_diff"){
    print_set(symmetric_diff(A,B));
  }else if(com=="subtract"){
    int x;
    cin>>x;
    print_set(subtract(A,x));
  }else if(com=="increment"){
    print_set(increment(A));
  }else if(com=="decrement"){
    print_set(decrement(A));
  }
  return 0;
}
/*
AtCoder Programming Guide for beginners (APG4b) in C++
#EX26. 3.06 - 電卓を作ろう3
https://atcoder.jp/contests/APG4b/tasks/APG4b_bw
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
inline void print_vec(vector<int> vec){
  cout<<"[ ";
  for(int i=0;i<vec.size();i++){
    cout<<vec[i]<<" ";
  }
  cout<<"]"<<endl;
}
string read_name(void){
  string x,y;
  cin>>x>>y;
  return x;
}
int read_int(map<string,int> &var_int){
  string num;
  cin>>num;
  return isdigit(num[0]) ? stoi(num) : var_int[num];
}
int calc_int(map<string,int> &var_int){
  string sym="";
  int result=0;
  while(sym!=";"){
    int val=read_int(var_int);
    if(sym==""){
      result=val;
    }
    if(sym=="+"){
      result+=val;
    }
    if(sym=="-"){
      result-=val;
    }
    cin>>sym;
  }
  return result;
}
vector<int> read_vec_val(map<string,int> &var_int){
  vector<int> vec;
  string sym="";
  while(sym!="]"){
    int val=read_int(var_int);
    vec.push_back(val);
    cin>>sym;
  }
  return vec;
}
vector<int> read_vec(map<string,int> &var_int , map<string,vector<int>> &var_vec){
  string val;
  cin>>val;
  return val=="[" ? read_vec_val(var_int) : var_vec.at(val);
}
vector<int> calc_vec(map<string,int> &var_int , map<string,vector<int>> &var_vec){
  string sym;
  vector<int> result;
  while(sym!=";"){
    vector<int> vec=read_vec(var_int,var_vec);
    if(sym==""){
      result=vec;
    }
    if(sym=="+"){
      for(int i=0;i<result.size();i++){
        result[i]+=vec[i];
      }
    }
    if(sym=="-"){
      for(int i=0;i<result.size();i++){
        result[i]-=vec[i];
      }
    }
    cin>>sym;
  }
  return result;
}
int main(void){
  int n;
  cin>>n;
  map<string,int> var_int;
  map<string,vector<int>> var_vec;
  for(int i=0;i<n;i++){
    string s;
    cin>>s;
    if(s=="int"){
      string name=read_name();
      var_int[name]=calc_int(var_int);
    }
    if(s=="vec"){
      string name=read_name();
      var_vec[name]=calc_vec(var_int,var_vec);
    }
    if(s=="print_int"){
      cout<<calc_int(var_int)<<endl;
    }
    if(s=="print_vec"){
      print_vec(calc_vec(var_int,var_vec));
    }
  }
  return 0;
}

AtCoder Beginner Contestは、オンラインジャッジによるプログラミングコンテストです。
日本語と英語に対応していて、週末ごとに実施されているみたいです。
https://practice.contest.atcoder.jp/tutorial
アカウントを登録すれば、誰でも参加できます。