Acwing第132次周赛

101 阅读3分钟

竞赛 - AcWing

这绝对是期末考试之前最后一次更文了,我以后绝对不自己找气受了。虽然这次排名确实达到了有史以来最高一次吧,但是真的难蚌,因为差一点我就开出了CC,能让排名更高的,然后我的AtcoderAtcoder报名了也没打,我真的无能狂怒,想骂人了。然后这次题质量也不错,由简单到难。

分析

AA:很简单,手速题,不过我差点还错了,输出char(s[i]+32)char(s[i]+32)即可。

BB:提示很重要,提示的意思就是我们可以从bb开始往aa枚举,然后分解每个数,将因数放进一个vectorvector resres,然后我们去看这里面的每个因数是不是在[2,a][2,a]之间,是就进入下一轮遍历,如果不是,那就是最大的数,如果输出1-1,那么我们可以断定ba<300b-a<300,因此时间复杂度就是O(300n)O(300\sqrt{n}),显然很容易通过。

CC:这是一个诈骗题,开始被骗了,开始还以为是TarjanTarjan缩点,后来发现它是个jbjb,就是个很简单的并查集+floyd()floyd(),我们先把所有边权w[i]==0w[i]==0a[i]a[i]b[i]b[i]用并查集合并,然后我们枚举一下每段c[i]c[i]他们的祖先是不是都一样,如果有不一样的,说明输出NoNo,否则就输出YesYes,这一步是最难得,我开始没发现是并查集,直接写假了,我草了,然后找了半天的bugbug,考试时间过去了,懊恼不已,然后下一步我们考虑既然所有的相同类型的点内部两两最短路都是00,那么我们显然可以将这些点合并成一个点,然后跑一遍floydfloyd即可,时间复杂度O(k3)O(k^3)。然后就结束了,我的评价是不如上次周赛的BB

代码

AA

#include <bits/stdc++.h>
#define x first
#define y second

using namespace std;

void solve(){
    string s;
    cin>>s;
    for(int i=0;i<s.size();i++) cout<<char(s[i]+32);
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    int t=1;
    while(t--) solve();
    return 0; 
}

BB:

#include <bits/stdc++.h>
#define x first
#define y second

using namespace std;
map<int,int> mp;
void solve(){
    int a,b;
    vector<int> res;
    cin>>a>>b;
    int maxn=-1;
    for(int c=b;c>=a;c--){
        res.clear();
        for (int i=1;i<=c/i; i++){
            if (c%i == 0){
                res.push_back(i);
                if(i!=c/i) res.push_back(c/i);
            }
        }
        bool ok=false;
        for(int i=0;i<res.size();i++){
            if(res[i]>=2 && res[i]<=a){
                ok=true;
                break;
            }
        }
        if(ok==false){
            maxn=c;
            break;
        }
    }
    cout<<maxn;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    int t=1;
    while(t--) solve();
    return 0; 
}

CC:

//屎山既视感
#include <bits/stdc++.h>
#define x first
#define y second

using namespace std;
const int N=200010;
int n,m,idx=0,id[N],k,a[N],b[N],c[N];
int mp[N],fa[N];
bool flag[N];
int d[510][510];
void floyd(){
    for(int kk=1;kk<=k;kk++){
        for(int i=1;i<=k;i++){
            for(int j=1;j<=k;j++){
                d[i][j]=min(d[i][j],d[i][kk]+d[kk][j]);
            }
        }
    }
}
int find(int x){
    if(fa[x]!=x) fa[x]=find(fa[x]);
}
void solve(){
    memset(flag,0,sizeof flag);
    memset(d,0x3f,sizeof d);

    cin>>n>>m>>k;
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=k;i++) d[i][i]=0;
    id[0]=0;
    for(int i=1;i<=k;i++){
        cin>>id[i];
        id[i]+=id[i-1];
        for(int j=id[i-1]+1;j<=id[i];j++){
            //cout<<j<<" ";
            if(id[i]==id[i-1]+1) flag[id[i]]=true;
            mp[j]=i;//每个点组别 
            //fa[j]=i;
        }
    }
    bool ok=true; 
    for(int i=1;i<=m;i++){
        cin>>a[i]>>b[i]>>c[i];
        int l=find(a[i]),r=find(b[i]);
        if(c[i]==0){
            if(l==r) continue;
            else{
                fa[l]=r;
            }
        }
    }
    for(int i=1;i<=k;i++){
        //cin>>id[i];
    //  id[i]+=id[i-1];
        int l=find(id[i-1]+1);
        for(int j=id[i-1]+1;j<=id[i];j++){
            int r=find(j);
            if(r!=l){
                cout<<"No\n";
                return;
            }
        }
    }
    cout<<"Yes\n";
    for(int i=1;i<=m;i++){
        int l=mp[a[i]],r=mp[b[i]];
        d[l][r]=d[r][l]=min(d[l][r],c[i]);
    }
    floyd();
    for(int i=1;i<=k;i++){
        for(int j=1;j<=k;j++){
            if(d[i][j]==0x3f3f3f3f) cout<<-1<<" ";
            else cout<<d[i][j]<<" ";
        }
        cout<<"\n";
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    int t=1;
    while(t--) solve();
    return 0; 
}

加油吧,争取下次能AKAK,当然是期末考试结束后!