RGB问题

RGB问题

用到的知识点:思维
题目链接:https://vjudge.net/contest/374708#problem/E
思路:直接统计答案不太好统计,我们可以逆着想,我们先算满足第一个条件的个数,第一个条件很好求可以用dp,前缀和记录都可以,我们求出来第一个条件后肯定是有一些数是不满足第二个条件的,于是我们把不满足第二个条件的个数给删去就行了,第二个条件移项就是2j不等于i+k,于是n^2查找即可。
代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    int len;
    string s;
    cin>>len>>s;
    ll cnt1=0,cnt2=0,cnt3=0,sum=0;
    for(int i=0;i<len;i++){//第一个条件 
        if(s[i]=='R') sum+=cnt2*cnt3,cnt1++;
        if(s[i]=='G') sum+=cnt1*cnt3,cnt2++;
        if(s[i]=='B') sum+=cnt1*cnt2,cnt3++;
    }
    for(int i=0;i<len;i++)
    for(int j=i;j<len;j+=2)
    if(s[i]!=s[j]&&s[i]!=s[(i+j)/2]&&s[j]!=s[(i+j)/2]) sum--;//第二个条件 
   printf("%lld\n",sum);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值