A.模拟,注意单人的时候判断顺序。
#include<bits/stdc++.h> using namespace std; int n,a,b; int main() { ios::sync_with_stdio(0); cin >> n >> a >> b; int b1 = b,b2 = 0,ans = 0; for(int i = 1;i <= n;i++) { int x; cin >> x; if(x == 1) { if(a) a--; else if(b1) { b1--; b2++; } else if(b2) b2--; else ans++; } else { if(b1) b1--; else ans += 2; } } cout << ans << endl; return 0; }
B.对于每个B点,更新最极端边界,确定最后的长宽,注意不用涂和不成立的情况。
#include<bits/stdc++.h> using namespace std; int n,m; string s[105]; int main() { ios::sync_with_stdio(0); cin >> n >> m; for(int i = 1;i <= n;i++) { cin >> s[i]; s[i] = ‘ ‘+s[i]; } int l = 105,r = 0,h = 0,d = 105,cnt = 0; for(int i = 1;i <= n;i++) { for(int j = 1;j <= m;j++) { if(s[i][j] == ‘W‘) continue; cnt++; l = min(l,j); r = max(r,j); h = max(h,i); d = min(d,i); } } int ans = max(r-l+1,h-d+1); if(ans <= 0) { cout << 1 << endl; return 0; } if(ans > n || ans > m) { cout << -1 << endl; return 0; } cout << ans*ans-cnt << endl; return 0; }
C.对于每一个串,选择更后面的起点更新。
#include<bits/stdc++.h> using namespace std; char a[2000005] = ""; int n; int main() { ios::sync_with_stdio(0); cin >> n; int len = 0; while(n--) { string s; int x,now = 0; cin >> s >> x; while(x--) { int xx; cin >> xx; int i = max(now,xx); for(int j = i-xx;j < s.length();i++,j++) { len = max(len,i); a[i] = s[j]; } now = max(now,i); } } for(int i = 1;i <= len;i++) { if(a[i]) cout << a[i]; else cout << ‘a‘; } cout << endl; return 0; }
D.从一点个拉出k条链来,每条链长度尽可能相等。
#include<bits/stdc++.h> using namespace std; int n,k; int main() { ios::sync_with_stdio(0); cin >> n >> k; int t = n-k-1; if(t%k == 0) cout << 2+t/k*2 << endl; else if(t%k == 1) cout << 2+t/k*2+1 << endl; else cout << 2+t/k*2+2 << endl; int i; for(i = n-1;i >= max(n-k,1);i--) cout << n << " " << i << endl; for(;i >= 1;i--) cout << i+k << " " << i << endl; return 0; }
E.因为询问的串长最多为10,我们可以每个字母对应的长度都开个树状数组。
#include<bits/stdc++.h> using namespace std; string s; int q,tree[4][11][11][100005] = {0}; map<char,int> mp; inline int lowbit(int x) { return x&-x; } void add(int x,int y,int z,int pos,int xx) { while(pos < s.length()) { tree[x][y][z][pos] += xx; pos += lowbit(pos); } } int getsum(int x,int y,int z,int pos) { int sum = 0; while(pos > 0) { sum += tree[x][y][z][pos]; pos -= lowbit(pos); } return sum; } int main() { ios::sync_with_stdio(0); cin >> s >> q; s = ‘ ‘+s; mp[‘A‘] = 0; mp[‘G‘] = 1; mp[‘C‘] = 2; mp[‘T‘] = 3; for(int i = 1;i < s.length();i++) { for(int j = 1;j <= 10;j++) add(mp[s[i]],i%j,j,i,1); } while(q--) { int x; cin >> x; if(x == 1) { string ss; cin >> x >> ss; for(int i = 1;i <= 10;i++) add(mp[s[x]],x%i,i,x,-1); for(int i = 1;i <= 10;i++) add(mp[ss[0]],x%i,i,x,1); s[x] = ss[0]; } else { int l,r; string ss; cin >> l >> r >> ss; int sum = 0; for(int i = 0;i < ss.length()&&l+i <= r;i++) sum += getsum(mp[ss[i]],(l+i)%ss.length(),ss.length(),r)-getsum(mp[ss[i]],(l+i)%ss.length(),ss.length(),l-1); cout << sum << endl; } } return 0; }
时间: 2024-10-25 18:13:15