周作业
周作业 \(78\)
T2:CF1239A Ivan the Fool and the Probability Theory
喜提奇怪思路 \(+1\),又是一个另辟蹊径的思路,和题解重合率为 \(0\)。
首先可以发现一些规律,每一行必须和上一行的颜色是相反的,但是如果一黑白交替的话,相邻的两行颜色可以完全相同,但是每一组两列必须有间隔。
所以在计算答案时只需要考虑前两行就可以,我们把答案分成黑白交替和“其他”进行计算。
其他:注意:不得出现大于两个的相同颜色在同一行相邻。可以枚举出现多少个两个颜色相同且在同一行相邻,然后用组合数去进行计算,\(m-i\) 表示去掉相邻的其中一个,剩下的就都是上下交替的,如下图:

所以答案就是没打叉的地方中选出 \(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\)
代码
#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;
}
T5:CF1256F 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;
}

浙公网安备 33010602011771号