Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)

Posted walfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)相关的知识,希望对你有一定的参考价值。

爆炸场,A被hack两次,a,c都看错题意。。。还是太菜了

A水题,ifelse写的太搓了被hack。。

技术分享
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-7;
const int N=500000+10,maxn=sqrt(N)+10,inf=0x3f3f3f;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,a,b,c;
    cin>>n>>a>>b>>c;
    n--;
    if(n==0)cout<<0<<endl;
    else
    {
        if(c<=a&&c<=b)cout<<(n-1)*c+min(a,b)<<endl;
        else
        {
            cout<<n*min(a,b)<<endl;
        }
    }
    return 0;
}
/********************

********************/
A

B也是瞎搞,找间距是k的倍数,直接取模计数

技术分享
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-7;
const int N=100000+10,maxn=sqrt(N)+10,inf=0x3f3f3f;

int a[N];
map<int,int>b;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m,k;
    cin>>n>>k>>m;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        b[a[i]%m]++;
    }
    int id=-1;
    for(int i=0;i<m;i++)
    {
        if(b[i]>=k)
        {
            id=i;
            break;
        }
    }
    if(id>=0)
    {
        cout<<"Yes"<<endl;
        vector<int>v;
        for(int i=0;i<n;i++)
        {
            if(a[i]%m==id)
                v.pb(a[i]);
        }
        for(int i=0;i<k;i++)cout<<v[i]<<" ";
        cout<<endl;
    }
    else cout<<"No"<<endl;
    return 0;
}
/********************

********************/
B

C找十进制每一位加到自身等于一个数,直接枚举1到81,用n挨个减,判断就好了

技术分享
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-7;
const int N=100000+10,maxn=sqrt(N)+10,inf=0x3f3f3f;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
    vector<int>v;
    for(int i=1;i<=81;i++)
    {
        int sum=0,s=n-i;
        while(s)
        {
            sum+=s%10;
            s/=10;
        }
        if(sum==i)v.pb(n-i);
    }
    sort(v.begin(),v.end());
    cout<<v.size()<<endl;
    for(int i=0;i<v.size();i++)
        cout<<v[i]<<endl;
    return 0;
}
/********************

********************/
C

D题意:每次把第i位放一个东西,操作要求把所有的东西放到最后。解法:遍历一遍,同时维护一个最后一位输出就好了

技术分享
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-7;
const int N=300000+10,maxn=sqrt(N)+10,inf=0x3f3f3f;

int s[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,cnt;
    cin>>n;
    cnt=n;
    cout<<1<<"\n";
    for(int i=1;i<=n;i++)
    {
        int a;
        cin>>a;
        s[a]++;
        if(a==cnt)
        {
            while(cnt>0&&s[cnt])cnt--;
        }
        cout<<cnt-n+i+1<<"\n";
    }
    return 0;
}
/********************

********************/
D

E题意:有n个类似字符串a,A的东西,然后刚开始是小写,可以把某几个改成大写,要求最后结果是按字符串递增的

题解:用一个数组维护不能改变的数,还有一个维护已经改变的数,用vector存必须同时改变的数,当需要改变时dfs容器,看有没有产生冲突,每两个字符串找第一个不相同的字符,此时只有八种情况,挨个枚举就行了,分别是(1,2)(1‘,2)(1,2’)(1‘,2’)(2,1)(2’,1)(2,1‘)(2’,1‘)

技术分享
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-7;
const int N=100000+10,maxn=sqrt(N)+10,inf=0x3f3f3f;

bool ca[N],no[N],f;
int sz[N];
vector<int>s[N];
vector<int>v[N];
void dfs(int u)
{
    if(no[u])
    {
        f=1;
        return ;
    }
    else ca[u]=1;
    for(int i=0;i<v[u].size()&&!f;i++)
    {
        dfs(v[u][i]);
    }
}
void fuck(int p1,int p2)
{
    if(p1>p2)
    {
        if(!ca[p1]&&!ca[p2])
        {
            f=0;
            dfs(p1);
            if(f)
            {
                puts("No");
                exit(0);
            }
            else no[p2]=1;
        }
        else if(ca[p1]&&!ca[p2])
        {
            no[p2]=1;
        }
        else
        {
            puts("No");
            exit(0);
        }
    }
    else
    {
        if(!ca[p1]&&ca[p2])
        {
            f=0;
            dfs(p1);
            if(f)
            {
                puts("No");
                exit(0);
            }
        }
        else if(!ca[p1]&&!ca[p2])
        {
            v[p2].pb(p1);
        }
    }
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&sz[i]);
        s[i].clear();
        for(int j=0;j<sz[i];j++)
        {
            int a;
            scanf("%d",&a);
            s[i].pb(a);
        }
    }
    for(int i=2;i<=n;i++)
    {
        if(s[i]==s[i-1])continue;
        else if(sz[i-1]>sz[i])
        {
            bool ok=1;
            for(int j=0;j<s[i].size();j++)
            {
                if(s[i-1][j]!=s[i][j])
                {
                    fuck(s[i-1][j],s[i][j]);
                    ok=0;
                    break;
                }
            }
            if(ok)
            {
                puts("No");
                return 0;
            }
        }
        else if(sz[i-1]<=sz[i])
        {
            for(int j=0;j<s[i-1].size();j++)
            {
                if(s[i-1][j]!=s[i][j])
                {
                    fuck(s[i-1][j],s[i][j]);
                    break;
                }
            }
        }
    }
    puts("Yes");
    v[0].clear();
    for(int i=1;i<=m;i++)
       if(ca[i])
            v[0].pb(i);
    printf("%d\n",v[0].size());
    for(int i=0;i<v[0].size();i++)
        printf("%d ",v[0][i]);
    puts("");
    return 0;
}
/********************

********************/
E

 

以上是关于Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #441 Div. 2题解

Codeforces Round #441 F题题解

Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)

Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)