牛客2023暑期多校第六场E题题解

题目大意

给定一个长度为 n 的正整数序列,并进行 q 次询问

每次询问给定一个范围 [l,r] 和一个正整数 k

问能否将序列中给定范围内的子序列划分为 k 段非空区间,且每段区间之和为偶数

解题思路

1.首先用sum [i] 记录前i项的和;

2.其次用cnt[i]记录sum [i] 是目前第几个急数或偶数;

3.用cnt1,cnt2来表示目前sum [i] 已经出现过了几个奇数或偶数;

4.给定区间 [l,r],先用sum [r]-sum [l-1]来判断此区间和是否为偶数,若不是偶数直接输出"NO";

5.用cnt [r] -cnt [l-1]计算此区间最多可以分为多少段区间是满足条件的,若>=k输出"YES",否则输出"NO";

直接附上代码!

#include
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
#define Max 100005
typedef double db;
void solve()
{
    ll n,q;cin>>n>>q;
    ll a[Max],sum[Max],cnt[Max],cnt1=0,cnt2=0;
    sum[0]=0;
    for(ll i=1;i<=n;i++)
    {
        cin>>a[i],sum[i]=sum[i-1]+a[i];
        if(sum[i]%2)cnt[i]=++cnt1;
        else cnt[i]=++cnt2;
    }
        
    while(q--)
    {
        ll l,r,k;cin>>l>>r>>k;
        if(((sum[r]-sum[l-1])%2==0)&&(cnt[r]-cnt[l-1]>=k))
            cout<<"YES\n";
        else cout<<"NO\n";
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int _=1;cin>>_;    
    while(_--)
        solve();
    return 0;
}

你可能感兴趣的:(算法)