Educational Codeforces Round 59 (Rated for Div. 2)

Posted the-pines-of-star

tags:

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

 

A.Digits Sequence Dividing

题意:给你一个1-9的数字字符串,把它划分成若干段(>=2)段,使其大小递增。

错误:当长度为2的时候没考虑

 

技术分享图片
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<map>
using namespace std;
typedef long long ll;
const int p=998244353;
int n,q;
char s[1010];
int main()
{
    scanf("%d",&q);
    for(int i=1;i<=q;i++)
    {
        scanf("%d",&n);
        scanf("%s",s);
        if(s[0]<s[1]||n>2)
        {
            printf("YES
");
            printf("2
");
            printf("%c ",s[0]);
            for(int j=1;j<n;j++) printf("%c",s[j]);
            printf("
");
        }
        else{
            printf("NO
");
        }
    }
}
View Code

 

B.Digital root

题意:求第k大的数根为x的数

补充知识:数根(digital root)公式的推导

 

 

技术分享图片
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<map>
using namespace std;
typedef long long ll;
const int p=998244353;
int n,q;
ll k,x;
char s[1010];
int main()
{
    scanf("%d",&q);
    for(int i=1;i<=q;i++)
    {
        scanf("%I64d%I64d",&k,&x);
        printf("%I64d
",(k-1)*9+x);
    }
}
View Code

 

C.Brutality

题意:给你两个序列,第一个为价值,第二个为种类,求价值最大(一个限制条件是在种类相同的段里不能选超过k个)

思路:对个每个小段快排,取前k大。

技术分享图片
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const int p=998244353;
int n,k,a[201010],q[201000];
char s[201000];
ll ans;
vector<int> mp[30];
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    scanf("%s",s+1);
    int w=1,flag=s[1];q[1]=a[1];
    for(int i=2;i<=n;i++)
    {
        if(s[i]!=flag)
        {
            sort(q+1,q+1+w,cmp);
            for(int j=1;j<=min(w,k);j++)
            ans+=q[j];
            w=1;flag=s[i];q[1]=a[i];
        }
        else{
            q[++w]=a[i];
        }
    }
    sort(q+1,q+1+w,cmp);
    for(int j=1;j<=min(w,k);j++)
            ans+=q[j];
//    for(int i=1;i<=n;i++)
//    {
//        mp[s[i]-97].push_back(a[i]);
//    }
//    for(int i=0;i<=29;i++)
//        sort(mp[i].begin(),mp[i].end());
//    for(int i=0;i<=29;i++)
//    {
//        for(int j=mp[i].size()-1;j>=0;j--)
//           {
//               ans+=mp[i][j];
//               printf("%I64d %d
",ans,mp[i].size());
//               if(mp[i].size()-j+1>k) break;
//           }
//    }
    printf("%I64d
",ans);
}
View Code

 

D.Compression

题意:对于一个01矩形找到最大的矩形,使其满足技术分享图片

思路1:这道题的题意就是分解成若干最大的矩形是,使其内的值都为0或者1。用sum[i][j]表示二维前缀和,时间复杂度O(n*n*π*π/6)

技术分享图片
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const int p=998244353;
int n,mp[5210][5210],sum[5210][5210],flag,w[10100];
char s[201010];
bool chec(int x,int y,int k)
{
    //printf("%d %d %d
",x,y,k);
    int zhi=sum[x*k][y*k]-sum[(x-1)*k][y*k]-sum[x*k][(y-1)*k]+sum[(x-1)*k][(y-1)*k];
    //printf("zhi=%d
",zhi);
    if(zhi==0||zhi==k*k) return 0;
    return 1;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%s",s);
        for(int j=0;j<strlen(s);j++)
        {
            int x;
            if(s[j]<=9) x=s[j]-0;
            else x=s[j]-A+10;
            int l=0;
            while(x>0)
            {
                mp[i][4*(j+1)-l]=x%2;
                x/=2;l++;
            }
        }
    }
    for(int i=1;i<=n;i++) 
    {
        for(int j=1;j<=n;j++)
        {
            sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+mp[i][j];
        } 
    } 
    int l=0;
    for(int i=1;i<=trunc((double)sqrt(n));i++)
        if(n%i==0)
        {
        w[++l]=i;w[++l]=n/i;    
        } 
    sort(w+1,w+1+l);
    for(int i=l;i>=1;i--)
    {
        flag=0;
        int kuai=n/w[i];
    //    printf("%d
",kuai);
        for(int k=1;k<=kuai;k++)
        {
            for(int j=1;j<=kuai;j++)
            if(chec(k,j,w[i]))
            {
                flag=1;
    //            printf("   %d
",w[i]);
                break;
            }
        if(flag) break;
        }
        if(!flag) 
        {
            flag=w[i];
            break;
        }
    }
    printf("%d
",flag);
}
View Code

思路2:巧妙官方题解,

以上是关于Educational Codeforces Round 59 (Rated for Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章

Educational Codeforces Round 7 A

Educational Codeforces Round 7

Educational Codeforces Round 90

Educational Codeforces Round 33

Codeforces Educational Codeforces Round 54 题解

Educational Codeforces Round 27