Submission #1270280

#TimeUsernameProblemLanguageResultExecution timeMemory
1270280StefanSebezLast supper (IOI12_supper)C++20
0 / 100
235 ms17008 KiB
#include "advisor.h"
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
#define mp make_pair
const int N=1e5+50,lg=15,inf=1e9;
struct Node{int maks,i;};
Node Merge(Node a,Node b){if(a.maks>=b.maks) return a;return b;}
struct SegTree{
    int root,nc,lc[2*N],rc[2*N];Node node[2*N];
    SegTree(){node[0]={-inf,-inf};}
    void Update(int &c,int ss,int se,int qind,int qval){
        if(!c) c=++nc,node[c]={-inf,ss};
        if(ss==se){node[c]={qval,ss};return;}
        int mid=ss+se>>1;
        if(qind<=mid)Update(lc[c],ss,mid,qind,qval);
        else Update(rc[c],mid+1,se,qind,qval);
        node[c]=Merge(node[lc[c]],node[rc[c]]);
    }
    Node Get(int c,int ss,int se,int qs,int qe){
        if(qs>qe||qe<ss||se<qs)return {-inf,-inf};
        if(qs<=ss&&se<=qe)return node[c];
        int mid=ss+se>>1;
        return Merge(Get(lc[c],ss,mid,qs,qe),Get(rc[c],mid+1,se,qs,qe));
    }
}ST;
vector<int>ind[N];
void ComputeAdvice(int *C, int n, int K, int m1) {
    if(m1==10000) return;
    vector<int>ids;
    for(int i=0;i<n;i++) ind[C[i]].pb(i);
    for(int i=0;i<=n;i++) ind[i].pb(inf);
    map<int,int>mapa,id;
    int niz[K+10];
    for(int i=0;i<K;i++){
        mapa[i]++;niz[i]=i;id[i]=i;
        int lb=lower_bound(ind[i].begin(),ind[i].end(),0)-ind[i].begin();
        int x=ind[i][lb];
        //printf("%i: %i\n",i,x);
        ST.Update(ST.root,0,K-1,i,x);
    }
    //for(int j=0;j<K;j++) printf("%i ",ST.Get(ST.root,0,K-1,j,j).maks);printf("\n");
    for(int i=0;i<n;i++){
        if(mapa[C[i]]>0){
            ids.pb(K);
            int j=id[C[i]];
            int lb=lower_bound(ind[C[i]].begin(),ind[C[i]].end(),i+1)-ind[C[i]].begin();
            int y=ind[C[i]][lb];
            ST.Update(ST.root,0,K-1,j,y);
            continue;
        }
        Node x=ST.Get(ST.root,0,K-1,0,K-1);
        int lb=lower_bound(ind[C[i]].begin(),ind[C[i]].end(),i+1)-ind[C[i]].begin();
        int y=ind[C[i]][lb];
        ST.Update(ST.root,0,K-1,x.i,y);
        ids.pb(x.i);
        mapa[niz[x.i]]--;
        mapa[C[i]]++;
        niz[x.i]=C[i];
        //for(int j=0;j<K;j++) printf("%i ",ST.Get(ST.root,0,K-1,j,j).maks);printf("\n");
    }
    //for(auto i:ids) printf("%i ",i);printf("\n");
    for(auto i:ids){
        for(int j=0;j<lg;j++){
            WriteAdvice((i>>j)%2);
        }
    }
}
#include "assistant.h"
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
#define mp make_pair
const int N=1e5+50,lg=15;
int ids[N];
void Assist(unsigned char *A, int n, int K, int m){
    if(m==10000) return;
    for(int i=0;i<m;i++){
        if(A[i]==1) ids[i/lg]^=1<<(i%lg);
    }
    //for(int i=0;i<n;i++) printf("%i ",ids[i]);printf("\n");
    /*for(int i=0;i*lg+lg<=m;i++){
        for(int j=i*lg,k=0;j<i*lg+lg;j++,k++){
            if(A[j]==1) ids[i]^=1<<k;
        }
    }*/
    int niz[K+10];
    for(int i=0;i<K;i++) niz[i]=i;
    for(int i=0;i<n;i++){
        int x=GetRequest();
        if(ids[i]>=K) continue;
        PutBack(niz[ids[i]]);
        niz[ids[i]]=x;
    }
    /*for (int i = 0; i < N; i++) {
    int req = GetRequest();
    if (req >= K)
      PutBack(req % K);
    }*/
}
#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...