传送门:Sky Inc, Programming Contest 2023(AtCoder Beginner Contest 329) - AtCoder
A,B,C,D
这四道题比较简单,就不多叙述。
E - Stamp
这题是一道比较经典的涂色问题。
我们可以知道,如果存在覆盖相交的话,要么前面盖住后面,要么后面盖住前面,则他们的首尾一定会留下痕迹。所以我们正反遍历,可以得到答案。
代码如下:
#pragma GCC optimize(3) //O2优化开启
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int N=998244353;
const int MX=0x3f3f3f3f3f3f3f3f;
int n,m;
string s,t;
bool pan(string x){
for(int i=0;i<m;i++){
if(x[i]=='#'||x[i]==t[i])continue;
else return 0;
}
return 1;
}
void icealsoheat(){
cin>>n>>m;
cin>>s>>t;
for(int i=m-1;i<n;i++){
if(pan(s.substr(i-m+1,m))){
for(int j=i-m+1;j<=i;j++){
s[j]='#';
}
}
}
for(int i=n-1;i>=m-1;i--){
if(pan(s.substr(i-m+1,m))){
for(int j=i-m+1;j<=i;j++){
s[j]='#';
}
}
}
for(int i=0;i<n;i++){
if(s[i]!='#'){
puts("No");
return;
}
}
puts("Yes");
}
signed main(){
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int _yq;
_yq=1;
// cin>>_yq;
while(_yq--){
icealsoheat();
}
}
F - Colored Ball
这道题的时间复杂度比较巧妙,我们每次都让最小的去合并最大的,最后的时间复杂度为O(n)。确实让我开拓了眼界。是启发式合并的思想。
代码如下:
#pragma GCC optimize(3) //O2优化开启
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int N=998244353;
const int MX=0x3f3f3f3f3f3f3f3f;
int n,q;
int c[1000005];
set<int>s[200005];
int id[200005];
void icealsoheat(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>c[i];
id[i]=i;
s[i].insert(c[i]);
}
while(q--){
int a,b;
cin>>a>>b;
int x=id[a];
if(s[id[a]].size()>s[id[b]].size()){
swap(id[a],id[b]);
}
for(auto i:s[id[a]]){
s[id[b]].insert(i);
}
s[id[a]].clear();
cout<<s[id[b]].size()<<"\n";
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int _yq;
_yq=1;
// cin>>_yq;
while(_yq--){
icealsoheat();
}
}
G - Delivery on Tree
较难,自己码了166行代码,不过最后以失败告终。待补。。。。。