답안 #646432

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
646432 2022-09-29T19:19:06 Z sofijavelkovska Diversity (CEOI21_diversity) C++14
0 / 100
1 ms 212 KB
#include <bits/stdc++.h>
using namespace std;

long long sqrtn;

bool queriessort(tuple<long long, long long, long long> x, tuple<long long, long long, long long> y)
{
    long long l1, r1, i1, l2, r2, i2;
    tie(l1, r1, i1)=x;
    tie(l2, r2, i2)=y;
    if (l1/sqrtn==l2/sqrtn)
        return r1<r2;

    return (l1/sqrtn<l2/sqrtn);
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    long long n, q, i;
    cin >> n >> q;
    long long a[n];
    tuple<long long, long long, long long> queries[q];
    sqrtn=sqrt(n);
    for (i=0; i<n; i++)
        cin >> a[i];
    for (i=0; i<q; i++)
    {
        long long l, r;
        cin >> l >> r;
        queries[i]={l-1, r-1, i};
    }
    sort(queries, queries+q, queriessort);
    long long frequency[300001]={0}, compressed[n+1]={0};
    long long x=0, y=0;
    set<long long> nonzero;
    frequency[a[0]]=1;
    compressed[1]=1;
    nonzero.insert(1);
    long long answer[q];
    for (i=0; i<q; i++)
    {
        long long lt, rt, index;
        tie(lt, rt, index)=queries[i];
        if (i!=0 && lt/sqrtn>get<0>(queries[i-1])/sqrtn)
        {
            x=lt-lt%sqrtn;
            y=lt-lt%sqrtn;
            for (int j=0; j<=300000; j++)
                frequency[j]=0;
            for (int j=0; j<=n; j++)
                compressed[j]=0;
            nonzero.clear();
            frequency[a[x]]=1;
            compressed[1]=1;
            nonzero.insert(1);
        }
        /*while (lt>x)
        {
            compressed[frequency[a[x]]]=compressed[frequency[a[x]]]-1;
            if (compressed[frequency[a[x]]]==0)
                nonzero.erase(frequency[a[x]]);
            frequency[a[x]]=frequency[a[x]]-1;
            compressed[frequency[a[x]]]=compressed[frequency[a[x]]]+1;
            if (compressed[frequency[a[x]]]==1)
                nonzero.insert(frequency[a[x]]);
            x=x+1;
        }
        while (lt<x)
        {
            x=x+1;
            compressed[frequency[a[x]]]=compressed[frequency[a[x]]]-1;
            if (compressed[frequency[a[x]]]==0)
                nonzero.erase(frequency[a[x]]);
            frequency[a[x]]=frequency[a[x]]+1;
            compressed[frequency[a[x]]]=compressed[frequency[a[x]]]+1;
            if (compressed[frequency[a[x]]]==1)
                nonzero.insert(frequency[a[x]]);
        }
        while (rt>y)
        {
            y=y+1;
            compressed[frequency[a[y]]]=compressed[frequency[a[y]]]-1;
            if (compressed[frequency[a[y]]]==0)
                nonzero.erase(frequency[a[y]]);
            frequency[a[y]]=frequency[a[y]]+1;
            compressed[frequency[a[y]]]=compressed[frequency[a[y]]]+1;
            if (compressed[frequency[a[y]]]==1)
                nonzero.insert(frequency[a[y]]);
        }
        while (rt<y)
        {
            compressed[frequency[a[y]]]=compressed[frequency[a[y]]]-1;
            if (compressed[frequency[a[x]]]==0)
                nonzero.erase(frequency[a[x]]);
            frequency[a[y]]=frequency[a[y]]-1;
            compressed[frequency[a[y]]]=compressed[frequency[a[y]]]+1;
            if (compressed[frequency[a[y]]]==1)
                nonzero.insert(frequency[a[y]]);
            y=y-1;
        }*/
        long long l=0;
        long long r=0;
        bool odd=false;
        long long nc=y-x+1;
        nonzero.erase(0);
        long long kc=0;
        for (auto xc : nonzero)
            kc=kc+compressed[xc];
        long long s=kc*nc*(nc+1)-nc*(kc-1);
        for (auto xc : nonzero)
        {
            long long n1, n2;
            if (compressed[xc]%2==1)
            {
                if (odd)
                {
                   n1=compressed[xc]/2;
                   n2=(compressed[xc]+1)/2;
                   odd=false;
                }
                else
                {
                    n1=(compressed[xc]+1)/2;
                    n2=compressed[xc]/2;
                    odd=true;
                }
            }
            else
            {
                n1=compressed[xc]/2;
                n2=compressed[xc]/2;
            }
            s=s-(n1*l*l+xc*xc*((n1-1)*n1*(2*(n1-1)+1)/6)+2*xc*l*((n1-1)*n1/2));
            s=s-(n1*(nc-l-xc)*(nc-l-xc)+xc*xc*((n1-1)*n1*(2*(n1-1)+1)/6)-2*xc*(nc-l-xc)*((n1-1)*n1/2));
            s=s-(n2*r*r+xc*xc*((n2-1)*n2*(2*(n2-1)+1)/6)+2*xc*r*((n2-1)*n2/2));
            s=s-(n2*(nc-r-xc)*(nc-r-xc)+xc*xc*((n2-1)*n2*(2*(n2-1)+1)/6)-2*xc*(nc-r-xc)*((n2-1)*n2/2));
            l=l+n1*xc;
            r=r+n2*xc;
        }
        s=s/2;
        answer[index]=s;
    }
    for (i=0; i<q; i++)
        cout << answer[i] << '\n';

    return 0;
}



/*#include <bits/stdc++.h>
using namespace std;

int main()
{
    long long n, q, t, i, j;
    long long s=0, p=0, m=LLONG_MAX;
    vector<long long> b;
    cin >> n >> q;
    long long a[300001]={0};
    for (i=0; i<n; i++)
    {
        cin >> t;
        a[t]=a[t]+1;
    }
    for (i=0; i<q; i++)
        cin >> t >> t;
    for (i=1; i<=300000; i++)
        if (a[i]!=0)
            b.push_back(a[i]);
    sort(b.begin(), b.end());
    long long c[b.size()];
    for (i=0; i<b.size()/2; i++)
        c[i]=b[2*i];
    for (i=0; i<b.size()/2; i++)
        c[b.size()-1-i]=b[2*i+1];
    if (b.size()%2==1)
        c[b.size()/2]=b[b.size()-1];

    t=0;
    for (i=0; i<b.size(); i++)
        s=s+c[i]+c[i]*(c[i]-1)/2;
    for (i=b.size()-2; i>=0; i--)
    {
        p=p+t+2*c[i+1];
        s=s+c[i]*p;
        t=t+c[i+1];
    }
    cout << s;

    return 0;
}*/



/*#include <bits/stdc++.h>
using namespace std;

int main()
{
    long long n, q, t, i, j;
    long long s=0, m=LLONG_MAX;
    vector<long long> b;
    cin >> n >> q;
    long long a[300001]={0};
    for (i=0; i<n; i++)
    {
        cin >> t;
        a[t]=a[t]+1;
    }
    for (i=0; i<q; i++)
        cin >> t >> t;
    for (i=1; i<=300000; i++)
        if (a[i]!=0)
            b.push_back(a[i]);
    sort(b.begin(), b.end());
    long long c[b.size()];
    for (i=0; i<b.size()/2; i++)
        c[i]=b[2*i];
    for (i=0; i<b.size()/2; i++)
        c[b.size()-1-i]=b[2*i+1];
    if (b.size()%2==1)
        c[b.size()/2]=b[b.size()-1];
    for (i=0; i<b.size(); i++)
        s=s+c[i]+c[i]*(c[i]-1)/2;
    for (j=1; j<b.size(); j++)
        for (i=0; i+j<b.size(); i++)
            s=s+(j+1)*c[i]*c[i+j];
    cout << s;

    return 0;
}*/



/*#include <bits/stdc++.h>
using namespace std;

int main()
{
    long long n, q, t, i, j;
    long long s=0, m=LLONG_MAX;
    vector<long long> b;
    cin >> n >> q;
    long long a[24]={0};
    for (i=0; i<n; i++)
    {
        cin >> t;
        a[t]=a[t]+1;
    }
    for (i=0; i<q; i++)
        cin >> t >> t;
    for (i=1; i<=23; i++)
        if (a[i]!=0)
            b.push_back(a[i]);
    sort(b.begin(), b.end());
    long long c[b.size()];
    for (i=0; i<b.size()/2; i++)
        c[i]=b[2*i];
    for (i=0; i<b.size()/2; i++)
        c[b.size()-1-i]=b[2*i+1];
    if (b.size()%2==1)
        c[b.size()/2]=b[b.size()-1];
    long long memo[b.size()];
    for (i=0; i<b.size(); i++)
        memo[i]=c[i];
    for (i=0; i<(1<<b.size()/2); i++)
    {
        for (j=0; j<b.size()/2; j++)
            if (i&(1<<j))
                swap(c[j], c[b.size()-1-j]);
        s=0;
        for (j=0; j<b.size(); j++)
            s=s+c[j]+c[j]*(c[j]-1)/2;
        for (j=1; j<b.size(); j++)
            for (t=0; t+j<b.size(); t++)
                s=s+(j+1)*c[t]*c[t+j];
        m=min(s, m);
        for (j=0; j<b.size(); j++)
            c[j]=memo[j];
    }
    cout << m;

    return 0;
}*/




/*#include <bits/stdc++.h>
using namespace std;

int main()
{
    long long n, q, t, i, j;
    long long s=0, m=LLONG_MAX;
    vector<long long> b;
    cin >> n >> q;
    long long a[12]={0};
    for (i=0; i<n; i++)
    {
        cin >> t;
        a[t]=a[t]+1;
    }
    for (i=0; i<q; i++)
        cin >> t >> t;
    for (i=1; i<=11; i++)
        if (a[i]!=0)
            b.push_back(i);
    do {
        s=0;
        for (i=0; i<b.size(); i++)
            s=s+a[b[i]]+a[b[i]]*(a[b[i]]-1)/2;
        for (j=1; j<b.size(); j++)
            for (i=0; i+j<b.size(); i++)
                s=s+(j+1)*a[b[i]]*a[b[i+j]];
        m=min(s, m);
    } while (next_permutation(b.begin(), b.end()));
    cout << m;

    return 0;
}*/




/*#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n, q, t, i, j;
    long long s=0, m=LLONG_MAX;
    set<int> st;
    cin >> n >> q;
    int a[n];
    for (i=0; i<n; i++)
        cin >> a[i];
    for (i=0; i<q; i++)
        cin >> t >> t;
    sort(a, a+n);
    do {
        s=0;
        for (i=0; i<n; i++)
            for (j=i+1; j<=n; j++)
            {
                st.clear();
                for (t=i; t<j; t++)
                    st.insert(a[t]);
                s=s+st.size();
            }
        m=min(m, s);
    } while (next_permutation(a, a+n));
    cout << m;

    return 0;
}*/

Compilation message

diversity.cpp: In function 'int main()':
diversity.cpp:36:15: warning: variable 'frequency' set but not used [-Wunused-but-set-variable]
   36 |     long long frequency[300001]={0}, compressed[n+1]={0};
      |               ^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -