365 字
1 分钟
AtCoder Beginner Contest 453复盘
比赛链接:https://atcoder.jp/contests/abc453
主要用于个人复盘
A - Trimo
语法题,我们找出第一个不是o的索引输出切片即可
n = int(input())s = input()if s.count('o') == n: print()else: idx = 0 for i in range(n): if s[i] != 'o': idx = i break print(s[idx:])B - Sensor Data Logging
模拟题,我们按照题目模拟即可
t,x = map(int,input().split())a = list(map(int,input().split()))ans = []for i in range(t+1): if i == 0: ans.append((i,a[i])) elif abs(a[i] - ans[-1][1]) >= x: ans.append((i,a[i]))for i in range(len(ans)): print(f"{ans[i][0]} {ans[i][1]}")C - Sneaking Glances
数据N最大只有20,我们通过枚举所有数选与不选的情况即可,这里用dfs实现
import sysinput = sys.stdin.readlinen = int(input())a = list(map(int,input().split()))ans = 0def dfs(step,sum,cur): global ans if sum + n - step <= ans: return if step == n: ans = max(ans,sum) return dfs(step + 1,sum + (cur > 0 and cur - a[step] < 0),cur - a[step]) dfs(step + 1,sum + (cur < 0 and cur + a[step] > 0),cur + a[step])dfs(0,0,0.5)print(ans)D - Go Straight
与我们平时搜索题不同,这是一道带状态的bfs,我们要记录每次移动的方向,遇到o只能跟前一次方向不同,遇到x不能与前一次方向不同,遇到#不能进入,注意这几个特判,我们然后用前驱数组pre[nx] [ny] [d],记录进入nx,ny的方向d,紧接着最后逆推即可
#include<bits/stdc++.h>using namespace std;#define int long long#define ld long double#define debug(x) cerr << #x << ": " << x << '\n';const int INF = 0x3f3f3f3f3f3f3f3f;int dx[] = {0,1,0,-1};int dy[] = {-1,0,1,0};char dc[] = {'L','D','R','U'};struct node{ int r,c,d;};//udlrbool vis[1005][1005][4];node pre[1005][1005][4];void solve(){ int h,w;cin>>h>>w; pair<int,int> b,e; vector<vector<char>> pos(h+1,vector<char>(w+1)); for(int i = 1;i <= h; ++i){ string s;cin>>s; for(int j = 1;j <= w; ++j){ pos[i][j] = s[j-1]; if(pos[i][j] == 'S') b.first = i,b.second = j; if(pos[i][j] == 'G') e.first = i,e.second = j; } } queue<node> q; q.push({b.first,b.second,-1}); int end = -1; while(q.size()){ auto [x,y,d] = q.front();q.pop(); if(x == e.first && y == e.second){ end = d; break; } for(int i = 0;i < 4; ++i){ int nx = x + dx[i],ny = y + dy[i]; if(nx < 1 || ny < 1 || nx > h || ny > w || vis[nx][ny][i] || pos[nx][ny] == '#') continue; if(d != -1){ if(pos[x][y] == 'x' && i == d) continue; if(pos[x][y] == 'o' && i != d) continue; } pre[nx][ny][i] = {x,y,d}; vis[nx][ny][i] = 1; q.push({nx,ny,i}); } } if(end == -1){ cout<<"No"; } else{ cout<<"Yes\n"; string ans; node cur = {e.first,e.second,end}; while(cur.d != -1){ ans += dc[cur.d]; cur = pre[cur.r][cur.c][cur.d]; } reverse(ans.begin(),ans.end()); for(auto i : ans) cout<<i; }}signed main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int t = 1; // cin>>t; while(t--){ solve(); }return 0;}E - Team Division
这是一道组合数加容斥原理加差分处理题
我们从1~n-1枚举a队人数,对能达到的情况求和,在这里我们要记录的就是当前必须进入a和当前必须进入b,以及他们的交集既能进入a又能进入b,我们根据容斥原理,如果cura+curb-curboth=n时,a队员数为i才成立,才可以计算,这种情况就是从both中选缺的a的人,缺的a的人qa=i - (n-curb),由组合数c(both,qa)计算累加即可
#include<bits/stdc++.h>using namespace std;#define int long longconst int INF = 0x3f3f3f3f3f3f3f3f;const int mod = 998244353;const int mx = 1e6+1000;int fac[mx+1],invfac[mx+1];int fastpow(int x,int p){ int ans = 1; while(p){ if(p & 1) ans = ans * x % mod; x = x * x % mod; p >>= 1; } return ans % mod;}int inv(int x){ return fastpow(x,mod - 2);}int c(int a,int b){ if (b < 0 || b > a) return 0; return fac[a] * invfac[b] % mod * invfac[a-b] % mod;}void init(){ fac[0] = 1; for(int i = 1;i <= mx; i++) fac[i] = fac[i-1] * i % mod; invfac[mx] = fastpow(fac[mx], mod - 2); for (int i = mx - 1; i >= 0; i--) invfac[i] = invfac[i + 1] * (i + 1) % mod;}//n-r,n-lvoid solve(){ int n;cin>>n; vector<int> diffa(n+5),diffb(n+5),diffboth(n+5); for(int i = 1;i <= n; ++i){ int l,r;cin>>l>>r; diffa[l]++; diffa[r+1]--; diffb[n-r]++; diffb[n-l+1]--; int mn = min(n - l ,r); int mx = max(l,n-r); if(mn < mx) continue; diffboth[mn+1]--; diffboth[mx]++; } int cura = 0,curb = 0,curboth = 0,ans = 0; for(int i = 1;i <= n - 1; ++i){ cura += diffa[i]; curb += diffb[i]; curboth += diffboth[i]; if(cura + curb - curboth == n){ int ma = n - curb; int ned = i - ma; ans = (ans + c(curboth,ned)) % mod; } } cout<<ans<<"\n";}signed main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int t = 1; init(); // cin>>t; while(t--){ solve(); }return 0;}部分信息可能已经过时






