训练情况
赛后反思
简单题又WA了一发,淦,开局崩心态,然后做题的时候被场外因素打断了。
A题
统计 \([1,4]\) 中每个数字出现的个数,输出对数即可。
#include <bits/stdc++.h>
#define int long longusing 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 longusing 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 longusing 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 longusing 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;
}