Submission #70104

#TimeUsernameProblemLanguageResultExecution timeMemory
70104AbelyanLast supper (IOI12_supper)C++17
100 / 100
158 ms31256 KiB
#include "advisor.h"
#include <bits/stdc++.h>
using namespace std;

const int N=100006;
int a[N],han[N],mp[N],vr[N];
bool pas[N],sc[N];

void ComputeAdvice(int *c, int n, int k, int m) {
    for (int i=n-1;i>=0;i--){
        a[i]=mp[c[i]]-1;
        if (mp[c[i]]==0)a[i]=2*N;
        mp[c[i]]=i+1;
    }
    priority_queue<pair<pair<int,int>,int> > pq;
    for (int i=0;i<k;i++){
        if (mp[i]==0)mp[i]=2*N;
        pq.push({{mp[i]-1,-1},i});
        vr[i]=-1;
        sc[i]=true;
    }
    for (int i=0;i<n;i++){
        if (sc[c[i]]){
            pq.push({{a[i],i},c[i]});
            vr[c[i]]=i;
            han[i]=-1;
            continue;
        }
        sc[c[i]]=true;
        int k;
        do{
            han[i]=pq.top().second;
            k=pq.top().first.second;
            pq.pop();
        }while(vr[han[i]]!=k);
        //cout<<i<< " "<<han[i]<<endl;
        sc[han[i]]=false;
        pq.push({{a[i],i},c[i]});
        vr[c[i]]=i;
    }
    //cout<<endl;
    vector<int> v;
    for (int i=n-1;i>=0;i--){
        if (pas[c[i]])v.push_back(1);
        else v.push_back(0);
        if (han[i]!=-1)
        pas[han[i]]=false;
        pas[c[i]]=true;
    }
    for (int i=k-1;i>=0;i--){
        if (pas[i])v.push_back(1);
        else v.push_back(0);
    }
    reverse(v.begin(),v.end());
    for (int i=0;i<v.size();i++){
        //cout<<v[i]<<" ";
        WriteAdvice(v[i]);
    }
    //cout<<endl;
}
#include "assistant.h"
#include <bits/stdc++.h>
using namespace std;

const int N=100006;
queue<int> s;
bool onsc[N];

void Assist(unsigned char *A, int n, int v, int R) {
    for (int i=0;i<v;i++){
        if (!A[i])s.push(i);
        onsc[i]=true;
    }
    for (int i=0;i<n;i++){
        int k=GetRequest();
        if (!A[i+v])s.push(k);
        if (onsc[k])continue;
        onsc[k]=true;
        PutBack(s.front());
        //cout<<s.front()<<endl;
        onsc[s.front()]=false;
        s.pop();

    }
}

Compilation message (stderr)

advisor.cpp: In function 'void ComputeAdvice(int*, int, int, int)':
advisor.cpp:55:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i=0;i<v.size();i++){
                  ~^~~~~~~~~
#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...