AtCoder Beginner Contest 298
A - Job Interview
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
string s;
cin >> n >> s;
if( s.find("x") != -1 ){
printf("No\n");
}else if( s.find("o") == -1 ){
printf("No\n");
}else printf("Yes\n");
return 0;
}
B - Coloring Matrix
旋转三次然后暴力比较
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int a[N][N] , b[N][N] , c[N][N];
int main(){
int n;
cin >> n;
for( int i = 1 ; i <= n ; i ++ )
for( int j = 1 ; j <= n ; j ++ )
cin >> a[i][j];
for( int i = 1 ; i <= n ; i ++ )
for( int j = 1 ; j <= n ; j ++ )
cin >> b[i][j];
for( int k = 4 ; k ; k -- ){
bool f = true;
for( int i = 1 ; f && i <= n ; i ++ ){
for( int j = 1 ; f && j <= n ; j ++ ){
if( a[i][j] == 1 && b[i][j] != 1 ) f = false;
}
}
if( f ) return printf("Yes\n") , 0;
for( int i = 1 ; i <= n ; i ++ )
for( int j = 1 ; j <= n ; j ++ )
c[n+1-j][i] = a[i][j];
for( int i = 1 ; i <= n ; i ++ )
for( int j = 1 ; j <= n ; j ++ )
a[i][j] = c[i][j];
}
printf("No\n");
return 0;
}
C - Cards Query Problem
整两个set
数组维护一下就好了,注意 box 中的 card 要用 multiset
维护,因为会重复
#include <bits/stdc++.h>
using namespace std;
int read(){
int ch = getchar() , x = 0;
while( ch < '0' || ch > '9' ) ch = getchar();
while( ch >= '0' && ch <= '9' ) x = (x<<3)+(x<<1) + ch - '0' , ch = getchar();
return x;
}
const int N = 2e5+5;
int n;
multiset<int> box[N];
set<int> card[N];
int main(){
int n = read() , q = read();
for( int op , x , y ; q ; q -- ){
op = read();
if( op == 1 ){
x = read() , y = read();
box[y].insert(x) , card[x].insert(y);
}else{
x = read();
if( op == 2 ){
for( auto i : box[x] ) printf("%d " , i );
}else{
for( auto i : card[x] ) printf("%d " , i );
}
printf("\n");
}
}
}
D - Writing a Numeral
其实只要知道每个数被乘十了多少次就很好算了
#include <bits/stdc++.h>
using namespace std;
#define int long long
int read(){
int ch = getchar() , x = 0;
while( ch < '0' || ch > '9' ) ch = getchar();
while( ch >= '0' && ch <= '9' ) x = (x<<3)+(x<<1) + ch - '0' , ch = getchar();
return x;
}
const int mod = 998244353;
int power( int x , int y ){
int ans = 1;
while( y ){
if( y & 1 ) ans = ans * x % mod;
x = x * x % mod , y >>= 1;
}
return ans;
}
int32_t main(){
vector<int> dq;
int pos = 0;
dq.push_back(1);
int cnt = 1 , q = read();
for( int op , x ; q ; q -- ){
op = read();
if( op == 1 ){
x = read();
cnt = (cnt * 10 % mod + x) % mod;
dq.push_back(x);
}else if( op == 2 ){
x = dq[pos++];
x = mod - x * power( 10 , dq.size() - pos ) % mod;
cnt = ( cnt + x ) % mod;
}else printf("%lld\n" , cnt);
}
}
F - Rook Score
首先用map
统计一下每一行每一列的和。然后考虑枚举(r,c)
。这里可以分成两类情况。
第一种(r,c)
位置上的值不是 0,此时枚举所有的点就好。
第二种(r,)
位置上的值是 0 ,首先把所有的行列都取出来按照和从大到小排序。然后枚举行行列,如果找到了(r,c)
不存在的情况就更新答案并 break,因为已经排序后面找到一定更小。
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
int read() {
int x = 0, f = 1, ch = getchar();
while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
if (ch == '-') f = -1, ch = getchar();
while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
return x * f;
}
int32_t main() {
int n = read();
map<int, int> cntR, cntC;
map<int, map<int, int>> val;
set<pair<int, int>> st;
for (int x, y, w; n; n--) {
x = read(), y = read(), w = read();
cntR[x] += w, cntC[y] += w, val[x][y] = w, st.emplace(x, y);
}
vector<pair<int, int>> r, c;
for (auto [k, v]: cntR) r.emplace_back(v, k);
for (auto [k, v]: cntC) c.emplace_back(v, k);
sort(r.begin(), r.end(), greater<pair<int, int>>());
sort(c.begin(), c.end(), greater<pair<int, int>>());
int res = 0;
for (auto [x, y]: st)
res = max(res, cntR[x] + cntC[y] - val[x][y] );
for( auto [ v1 , x ] : r )
for( auto [ v2 , y ] : c ){
if( st.count(make_pair(x,y) ) ) continue;
res = max( res , v1 + v2 );
break;
}
cout << res << "\n";
return 0;
}