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;
}
- Beginner AtCoder Contest 298beginner atcoder contest 298 contest programming beginner atcoder beginner atcoder contest 296 beginner atcoder contest 295 beginner atcoder contest abcde beginner atcoder contest 335 beginner atcoder contest 332 beginner atcoder contest 328 beginner atcoder contest 315 beginner atcoder contest 334