AtCoder Beginner Contest 143

はい. AtCoder Beginner Contest 143 です

今回は参加が遅れて,1時間以上経っていたので参加見送りました. 22:40 なった瞬間に解き始めました.

D までサクサク解けたので参加したかったです(:3」∠) 参加してたら多分 4完でした.


A - Curtain

問題文

長さ  A のカーテンが2枚あって  B の窓をどれくらい隠せるかという問題.
基本的には引くだけで,負数になる場合は0にする必要があります.
max 取れば終わりです.

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
  int a,b;
  cin >> a >> b;
  cout << max(0, a - 2*b);
}



B - TAKOYAKI FESTIVAL 2019

問題文

 N が 50以下なので, \mathcal{O}(N ^ 2)(2重for文) で愚直に書いても通りそうですが,
どうしても  \mathcal{O}(N) にしたかったです.(しました)

#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>

using namespace std;

int main() {
  int n;
  int ans = 0;
  cin >> n;
  vector<int> d(n);
  for (int i=0; i<n; i++) cin >> d[i];

  int sum = accumulate(d.begin(), d.end(), 0);
  for (int i=0; i<n; i++) {
    ans += (sum-=d[i])*d[i];
  }

  cout << ans << endl;
}



C - Slimes

問題文

B より簡単なのでは…?
文字が切り替わる所を数えれば良いです.

最近,c=s[i], ans++ みたいな記法を知ったので使ってみました.

#include <iostream>
#include <vector>
#include <utility>
#include <map>
#include <algorithm>
#include <queue>
#include <cmath>

using namespace std;

int main() {
  int n;
  string s;
  cin >> n >> s;
  int ans = 0;
  char c = ' ';
  for (int i=0; i<n; i++) {
    if (c != s[i]) c=s[i],ans++;
  }

  cout << ans << endl;
}



D - Disjoint Set of Common Divisors

問題文

ソートしておいて,大きい方から処理します.
2つのペアの差よりも小さいものは三角形になり得ないので,そこまでに含まれる個数を数えればOKです.

a < b + c  
b < c + a  
c < a + b

式からもテキトーに求められますね…

#include <iostream>
#include <vector>
#include <utility>
#include <map>
#include <algorithm>
#include <queue>
#include <cmath>

using namespace std;

int main() {
  int n;
  cin >> n;
  vector<int> l(n);
  for (int i=0; i<n; i++) cin>>l[i];
  sort(l.begin(),l.end());
  // for (auto i:l)cout<<i<<" ";cout<<endl;

  int ans = 0;
  for (int i=n-1; i>=0; i--) {
    for (int j=i-1; j>=0; j--) {
      auto it = upper_bound(l.begin(),l.end(), l[i]-l[j]);
      ans += max(0, (int)((l.begin()+j) - it));
    }
  }
  cout << ans << endl;
}



まとめ

出てたらパフォーマンス悪くなかったんじゃないかなぁ…
次の ABC144 頑張ります!