Submission #316035

#TimeUsernameProblemLanguageResultExecution timeMemory
316035JovanK26Fortune Telling 2 (JOI14_fortune_telling2)C++14
35 / 100
178 ms31284 KiB
 #include <bits/stdc++.h>

using namespace std;
long long n,k,sz;
long long a[200050];
long long b[200050];
long long t[200050];
long long bit[200050];
long long comp[600150];
pair<long long,long long> pos[200050];
vector<long long> v[800250];
void insrt(long long start,long long val,long long i,long long j,long long l,long long r)
{
    if(r<i || l>j)return;
    if(l>=i && r<=j)
    {
        v[start].push_back(val);
        return;
    }
    long long m=(l+r)/2;
    insrt(2*start+1,val,i,j,l,m);
    insrt(2*start+2,val,i,j,m+1,r);
}
void check(long long start,long long j,long long tt,long long l,long long r)
{
    for(long long i=0;i<v[start].size();i++)
    {
        if(pos[v[start][i]].first<0)
        {
            pos[v[start][i]].first=j;
        }
    }
    v[start].clear();
    if(r-l==0)return;
    long long m=(l+r)/2;
    if(tt<=m)check(2*start+1,j,tt,l,m);
    else
    {
       check(2*start+2,j,tt,m+1,r);
    }
    return;
}
void update(long long x)
{
    while(x<=sz)
    {
        bit[x]++;
        x+=(x & -x);
    }
}
long long sum(long long x)
{
    long long ss=0;
    while(x>0)
    {
        ss+=bit[x];
        x-=(x & -x);
    }
    return ss;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    //ifstream fin("03-01.txt");
    //ofstream fout("01out.txt");
    cin >> n >> k;
    long long ind=0;
    for(long long i=0;i<n;i++)
    {
        cin >> a[i] >> b[i];
        comp[ind++]=a[i];
        comp[ind++]=b[i];
    }
    for(long long i=0;i<k;i++)
    {
        cin >> t[i];
        comp[ind++]=t[i];
    }
    sort(comp,comp+ind);
    sz=unique(comp,comp+ind)-comp;
    for(long long i=0;i<n;i++)
    {
        a[i]=lower_bound(comp,comp+sz,a[i])-comp;
        b[i]=lower_bound(comp,comp+sz,b[i])-comp;
        pos[i]=make_pair(-1,i);
        insrt(0,i,min(a[i],b[i]),max(a[i],b[i])-1,0,sz-1);
    }
    for(long long i=k-1;i>=0;i--)
    {
        t[i]=lower_bound(comp,comp+sz,t[i])-comp;
        check(0,i,t[i],0,sz-1);
    }
    sort(pos,pos+n);
    reverse(pos,pos+n);
    long long cur=k-1;
    long long br=0;
    long long rez=0;
    for(long long i=0;i<n;i++)
    {
        while(cur>pos[i].first)
        {
           update(t[cur--]+1);
           br++;
        }
        long long p=pos[i].second;
        long long num=(br-sum(max(a[p],b[p])))%2;
        long long st=cur>=0 ? (a[p]<b[p] ? 1 : 0) : 0;
        long long fin;
        if((num+st)%2==0)
        {
            fin=a[p];
        }
        else
        {
            fin=b[p];
        }
        rez+=comp[fin];
    }
    cout << rez;
    return 0;
}

Compilation message (stderr)

fortune_telling2.cpp: In function 'void check(long long int, long long int, long long int, long long int, long long int)':
fortune_telling2.cpp:26:24: 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]
   26 |     for(long long i=0;i<v[start].size();i++)
      |                       ~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...