AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
私のアカウント
解いた問題
本日解いた問題
C - Chinese Restaurant
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353
int main() {
ll n;
cin >> n;
vector<ll> p(n);
rep(i, n) cin >> p[i];
vector<ll> cnt(n);
for(int i = 0; i < n; i++) {
for(int j = 0; j < 3; j++){
cnt[(p[i]-1-i+j+n)%n]++;
}
}
ll res = 0;
for(int i = 0; i < n; i++){
res = max(res, cnt[i]);
}
cout << res << endl;
}
解法
人0,1,...N-1
についてC0,C1,...,CN
を求める。
C - Submask
C - Submask
解答
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353
int main() {
ll n;
cin >> n;
vector<ll> res = {0};
for(ll s = n; s > 0; s=(s-1)&n){
res.push_back(s);
}
sort(res.begin(),res.end());
for(auto x:res) cout << x << endl;
}
解法
for (int S = N; S; S = (S - 1) & N)
によるfor文を使うことで部分集合を求めることができる。