A题
一个很简单的string替换特殊符号打印的题目
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
string t;
for(int i=0;i<s.size();i++)
{
if(s[i]!='.'){
t+=s[i];
}
}
cout<<t<<endl;
}
B题
求一个数可以用几个3的次方相加来表示,可以用三进制拆分来算出个数和具体次方值。
代码实现
vector <int> v;
while (m) {
v.push_back(m % 3);
m /= 3; }
vector <int> ans;
for (int i = 0; i < v.size(); i ++)
{ for (int j = 0; j < v[i]; j ++) { ans.push_back(i); } }
cout << ans.size() << "\n";
for (auto i : ans) cout << i << " "; }
C题 可以先求出原字符串含有多少个数,以后每次更改一个字符影响的只是前后相加一共5个字母的个数,所以循环遍历的时候循环很少次数就可以。
string s;
cin>>s;
int cnt=0;
for(int i=0;i<n-2;i++){
if(s[i]=='A'&&s[i+1]=='B'&&s[i+2]=='C'){
cnt++;
}
}
while(q--){
int x;
char c;
cin>>x;
cin>>c;
char idx;
string t;
t=s;
idx=s[x-1];
s[x-1]=c;
if(idx==s[x-1]){
cout<<cnt<<endl;
continue;
}
else {
for(int i=x-1-2;i<=x-1;i++){
if(s[i]=='A'&&s[i+1]=='B'&&s[i+2]=='C'){
cnt++;
}
else{
if(t[i]=='A'&&t[i+1]=='B'&&t[i+2]=='C')
cnt--;
}
}
}
cout<<cnt<<endl;
D题
从后往前枚举
类似单调栈 栈中是单调递增的,栈中元素个数是结果值,往前枚举如果有元素大于栈顶则栈顶弹出,该元素入栈
stack<int>stk;
vector<int>res(n+1,0);
for(int i=n;i>=1;i--){
res[i]=stk.size();
while(stk.size()&&stk.top()<a[i])stk.pop();
stk.push(a[i]);
for(int i=1;i<=n;i++){
cout<<res[i]<<" ";
E题
由题可知这题要用并查集来去维护集合,由于要求第K大的 所以可以用set来存
vector<set<int>>p2(n+1);
vector<int>p1(n+1);
for(int i=1;i<=n;i++){
p1[i]=i;
p2[i].insert(i);
}
int find(int x){
return p1[x]==x?x:p1[x]=find(p1[x]);
}
int op,u,v;
cin>>op>>u>>v;
int pu=find(u);
int pv=find(v);
if(pu==pv)continue;
if(p2[pu].size()>p2[pv].size())
swap(pu,pv);
for(auto v:p2[pu])p2[pv].insert(v);
p1[pu]=pv;
else {
if(p2[find(u)].size()<v)cout<<-1<<endl;
else{
auto it=p2[find(u)].end();
while(v--)it--;
cout<<*it<<endl;
}
}