【Atcoder训练记录】AtCoder Beginner Contest 378
训练情况
赛后反思
简单题又WA了一发,淦,开局崩心态,然后做题的时候被场外因素打断了。
A题
统计 \([1,4]\) 中每个数字出现的个数,输出对数即可。
#include <bits/stdc++.h>
#define int long long
using namespace std;
int cnt[5];
void solve(){
for(int i = 1;i<=4;i++){
int x; cin>>x;
cnt[x]++;
}
cout<<cnt[1]/2+cnt[2]/2+cnt[3]/2+cnt[4]/2<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
B题
找大于 \(d\) 的 \(x\),使得 \(x \mod q_t=r_t\),我们分类讨论 \(d \mod q_t \le r_t\) 时,答案就是 \(d\) 加上多出来模数的那一部分,\(d \mod q_t \le r_t\) 时,就需要跳到倍数的下一段。
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int n; cin>>n;
vector<int> r(n + 1),q(n + 1);
for(int i = 1;i<=n;i++) cin>>q[i]>>r[i];
int qq; cin>>qq;
while(qq--){
int t,d; cin>>t>>d;
int res = d%q[t];
if(d%q[t] <= r[t]) cout<<d+(r[t]-res)<<endl;
else cout<<d+(q[t]-res)+(r[t]%q[t])<<endl;
}
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
C题
什么时候 ABC 的 C 题白送了,我们维护一个 \(last_i\) 表示最后一次数字 \(i\) 出现的位置,直接 \(O(n)\) 即可,没更新过的就是 \(-1\),更新过的直接输出。
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int n; cin>>n;
vector<int> a(n + 1);
for(int i = 1;i<=n;i++) cin>>a[i];
map<int,int> last;
for(int i = 1;i<=n;i++){
if(!last[a[i]]) cout<<-1<<" ",last[a[i]] = i;
else cout<<last[a[i]]<<" ",last[a[i]] = i;
}
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
D题
从某一点出发,刚好走 \(m\) 次,我们直接 \(O(nm)\) 找空闲位置,直接大力深度优先搜索(DFS),维护一个当前位置和步数,开一个 vis 记录某点是否走过,去掉重复走过的路径,然后回溯,满足 \(=k\) 答案就加。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 17;
int n,m,k;
vector<string> s(N);
bool vis[N][N];
struct node{
int x,y;
};
int u[4][2] = {{0,1},{1,0},{-1,0},{0,-1}};
int cnt = 0;
int ans = 0;
void dfs(int x,int y,int step){
if(step==k){
ans++;
return;
}
for(int i = 0;i<4;i++){
int xx = x + u[i][0];
int yy = y + u[i][1];
if(xx < 0 || yy < 0 || xx > n-1 || yy > m-1 || s[xx][yy] == '#' || vis[xx][yy]) continue;
vis[xx][yy] = 1;
dfs(xx,yy,step+1);
vis[xx][yy] = 0;
}
}
void solve(){
cin>>n>>m>>k;
for(int i = 0;i<n;i++) cin>>s[i];
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
if(s[i][j] == '.'){
vis[i][j] = 1;
dfs(i,j,0);
vis[i][j] = 0;
}
}
}
cout<<ans<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}