AtCoder Beginner Contest 367

A - Shout Everyday

思路

分类区间讨论

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 a,b,c;

    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>a>>b>>c;
        if(b>=c){
            if(a>=c&&a<=b)cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
        else{
            if(a<=b||a>=c)cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
        return 0;
    }

B - Cut .0

思路

字符串模拟处理

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;
        int n=s.size();
        s=" "+s;
        int num=n;
        if(s[n]=='0'){
            num--;
            if(s[n-1]=='0'){
                num--;
                if(s[n-2]=='0'){
                    num-=2;
                }
            }
        }
        for(int i=1;i<=num;i++)cout<<s[i];
        cout<<endl;
        //cout<<n<<endl;
        return 0;
    }

C - Enumerate Sequences

思路

数据较小,直接BFS

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 = 15, MAX = 1e9, INF = -1e9;

    int n,k;
    int r[N];
    int ans[N];

    void dfs(int x){
        if(x>n){
            int tot=0;
            for(int i=1;i<=n;i++)tot+=ans[i];
            if(tot%k==0){
                for(int i=1;i<n;i++)cout<<ans[i]<<" ";
                cout<<ans[n]<<endl;
                return ;
            }
        }

        for(int j=1;j<=r[x];j++){
            ans[x]=j;
            dfs(x+1);
        }
    }

    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>n>>k;
        for(int i=1;i<=n;i++)cin>>r[i];

        dfs(1);

        return 0;
    }

D - Pedometer

思路

数据较大,需要\(O(n^2)\)以下的时间复杂度,由于需要求出两点之间的距离,故考虑使用前缀和简化,考虑环,我们将原数组copy一边延长到后面,(最后一个距离不要),答案变成\((s[i]-s[j])\),对\(m\)整除,即要求\(s[i]\)\(s[j]\)\(m\)取余之后余数相同,但是由于距离不能超过一圈,所以不能直接用组合数学计算,考虑分段计算即可

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 = 4e5+30, MAX = 1e9, INF = -1e9;

    int n,m;
    int a[N];
    int s[N];
    map<int,int> mp;
    int ans=0;

    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>n>>m;
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int j=n+1;j<=2*n-1;j++)a[j]=a[j-n];
        s[0]=0;a[0]=0;
        for(int i=1;i<=2*n-1;i++)s[i]=s[i-1]+a[i];

        for(int i=1;i<=n;i++){
    		int x=s[i]%m;
    		if(mp.count(x)){
    			ans+=mp[x];
    		}
    		mp[x]++;
    	}
    	for(int i=1,j=1+n;i<=n;i++,j++){
    		int x=s[i]%m;
    		mp[x]--;
    		int xx=s[j]%m;
    		ans+=mp[xx];
        }
        cout<<ans<<endl;
        return 0;
    }

t.b.c

posted @ 2024-09-06 18:20  Oaths  阅读(6)  评论(0)    收藏  举报