A - What month is it?
modの問題です。
ans = (x+y)\bmod{12}
が思い浮かびます。
ans = (x+y)\bmod{12} = 0
の時、
ans = ans + 12
考察が終わりましたね。
C++
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }
int main() {
int x, y;
cin >> x >> y;
int ans = (x+y)%12;
if(ans == 0) ans+=12;
cout << ans << endl;
return 0;
}
B - Most Minority
問題文
実装問題です。
0と1のどちらが多いか計測。
少ない方の人に加点をします。
最大の点数を探索します。
最大の点数で最も小さなindexの人が答えです。
C++
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }
int main() {
int n, m;
cin >> n >> m;
vector<string> s(n);
rep(i, n) cin >> s[i];
vector<int> ans(n);
rep(i, m){
int zero = 0, one = 0;
rep(j, n){
if(s[j][i] == '0') zero++;
else one++;
}
rep(j, n){
if(zero < one){
if(s[j][i] == '0') ans[j]++;
}else{
if(s[j][i] == '1') ans[j]++;
}
}
}
int p = 0;
rep(i, n){
p = max(p, ans[i]);
}
rep(i, n){
if(p == ans[i]) cout << i + 1 << ' ';
}
cout << endl;
return 0;
}
C - Sum of Min Query
前処理でsumを計算します。
C++
ll ans = 0;
rep(i, n){
ans += min(a[i], b[i]);
}
合計から更新前のmin(a_x_i, b_x_i)値を引きます。
合計へ更新後のmin(a_x_i, b_x_i)値を加算します。
C++
rep(i, q){
ans -= min(a[x[i]-1], b[x[i]-1]);
if(c[i] == 'A'){
a[x[i]-1] = v[i];
}else if(c[i] == 'B'){
b[x[i]-1] = v[i];
}
ans += min(a[x[i]-1], b[x[i]-1]);
cout << ans << endl;
}
考察が終わりました。
C++
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }
int main() {
ll n, q;
cin >> n >> q;
vector<ll> a(n), b(n);
rep(i, n) cin >> a[i];
rep(i, n) cin >> b[i];
vector<char> c(q);
vector<ll> x(q), v(q);
rep(i, q) cin >> c[i] >> x[i] >> v[i];
ll ans = 0;
rep(i, n){
ans += min(a[i], b[i]);
}
rep(i, q){
ans -= min(a[x[i]-1], b[x[i]-1]);
if(c[i] == 'A'){
a[x[i]-1] = v[i];
}else if(c[i] == 'B'){
b[x[i]-1] = v[i];
}
ans += min(a[x[i]-1], b[x[i]-1]);
cout << ans << endl;
}
return 0;
}
D - Toggle Maze
頂点倍化というテクニックが必要な問題です。
bfs, ダイクストラなどに使用される典型です。
スイッチの開閉を考慮すると2, h, wの3次元配列のbfsで解くことができます。
C++
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};
int INF = 1e9;
int main() {
int h, w;
cin >> h >> w;
vector<string> a(h);
rep(i, h) cin >> a[i];
P st, gl;
rep(i, h){
rep(j, w){
if(a[i][j] == 'S'){
st.first = i;
st.second = j;
}
if(a[i][j] == 'G'){
gl.first = i;
gl.second = j;
}
}
}
queue<tuple<int, int, int>> que;
que.emplace(0, st.first, st.second);
vector<vector<vector<int>>> graph(2, vector<vector<int>>(h, vector<int>(w, INF)));
graph[0][st.first][st.second] = 0;
while(que.size()){
auto [c, y, x] = que.front();
que.pop();
int cc = c;
if(a[y][x] == '?') cc = 1 ^ c;
for(int i=0; i<4; i++){
int xx = dx[i] + x;
int yy = dy[i] + y;
if(xx < 0 || w <= xx || yy < 0 || h <= yy) continue;
if(graph[cc][yy][xx] != INF) continue;
if(a[yy][xx] == '#') continue;
if(a[yy][xx] == 'o' && cc == 1) continue;
if(a[yy][xx] == 'x' && cc == 0) continue;
graph[cc][yy][xx] = graph[c][y][x] + 1;
que.emplace(cc, yy, xx);
}
}
int ans = min(graph[0][gl.first][gl.second], graph[1][gl.first][gl.second]);
if(ans == INF){
cout << -1 << endl;
}else{
cout << ans << endl;
}
return 0;
}