周作业

周作业 \(78\)

T2CF1239A Ivan the Fool and the Probability Theory

喜提奇怪思路 \(+1\),又是一个另辟蹊径的思路,和题解重合率为 \(0\)

首先可以发现一些规律,每一行必须和上一行的颜色是相反的,但是如果一黑白交替的话,相邻的两行颜色可以完全相同,但是每一组两列必须有间隔。

所以在计算答案时只需要考虑前两行就可以,我们把答案分成黑白交替和“其他”进行计算。

其他:注意:不得出现大于两个的相同颜色在同一行相邻。可以枚举出现多少个两个颜色相同且在同一行相邻,然后用组合数去进行计算,\(m-i\) 表示去掉相邻的其中一个,剩下的就都是上下交替的,如下图:

img_v3_0214p_35f317c5-a8d0-42e4-b0b1-bab21b48065g

所以答案就是没打叉的地方中选出 \(i\) 个。

黑白交替:这种情况可以相邻的两行完全相同,但是只能是 \(2\) 行,如果连续 \(3\) 行相同就不对了,也可以用组合数来求,同样枚举有多少个完全相同的,然后减去其中的一个,从剩下的位置中选 \(i\) 个。

注意最后答案要 \(\times 2\) 以为黑白的颜色可以反过来。

代码
#include<bits/stdc++.h>
using namespace s
const int N=1e5+5,mod=1e9+7;
int fact[N],infact[N];
int qmi(int a,int b){
    int res=1;
    while(b){
        if(b&1) res=1ll*res*a%mod;
        b>>=1;
        a=1ll*a*a%mod;
    }
    return res;
}
int C(int n,int m){
    if(n<m) return 0;
    if(!m) return 1;
    return 1ll*fact[n]*infact[m]%mod*infact[n-m]%mod;
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    fact[0]=infact[0]=1;
    for(int i=1;i<=max(n,m);i++){
        fact[i]=1ll*fact[i-1]*i%mod;
        infact[i]=1ll*infact[i-1]*qmi(i,mod-2)%mod;
    }
    long long ans=0;
    for(int i=1;i<=m/2;i++){
        ans=(ans+C(m-i,i))%mod;
    }
    for(int i=0;i<=(int)ceil(n/2.0);i++){
        ans=(ans+C(n-i,i))%mod;
    }
    printf("%lld",1ll*ans*2%mod);
    return 0;
}

周作业 \(80\)

T3CF1845D Rating System

代码
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int a[N];
long long s[N]; 
int main(){
	int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            s[i]=s[i-1]+a[i];
        }
        long long ans=0,mx=0,pos=0;
        for(int i=1;i<=n;i++){
            mx=max(mx,s[i]);
            if(ans<mx+s[n]-s[i]){
                ans=mx+s[n]-s[i];
                pos=mx;
            }
        }
        printf("%lld\n",pos);
    }
	return 0;
}

T5CF1256F Equalizing Two Strings

代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
char s[N],t[N];
int ss[30],tt[30];
int main(){
    int q;
    scanf("%d",&q);
    while(q--){
        int n;
        scanf("%d",&n);
        scanf("%s%s",s+1,t+1);
        for(int i=0;i<26;i++) ss[i]=tt[i]=0;
        for(int i=1;i<=n;i++){
            ss[s[i]-'a']++;
            tt[t[i]-'a']++;
        }
        int f=0;
        for(int i=0;i<26;i++){
            if(ss[i]!=tt[i]){
                printf("NO\n");
                f=1;
                break;
            }
        }
        if(f) continue;
        for(int i=0;i<26;i++){
            if(ss[i]>1){
                printf("YES\n");
                f=1;
                break;
            }
        }
        if(f) continue;
        if(n==1){
            printf("YES\n");
            continue;
        }
        int cnt1=0,cnt2=0;
        for(int i=1;i<n;i++){
            for(int j=i+1;j<=n;j++){
                if(s[i]>s[j]) cnt1++;
                if(t[i]>t[j]) cnt2++;
            }
        }
        if(cnt1%2==cnt2%2) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
posted @ 2026-08-21 19:48  yushihan  阅读(8)  评论(0)    收藏  举报