Submission #1069052

#TimeUsernameProblemLanguageResultExecution timeMemory
1069052AndreyDiversity (CEOI21_diversity)C++14
100 / 100
6167 ms254804 KiB
#include<bits/stdc++.h>
using namespace std;

long long pr[300001][101];
vector<long long> haha(300001);
vector<long long> br(300001);
vector<pair<pair<long long,long long>,long long>> bruh[300001];
const long long k = 100;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    long long n,q,l,r;
    cin >> n >> q;
    for(long long i = 1; i <= 100; i++) {
        for(long long j = 0; j <= n; j++) {
            pr[j][i] = j*(j+1)/2;
            if(j >= i) {
                pr[j][i]+=pr[j-i][i];
            }
        }
    }
    for(long long i = 1; i <= n; i++) {
        cin >> haha[i];
    }
    for(long long i = 0; i < q; i++) {
        cin >> l >> r;
        bruh[l/k].push_back({{r,l},i});
    }
    vector<long long> ans(q);
    for(long long i = 0; i < n; i++) {
        sort(bruh[i].begin(),bruh[i].end());
    }
    for(long long i = 0; i < n; i++) {
        if(i*k > n) {
            break;
        }
        if(bruh[i].size() > 0) {
            for(long long j = 0; j < br.size(); j++) {
                br[j] = 0;
            }
            long long y = bruh[i].size();
            vector<long long> wow(k+1);
            for(long long j = 0; j < bruh[i].size(); j++) {
                if(bruh[i][j].first.first >= (i+1)*k) {
                    y = j;
                    break;
                }
                r = bruh[i][j].first.first,l = bruh[i][j].first.second;
                for(long long j = l; j <= r; j++) {
                    wow[br[haha[j]]]--;
                    br[haha[j]]++;
                    wow[br[haha[j]]]++;
                }
                long long pl = 0,pr = 0,sb = 0;
                for(long long j = 1; j <= k; j++) {
                    for(long long x = 0; x < wow[j]; x++) {
                        if(pl > pr) {
                            swap(pr,pl);
                        }
                        long long m = r-l+1;
                        sb+=m*(m+1)/2;
                        sb-=pl*(pl+1)/2;
                        long long c = m-pl-j;
                        sb-=c*(c+1)/2;
                        pl+=j;
                    }
                }
                ans[bruh[i][j].second] = sb;
                for(long long j = l; j <= r; j++) {
                    br[haha[j]] = 0;
                }
                for(long long j = 0; j <= k; j++) {
                    wow[j] = 0;
                }
            }
            vector<long long> wut(0);
            for(long long j = (i+1)*k; j <= n; j++) {
                if(br[haha[j]] < k) {
                    wow[br[haha[j]]]--;
                    wow[br[haha[j]]+1]++;
                }
                else if(br[haha[j]] == k) {
                    wow[br[haha[j]]]--;
                    wut.push_back(haha[j]);
                }
                br[haha[j]]++;
                while(y < bruh[i].size() && bruh[i][y].first.first == j) {
                    vector<long long> troll(k+1);
                    for(long long z = 0; z <= k; z++) {
                        troll[z] = wow[z];
                    }
                    r = bruh[i][y].first.first,l = bruh[i][y].first.second;
                    for(long long z = l; z < (i+1)*k; z++) {
                        if(br[haha[z]] < k) {
                            wow[br[haha[z]]]--;
                            wow[br[haha[z]]+1]++;
                        }
                        else if(br[haha[z]] == k) {
                            wow[br[haha[z]]]--;
                            wut.push_back(haha[z]);
                        }
                        br[haha[z]]++;
                    }
                    long long ql = 0,qr = 0,sb = 0,m = (r-l+1);
                    for(long long j = 1; j <= k; j++) {
                        long long a = wow[j];
                        if(ql > qr) {
                            swap(ql,qr);
                        }
                        sb+=(m*(m+1)/2)*a;
                        long long d = (a+1)/2;
                        if(d > 0) {
                            sb-=pr[ql+j*(d-1)][j];
                            if(ql >= j) {
                                sb+=pr[ql-j][j];
                            }
                            long long c = m-ql-j;
                            sb-=pr[c][j];
                            if(c >= d*j) {
                                sb+=pr[c-d*j][j];
                            }
                        }
                        d = a/2;
                        swap(ql,qr);
                        if(d > 0) {
                            sb-=pr[ql+j*(d-1)][j];
                            if(ql >= j) {
                                sb+=pr[ql-j][j];
                            }
                            long long c = m-ql-j;
                            sb-=pr[c][j];
                            if(c >= d*j) {
                                sb+=pr[c-d*j][j];
                            }
                        }
                        swap(ql,qr);
                        ql+=j*((a+1)/2);
                        qr+=j*(a/2);
                    }
                    vector<long long> banana(0);
                    for(long long z = 0; z < wut.size(); z++) {
                        banana.push_back(br[wut[z]]);
                    }
                    sort(banana.begin(),banana.end());
                    for(long long z = 0; z < banana.size(); z++) {
                        long long a = banana[z];
                        if(ql > qr) {
                            swap(ql,qr);
                        }
                        sb+=m*(m+1)/2;
                        sb-=ql*(ql+1)/2;
                        long long c = m-ql-a;
                        sb-=c*(c+1)/2;
                        ql+=a;
                    }
                    ans[bruh[i][y].second] = sb;
                    for(long long z = l; z < (i+1)*k; z++) {
                        br[haha[z]]--;
                    }
                    while(!wut.empty() && br[wut[wut.size()-1]] <= k) {
                        wut.pop_back();
                    }
                    for(long long z = 0; z <= k; z++) {
                        wow[z] = troll[z];
                    }
                    y++;
                }
            }
        }
    }
    for(long long i = 0; i < q; i++) {
        cout << ans[i] << "\n";
    }
    return 0;
}

Compilation message (stderr)

diversity.cpp: In function 'int main()':
diversity.cpp:41:36: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   41 |             for(long long j = 0; j < br.size(); j++) {
      |                                  ~~^~~~~~~~~~~
diversity.cpp:46:36: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<std::pair<long long int, long long int>, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   46 |             for(long long j = 0; j < bruh[i].size(); j++) {
      |                                  ~~^~~~~~~~~~~~~~~~
diversity.cpp:90:25: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<std::pair<long long int, long long int>, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |                 while(y < bruh[i].size() && bruh[i][y].first.first == j) {
      |                       ~~^~~~~~~~~~~~~~~~
diversity.cpp:144:44: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  144 |                     for(long long z = 0; z < wut.size(); z++) {
      |                                          ~~^~~~~~~~~~~~
diversity.cpp:148:44: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  148 |                     for(long long z = 0; z < banana.size(); z++) {
      |                                          ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...