AtCoder Beginner Contest 372
A - delete
思路
遇到'.'不输出就好
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef priority_queue<int> PQ;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
string s;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>s;
for(auto i:s){
if(i!='.')cout<<i;
}
return 0;
}
B - 3^A
思路
看到3的幂求和,考虑向三进制转化
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef priority_queue<int> PQ;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
int m;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>m;
vector<int> v;
vector<int> ans;
while(m>0){
int e=m%3;
v.pb(e);
m/=3;
}
int n=v.size();
for(int i=0;i<n;i++){
for(int j=1;j<=v[i];j++){
ans.pb(i);
}
}
cout<<ans.size()<<endl;
for(auto i:ans)cout<<i<<" ";
return 0;
}
C - Count ABC Again
思路
每次操作至修改一处,前后有相似性且可转移,考虑动态规划(另外,由于下一层的推出只用到了上一层,考虑滚动数组优化空间,dp一维数组可简化为一个ans储存)
AC代码
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N = 2e5 + 10;
int n, q;
string s;
int x;
char c;
int dp[N];
int countABC(const string& str) {
int count = 0;
for (int i = 2; i <= n - 1; i++) {
if (str[i] == 'A' && str[i + 1] == 'B' && str[i + 2] == 'C') {
count++;
}
}
return count;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> q;
cin >> s;
s = "DD" + s + "DD";
dp[0] = countABC(s);
for (int j = 1; j <= q; j++) {
cin >> x >> c;
int change = 0;
x++;
if (s[x] == 'A' && s[x + 1] == 'B' && s[x + 2] == 'C') change--;
if (s[x] == 'B' && s[x - 1] == 'A' && s[x + 1] == 'C') change--;
if (s[x] == 'C' && s[x - 1] == 'B' && s[x - 2] == 'A') change--;
s[x] = c;
if (c == 'A' && s[x + 1] == 'B' && s[x + 2] == 'C') change++;
if (c == 'B' && s[x - 1] == 'A' && s[x + 1] == 'C') change++;
if (c == 'C' && s[x - 1] == 'B' && s[x - 2] == 'A') change++;
dp[j] = dp[j - 1] + change;
}
for (int i = 1; i <= q; i++) {
cout << dp[i] << endl;
}
return 0;
}
D - Buildings
思路
观察样例,枚举每一个位置的答案序列不难发现:每个序列都是单调递增,且序列还具有一些具有相似性,比如违反单调性的数据就像“被删除了”,不会出现,根据以上两点,考虑单调栈;进一步观察,前面答案的得出依赖于后面的元素,且由后至前的答案序列可推,故考虑反向输入操作,即考虑逆向的单调递减栈;答案就是栈的\(size\),注意答案回归正序
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef priority_queue<int> PQ;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
int n;
int h[N];
stack<int> s;
vector<int> v;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>h[i];
for(int i=n;i>=1;i--){
int e=h[i];
v.pb(s.size());
while(!s.empty()&&e>s.top()){
s.pop();
}
s.push(e);
}
for(int i=n-1;i>=0;i--){
cout<<v[i]<<" ";
}
return 0;
}
E - K-th Largest Connected Components
思路
并查集+线段树合并/平衡树
原题
找题解找到原题了[doge]:P3224 [HNOI2012] 永无乡

浙公网安备 33010602011771号