AtCoder Beginner Contest 177总结

回学校第一次打AtCoder,感觉晚上在寝室打不在状态~~

A - Don’t be late

数学题签到

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010;
ll a[N];
int n;
int main()
{
    
    
    IO;
    int d,t,s;
    cin>>d>>t>>s;
    int x=(d+s-1)/s;
    if(t>=x) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    return 0;
}

B - Substring

直接暴力即可

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mkp(a,b) make_pair(a,b)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int main()
{
    
    
    IO;
    string s,t;
    cin>>s>>t;
    int res=1e9;
    for(int i=0;i+t.size()<=s.size();i++)
    {
    
    
        int cnt=0;
        for(int j=0;j<t.size();j++) 
            if(s[j+i]!=t[j]) cnt++;
        res=min(cnt,res);
    }
    cout<<res<<endl;
    return 0;
}

C - Sum of product of pairs

预处理前缀和即可

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=200010,mod=1e9+7;
ll a[N],s[N];
int n;
int main()
{
    
    
    IO;
    cin>>n;
    for(int i=1;i<=n;i++) 
    {
    
    
        cin>>a[i];
        s[i]=s[i-1]+a[i];
    }
    ll res=0;
    for(int i=1;i<=n;i++)
        res=(res+(s[n]-s[i])%mod*a[i]%mod)%mod;
    cout<<res<<endl;
    return 0;
}

D - Friends

并查集维护sz[]找个最大的即可

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=200010,mod=1e9+7;
int p[N],sz[N];
int n,m;
int find(int x)
{
    
    
    if(x!=p[x]) p[x]=find(p[x]);
    return p[x];
}
int main()
{
    
    
    IO;
    cin>>n>>m;
    for(int i=1;i<=n;i++) p[i]=i,sz[i]=1;
    while(m--)
    {
    
    
        int a,b;
        cin>>a>>b;
        int pa=find(a),pb=find(b);
        if(pa!=pb)
        {
    
    
            p[pa]=pb;
            sz[pb]+=sz[pa];
        }
    }
    int res=0;
    for(int i=1;i<=n;i++)   
        if(i==p[i]) res=max(res,sz[i]);
    cout<<res<<endl;
    return 0;
}

E - Coprime

太久没做过数论题目了,筛法啥的都忘完了,回头刷kuangbin复习复习吧
方法一
如果两个数最大公约数不为1,那么对两个数进行分解质因数后一定有相同的质因子。—— O ( n a i ) O(n\sqrt{a_i}) O(nai ) 1040ms

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000010;
int a[N],cnt[N];
int n;
int gcd(int a,int b)
{
    
    
    return b?gcd(b,a%b):a;
}
void divide(int x)
{
    
    
    for(int i=2;i<=x/i;i++)
    {
    
    
        if(x%i==0) 
        {
    
    
            cnt[i]++;
            while(x%i==0) x/=i;
        }
    }
    if(x>1) cnt[x]++;
}
int main()
{
    
    
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) divide(a[i]);
    int d=a[1];
    for(int i=2;i<=n;i++) d=gcd(d,a[i]);
    bool ok=1;
    for(int i=1;i<N;i++)
        if(cnt[i]>1) 
        {
    
    
            ok=0;
            break;
        }
    if(ok) cout<<"pairwise coprime"<<endl;
    else if(d==1) cout<<"setwise coprime"<<endl;
    else cout<<"not coprime"<<endl;
    return 0;
}

方法二
方法一反着做,将原数分解质因数,方法二是正着做,考虑两个数最大公约数是d那么两个数一定是d的倍数,直接暴力筛原数组中一个数的倍数的个数。如果个数大于1就不是pairwise coprime—— O ( N l o g N ) O(NlogN) O(NlogN) 248ms

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000010;
int a[N],mp[N];
int n;
int gcd(int a,int b)
{
    
    
    return b?gcd(b,a%b):a;
}
int main()
{
    
    
    cin>>n;
    for(int i=1;i<=n;i++) 
    {
    
    
        cin>>a[i];
        mp[a[i]]++;
    }
    bool ok=1;
    for(int i=2;i<N;i++)
    {
    
    
        int cnt=0;
        for(int j=i;j<N;j+=i) cnt+=mp[j];
        if(cnt>1)
        {
    
    
            ok=0;
            break;
        }
    }
    int d=a[1];
    for(int i=2;i<=n;i++) d=gcd(d,a[i]);
    if(ok) cout<<"pairwise coprime"<<endl;
    else if(d==1) cout<<"setwise coprime"<<endl;
    else cout<<"not coprime"<<endl;
    return 0;
}

F - I hate Shortest Path Problem

线段树 留个坑回来补一下?
要加油哦~

猜你喜欢

转载自blog.csdn.net/Fighting_Peter/article/details/108316043
今日推荐