前言

最近没怎么练比赛,这把感觉打的有点(说不上来),总之被第一题摆了一下,后面的做感还是可以的,只是E题一直在超时,思路最后想到了,但是没时间写了,不然估计能再多上一点分。 (开补了)


A. tb的区间问题

第一遍一眼贪心,直接wa了,后面老老实实地枚举前后所有可能。。。

第一题还是有点难,在这个位置(我地感觉)

void solve(){
   int n,k;
   cin>>n>>k;
   vector<LL> a(n+1,0),sum(n+1,0);
   LL ans = 0;
   for(int i=1;i<=n;i++){
        cin>>a[i];
        ans+=a[i];
        sum[i] = sum[i-1] + a[i];
   }
   LL num = 0;
   for(int i=1;i<=k;i++){
       num = max(num,sum[n-k+i]-sum[i]);
   }
   //分别是前k个和后k个
   num = max(num,sum[n-k]);
   num = max(num,ans-sum[k]);
   cout<<num; 
}

B tb的字符串问题

这b题感觉也不好做,后面就直接暴力,找到两个相邻且符合条件的点,向左右两边枚举,最后统计没被改变的值即可

听说标准答案是用队列还是什么的,到时候再写写

int n;
string s;
void dfs(int l,int r){
    while(1){
        if((s[l]=='f' && s[r]=='c') || (s[l]=='t' && s[r]=='b')){
            s[l] = '*';
            s[r] = '*';
            l--;
            r++;
        }
        else{
            if(s[l]=='*'){
                l--;
            }
            else if(s[r]=='*'){
                r++;
            }
            else{
                break;
            }
        }
    }
}
void solve(){
   cin>>n>>s;
   for(int i=0;i<s.length();i++){
     if(s[i]=='f' && s[i+1]=='c' || (s[i]=='t' && s[i+1]=='b')){
            s[i]='*';
            s[i+1] = '*';
            int l = i-1 ,r = i+2;
            dfs(l,r);
     }
   }
    int ans = 0;
    for(int i=0;i<s.length();i++){
        if(s[i]!='*') ans++;
    }
    cout<<ans;
}

C. tb的路径问题

肯定不可能建图,数组直接暴了,这种题目还是先写小一些的,找找规律,很快的

把1到10的数组打出来看看规律就知道了,小的数先输出,大的数找规律

void solve(){
   int n;
    cin>>n;
   if(n==1){
        cout<<0;
        return;
   }
   if(n==2){
        cout<<2;
        return;
   }
   if(n==3){
        cout<<4;
        return;
   }
   if(n%2==0){
        cout<<4;
   }
   else{
        cout<<6;
   }
}

D. tb的平方问题

er,感觉这次挺多地方考前缀和的,前缀和遍历区间和,给的数据还是很人性化的1e3(开心),直接n2暴力扫过去即可,然后找点,做差分,最后直接输出就好了

提一嘴,感觉CD比前面还AB还好做.

using LL = long long;
LL check(LL x){
    int p = sqrt(x);
    if(p*p==x){
        return 1;
    }
    else{
        return 0;
    }
}
void solve(){
    int n,q;
    cin>>n>>q;
    vector<LL> a(n+1,0),sum(n+1,0),cnt(n+1,0);
    for(int i=1;i<=n;i++){ 
        cin>>a[i];
        sum[i] = sum[i-1] + a[i];
    }
    int k =0;
    for(int i=1;i<=n;i++){
        for(int k=0;k<=n-i;k++){
        if(check(sum[i+k]-sum[k])==1){
            cnt[k+1]++;
            cnt[i+k+1]--;
        }
        }
    }
    for(int i=1;i<=n;i++){
        cnt[i] += cnt[i-1];
    }
    while(q--){
        int x;
        cin>>x;
        cout<<cnt[x]<<endl;
    }
}

E. tb的数数问题

赛后想了想,5分钟A掉了,其实代码和思路挺简单的,就是取最大,然后从1遍历,对于不行的,倍增点也直接归0,最后留下的点就是答案

void solve(){
    int n;
    cin>>n;
    vector<int> a(n+1,0),cnt(1e6+10,0);
    int num = 0;
    for(int i=1;i<=n;i++){ 
        cin>>a[i];
        num = max(num,a[i]);
        cnt[a[i]]=1;
    }
    for(int j=1;j<=num;j++){
        if(cnt[j]==1){
            continue;
        }
        else{
            for(int i=j;i<=num;i+=j){
                cnt[i]=0;
            }
        }
    }
    int ans = 0;
    for(int i=1;i<=num;i++){
        if(cnt[i]==1){
            ans++;
        }
    }
    cout<<ans;
}