Submission #893339

#TimeUsernameProblemLanguageResultExecution timeMemory
893339vjudge1Izbori (COCI22_izbori)C++17
40 / 110
3064 ms9280 KiB
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#include <set>
#include <map>
#include <cstring>
#include <string>
#include <cmath>
#include <cassert>
#include <ctime>
#include <algorithm>
#include <sstream>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <cstdlib>
#include <cstdio>
#include <iterator>
#include <functional>
#include <unordered_set>
#include <unordered_map>
#include <stdio.h>
#include <bitset>
#include <cstdint>
#include <cassert>
#include <functional>
#include <complex>
#include <climits>
#include <random>
using namespace std;
   
#define ll long long
#define pb push_back
#define ull unsigned long long
#define F first
#define S second
#define all(v) v.begin(), v.end()

int n;
int a[200005];

struct segTree{
    int t[400010 * 4];
    void upd(int idx, int v = 1, int l = 0, int r = 2 * n){
        if(l == r){
            t[v]++;
            return;
        }
        int m = (l + r) / 2;
        if(idx <= m) upd(idx, v * 2, l, m);
        else upd(idx, v * 2 + 1, m + 1, r);
        t[v] = t[v * 2] + t[v * 2 + 1];
    }
    int get(int l, int r, int v = 1, int tl = 0, int tr = 2 * n){
        if(tr < l || r < tl) return 0;
        if(l <= tl && tr <= r) return t[v];
        int m = (tl + tr) / 2;
        return get(l, r, v * 2, tl, m) + get(l, r, v * 2 + 1, m + 1, tr);
    }
} ver[2];

void sub3(){
    int pref[2][n + 1];
    for(int i = 0; i < 2; i++){
        for(int j = 1; j <= n; j++) pref[i][j] = 0;
    }
    for(int i = 1; i <= n; i++){
        if(a[i] == 2) a[i] = 1;
        else a[i] = 0;
    }
    for(int i = 1; i <= n; i++){
        pref[0][i] = pref[0][i - 1] + (a[i] == 0 ? 1 : -1);
        pref[1][i] = pref[1][i - 1] + (a[i] == 1 ? 1 : -1);
    }
    ll ans = 0;
    for(int i = 0; i < 2; i++){
        ver[i].upd(0 + n);
        for(int j = 1; j <= n; j++){
            int x = pref[i][j];
            //cout << x << "\n";
            //cout << x + n << " " << x - 1 + n << "\n";
            ver[i].upd(x + n);
            ans += ver[i].get(0, x - 1 + n);
            //cout << j << " " << ans << "\n";
        }
    }
    cout << ans;
}

void sub12(){
    ll ans = 0;
    for(int l = 1; l <= n; l++){
        ans += 1;
        bool f = 1;
        int sz = 1, d = a[l];
        map<int, int> cnt;
        ++cnt[d];
        for(int r = l + 1; r <= n; r++){
            ++cnt[a[r]];
            if(a[r] == d) sz++;
            else if(cnt[a[r]] > sz) sz = cnt[a[r]], d = a[r];
            if(sz > (r - l + 1) / 2) f = 1;
            else f = 0;
            ans += f;
        }
    }
    cout << ans;
}

void solve(){
    cin >> n;
    bool s3 = 1;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        s3 &= (a[i] <= 2);
    }
    if(s3) sub3();
    else sub12();
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL), cout.tie(NULL);
    int xach = 1; 
    //cin >> xach;
    while(xach--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...