Epik Rəngləmə#11836

Epik Rəngləmə (Həll təhlili)

Problemin Müəllifi:

Hasan Saleh (MathModel)

Hazırlayan:

Hasan Saleh (MathModel)

Redaktə edən:

Hasan Saleh (MathModel)

Həll 1

Qeyd edin ki, massivdəki cəmin yalnız iki halı var, gəlin tək olduqda düşünək, cüt cəmlər üçün bütün mümkün seçimləri nəzərdən keçirək:

  • \text{tək+tək=çift} və buna görə də tamamlayıcı \text{tək-çift=tək}dır.

  • \text{çift+çift=çift} və buna görə də tamamlayıcı \text{tək-çift=tək}dır.

  • \text{çift+tək=tək} və buna görə də tamamlayıcı \text{çift-tək=çift}dır.

Bütün konfiqurasiyalarda heç biri pariteti uyğun gəlmir, buna görə də cavab -dır, əgər (\sum a \bmod 2=1).

İndi çift olduqda düşünək, bütün mümkün konfiqurasiyaları nəzərdən keçirək:

  • \text{tək+tək=çift} və buna görə də tamamlayıcı \text{çift-çift=çift}dır.

  • \text{çift+çift=çift} və buna görə də tamamlayıcı \text{çift-çift=çift}dır.

  • \text{çift+tək=tək} və buna görə də tamamlayıcı \text{çift-tək=çift}dır.

Bütün konfiqurasiyaların uyğun gəldiyini qeyd edin, buna görə də bütün cütləşmələri nəzərə alırıq ki, bu da

\sum_{i=1}^{n-1} i = 1+2+3+...+(n-1)=\frac{n(n-1)}{2}

Komplekslik .

#include<bits/stdc++.h>
using namespace std;
#define ll long long
void solve(){
    int n;cin>>n;
    vector<int>a(n);
    ll sum=0;
    for(auto &i:a){
        cin>>i;
        sum+=i;
    }
    if(sum&1){
        cout<<"0\n";
    }else{
        cout<<(ll)(n*(n-1))/2<<"\n";
    }
}
int main(){
    int t;cin>>t;
    while(t--){
        solve(); 
    }
    return 0;
}

Həll 2

Hər pariteti müvafiq olanla ardıcıl cütləşdirə bilərik və hər dəfə sayını toplaya bilərik, hər dəfə tək olanları çiftlərlə cütləşdirəcəyik və sayını sadəcə toplayırıq. Bu yalnız çift olduqda işləyir, əks halda 0-dır.

#include<bits/stdc++.h>
using namespace std;
#define ll long long
void solve(){
    int n;cin>>n;
    vector<int>a(n);
    int o=0;int e=0;
    ll sum=0;
    ll ans=0;
    for(auto i:a){
        cin>>i;
        sum+=i;
    }
    if(sum&1){
        cout<<"0\n";
        return;
    }else{
        for(auto i:a){
            ans+=e+o;
            if(i&1){
                e++;
            }else{
                o++;
            }
        }
    }
    cout<<ans<<"\n";
}
int main(){
    int t;cin>>t;
    while(t--){
        solve(); 
    }
    return 0;
}

Komplekslik .