google code jam 2019 round 1C all questions solutions
1. ROBOT PROGRAMMING STRATEGY: C++
#include <bits/stdc++.h>
#define FOR(i,a,b) for(ll i = (a); i < (ll)(b); i++)
#define REP(i,n) FOR(i,0,n)
#define YYS(x,arr) for(auto& x:arr)
#define PW(x) (1LL<<(x))
#define SZ(x) ((ll)(x).size())
#define pb emplace_back
#define fi first
#define se second
using namespace std;
using ld = long double;
using ll = long long int;
const ll INF = (ll)1e9 + 10;
const ll INFLL = (ll)1e18 + 10;
const ll MOD = 1e9+7;
template<class T> T &chmin( T &a , const T &b ){ return a = min(a,b); }
template<class T> T &chmax( T &a , const T &b ){ return a = max(a,b); }
template<class T> void UNIQUE(vector<T> &a){ a.erase(unique(a.begin(), a.end()), a.end()); }
template<class S, class T> ostream& operator << (ostream& os, const pair<S, T> v){
os << "(" << v.first << ", " << v.second << ")"; return os;
}
template<class T> ostream& operator << (ostream& os, const vector<T> v){
for(int i = 0; i < v.size(); i++){if(i > 0){os << " ";} os << v[i];} return os;
}
template<class T> ostream& operator << (ostream& os, const vector<vector<T>> v){
for(int i = 0; i < v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os;
}
ll in(){long long int x; assert(scanf("%lld", &x) == 1); return x;}
ld fin(){double x; assert(scanf("%lf", &x) == 1); return x;}
char yuyushiki[1000010]; string stin(){assert(scanf("%s", yuyushiki) == 1); return yuyushiki;}
// head
string solve(){
ll n = in();
vector<string> ss(n);
REP(i, n){
ss[i] = stin();
}
string ans = "";
vector<bool> live(n, true);
REP(q, INF){
ll r = 0;
ll s = 0;
ll p = 0;
REP(i, n){
if(live[i]){
char c = ss[i][q%SZ(ss[i])];
if(c == 'R'){
r = 1;
} else if(c == 'S'){
s = 1;
} else if(c == 'P'){
p = 1;
}
}
}
if(r + s + p == 0){
break;
}
if(r + s + p == 3){
return "IMPOSSIBLE";
}
if(r + s + p == 1){
if(r == 1){
ans += 'P';
} else if(s == 1){
ans += 'R';
} else if(p == 1){
ans += 'S';
}
return ans;
}
if(r + s + p == 2){
if(r == 0){
// s p
ans += 'S';
REP(i, n){
char c = ss[i][q%SZ(ss[i])];
if(c == 'P'){
live[i] = false;
}
}
} else if(s == 0){
// r p
ans += 'P';
REP(i, n){
char c = ss[i][q%SZ(ss[i])];
if(c == 'R'){
live[i] = false;
}
}
} else if(p == 0){
// r s
ans += 'R';
REP(i, n){
char c = ss[i][q%SZ(ss[i])];
if(c == 'S'){
live[i] = false;
}
}
}
}
}
return ans;
}
int main(){
ll t = in();
FOR(i, 1, t+1){
string ans = solve();
printf("Case #%lld: %s\n", i, ans.c_str());
}
return 0;
}
2. POWER ARRANGERS:C++
#include <bits/stdc++.h>
#define FOR(i,a,b) for(ll i = (a); i < (ll)(b); i++)
#define REP(i,n) FOR(i,0,n)
#define YYS(x,arr) for(auto& x:arr)
#define PW(x) (1LL<<(x))
#define SZ(x) ((ll)(x).size())
#define pb emplace_back
#define fi first
#define se second
using namespace std;
using ld = long double;
using ll = long long int;
const ll INF = (ll)1e9 + 10;
const ll INFLL = (ll)1e18 + 10;
const ll MOD = 1e9+7;
template<class T> T &chmin( T &a , const T &b ){ return a = min(a,b); }
template<class T> T &chmax( T &a , const T &b ){ return a = max(a,b); }
template<class T> void UNIQUE(vector<T> &a){ a.erase(unique(a.begin(), a.end()), a.end()); }
template<class S, class T> ostream& operator << (ostream& os, const pair<S, T> v){
os << "(" << v.first << ", " << v.second << ")"; return os;
}
template<class T> ostream& operator << (ostream& os, const vector<T> v){
for(int i = 0; i < v.size(); i++){if(i > 0){os << " ";} os << v[i];} return os;
}
template<class T> ostream& operator << (ostream& os, const vector<vector<T>> v){
for(int i = 0; i < v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os;
}
ll in(){long long int x; assert(scanf("%lld", &x) == 1); return x;}
ld fin(){double x; assert(scanf("%lf", &x) == 1); return x;}
char yuyushiki[1000010]; string stin(){assert(scanf("%s", yuyushiki) == 1); return yuyushiki;}
// head
ll t, f;
ll ask(ll a, ll b){
ll p = a * 5 + b + 1;
printf("%lld\n", p);
fflush(stdout);
string s = stin();
return s[0] - 'A';
}
void solve(){
vector<vector<ll>> a(119, vector<ll>(5, -1));
vector<bool> live(119, true);
vector<bool> used(5, false);
vector<ll> ans(5, -1);
ll al = 120;
REP(p, 5){
vector<ll> cnt(5, 0);
REP(i, 119){
if(live[i]){
ll res = ask(i, p);
a[i][p] = res;
cnt[res]++;
}
}
// cerr << cnt << " : " << al / (5 - p) - 1 << endl;
REP(i, 5){
if(!used[i] && cnt[i] == al / (5 - p) - 1){
ans[p] = i;
used[i] = true;
}
}
REP(i, 119){
if(a[i][p] != ans[p]){
live[i] = false;
}
}
al /= 5 - p;
}
// cerr << ans << endl;
REP(i, 5){
printf("%c", (char)(ans[i] + 'A'));
}
printf("\n");
fflush(stdout);
string s = stin();
if(s[0] == 'N'){
exit(0);
}
}
int main(){
t = in();
f = in();
REP(i, t){
solve();
}
return 0;
}
3. BACTERIAL TACTICS:CPP(c++)
#include <bits/stdc++.h>
#define FOR(i,a,b) for(ll i = (a); i < (ll)(b); i++)
#define REP(i,n) FOR(i,0,n)
#define YYS(x,arr) for(auto& x:arr)
#define PW(x) (1LL<<(x))
#define SZ(x) ((ll)(x).size())
#define pb emplace_back
#define fi first
#define se second
using namespace std;
using ld = long double;
using ll = long long int;
const ll INF = (ll)1e9 + 10;
const ll INFLL = (ll)1e18 + 10;
const ll MOD = 1e9+7;
template<class T> T &chmin( T &a , const T &b ){ return a = min(a,b); }
template<class T> T &chmax( T &a , const T &b ){ return a = max(a,b); }
template<class T> void UNIQUE(vector<T> &a){ a.erase(unique(a.begin(), a.end()), a.end()); }
template<class S, class T> ostream& operator << (ostream& os, const pair<S, T> v){
os << "(" << v.first << ", " << v.second << ")"; return os;
}
template<class T> ostream& operator << (ostream& os, const vector<T> v){
for(int i = 0; i < v.size(); i++){if(i > 0){os << " ";} os << v[i];} return os;
}
template<class T> ostream& operator << (ostream& os, const vector<vector<T>> v){
for(int i = 0; i < v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os;
}
ll in(){long long int x; assert(scanf("%lld", &x) == 1); return x;}
ld fin(){double x; assert(scanf("%lf", &x) == 1); return x;}
char yuyushiki[1000010]; string stin(){assert(scanf("%s", yuyushiki) == 1); return yuyushiki;}
// head
ll n, m;
vector<string> s;
ll memo[16][16][16][16];
ll dfs(ll t, ll l, ll b, ll r){
if(memo[t][l][b][r] != -1){
return memo[t][l][b][r];
}
vector<bool> nex(256, false);
FOR(i, t, b){
FOR(j, l, r){
if(s[i][j] == '.'){
// v
bool f = false;
FOR(k, t, b){
if(s[k][j] == '#'){
f = true;
}
}
if(!f){
ll res = dfs(t, l, b, j) ^ dfs(t, j+1, b, r);
nex[res] = true;
}
// h
f = false;
FOR(k, l, r){
if(s[i][k] == '#'){
f = true;
}
}
if(!f){
ll res = dfs(t, l, i, r) ^ dfs(i+1, l, b, r);
nex[res] = true;
}
}
}
}
REP(i, 256){
if(!nex[i]){
return memo[t][l][b][r] = i;
}
}
}
ll solve(){
n = in();
m = in();
s.assign(n, "");
REP(i, n){
s[i] = stin();
}
REP(i, 16){
REP(j, 16){
REP(k, 16){
REP(l, 16){
memo[i][j][k][l] = -1;
}
}
}
}
ll ans = 0;
ll t = 0, b = n;
ll l = 0, r = m;
FOR(i, t, b){
FOR(j, l, r){
if(s[i][j] == '.'){
// v
bool f = false;
FOR(k, t, b){
if(s[k][j] == '#'){
f = true;
}
}
if(!f){
ll res = dfs(t, l, b, j) ^ dfs(t, j+1, b, r);
if(res == 0){
ans++;
}
}
// h
f = false;
FOR(k, l, r){
if(s[i][k] == '#'){
f = true;
}
}
if(!f){
ll res = dfs(t, l, i, r) ^ dfs(i+1, l, b, r);
if(res == 0){
ans++;
}
}
}
}
}
return ans;
}
int main(){
ll t = in();
FOR(i, 1, t+1){
ll ans = solve();
printf("Case #%lld: %lld\n", i, ans);
}
return 0;
}
Comments