Educational Codeforces Round 19 题解【ABCDE】

A. k-Factorization

题意:给你一个n,问你这个数能否分割成k个大于1的数的乘积。

题解:因为n的取值范围很小,所以感觉dfs应该不会有很多种可能……

#include
using namespace std;

long long n;
int k;
vector ans;
void dfs(int x,long long now,int st){
    if(x==k&&now==n){
        for(int i=0;in)break;
        ans.push_back(i);
        dfs(x+1,now*i,i);
        ans.pop_back();
    }
}
int main(){
    cin>>n>>k;
    dfs(0,1,2);
    cout<<"-1"<

B. Odd sum

题意:让你找到一个子序列,要求和为奇数,且和最大。

题解:首先让所有正数都加起来,如果答案此时为奇数,直接输出。否则你要么减去一个正奇数,要么加上一个负奇数。

#include
using namespace std;
const int maxn = 1e5+7;
long long a[maxn];
int n;
long long sum = 0;
int main(){
    scanf("%d",&n);
    long long Tmp = 1e18;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(a[i]>0)sum+=a[i];
        if(abs(a[i])%2==1)Tmp=min(Tmp,abs(a[i]));
    }
    if(sum%2==1)cout<

C. Minimal string

题意:你有一个串s,你有两个操作。第一个操作是从s的开头扔一个串到t的结尾。第二个操作是扔t的结尾到u的结尾。

问你怎么操作,才能使得u的字典序最小。

题解:贪心,记录后缀最小值。如果当前t存的已经是后缀最小值的最小了,那就直接输出就好了。

#include
using namespace std;
const int maxn = 1e5+7;
char s[maxn],t[maxn],u[maxn],mn[maxn];
int main(){
    scanf("%s",s);
    int len = strlen(s);
    mn[len]='z'+1;
    int len2 = 0;
    for(int i=len-1;i>=0;i--)
        mn[i]=min(mn[i+1],s[i]);
    int len3 = 0;
    for(int i=0;i

D. Broken BST

题意:给你一个二叉树,让你用题目中的代码(搜索二叉树)去找每一个节点的值,问你哪些值找不到。

题解:就模拟就好了。唯一的坑点就是节点的val会有相同的情况,这种只需要找到val一样的点就好,并不需要找到同样的那个点。

#include
using namespace std;
const int maxn = 1e5+7;
int n,v[maxn],l[maxn],r[maxn];
int ans,vis[maxn];
set S;
void dfs(int x,int L,int R){
    if(L

E. Array Queries

题意:给你n个数a[i]。然后q个询问,每个询问给你一个p和k,每次p = p + a[p] + k,直到p>n,问你会经过多少步。

题解:根据k分块即可,小于sqrt的dp预处理,否则直接暴力……

#include
using namespace std;
const int maxn = 1e5+7;
int a[maxn],n;
int b[maxn][350];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=n;i>=1;i--){
        for(int j=1;j<350;j++){
            if(i+j+a[i]>n)b[i][j]=1;
            else b[i][j]=b[i+a[i]+j][j]+1;
        }
    }
    int q;scanf("%d",&q);
    for(int i=1;i<=q;i++){
        int x,y;scanf("%d%d",&x,&y);
        if(y<350)printf("%d\n",b[x][y]);
        else{
            int ans = 0;
            int now = x;
            while(now<=n){
                ans = ans + 1;
                now = now + a[now] + y;
            }
            printf("%d\n",ans);
        }
    }
}

你可能感兴趣的:(Educational Codeforces Round 19 题解【ABCDE】)