답안 #966350

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
966350 2024-04-19T17:55:34 Z bachhoangxuan 커다란 상품 (IOI17_prize) C++17
컴파일 오류
0 ms 0 KB
#include "prize.h"
#include<bits/stdc++.h>
using namespace std;

const int B = 500;
const int maxn = 2e5+5;

vector<int> res[maxn];
vector<int> get(int x){
    if(!res[x].empty()) return res[x];
    res[x]=ask(x);res[x][1]+=res[x][0];
    return res[x];
}

int N,bit[maxn],Max;
void update(int x){
    for(int i=x+1;i<=N;i+=(i&(-i))) bit[i]++;
}
int query(int x){
    int ans=0;
    for(int i=x+1;i>=1;i-=(i&(-i))) ans+=bit[i];
    return ans;
}

int find_best(int n){
    N=n;
    vector<int> ord(min(n,500));
    iota(ord.begin(),ord.end(),0);
    shuffle(ord.begin(),ord.end(),rng);
    for(int i=0;i<480;i++){
        vector<int> cc=get(i);
        if(cc[1]==0) return i;
        Max=max(Max,cc[1]);
    }
    for(int i=0;i<n;i+=B){
        vector<int> p;
        for(int j=i;j<min(i+B,n);j++) p.push_back(j);
        int cnt=0;
        while(!p.empty()){
            int x=p.back();p.pop_back();
            vector<int> cc=get(x);
            if(cc[1]==0) return x;
            if(cc[1]<Max) update(x);
            else{
                cnt=cc[0]-query(x);
                break;
            }
        }
        while(cnt){
            int l=0,r=(int)p.size()-1;
            bool check=false;
            while(l<=r){
                int mid=(l+r)>>1;
                vector<int> cc=get(p[mid]);
                if(cc[1]==0) return p[mid];
                if(cc[1]<Max){
                    update(p[mid]);
                    p.erase(p.begin()+mid);
                    check=true;
                    break;
                }
                if(cc[0]-query(p[mid])) r=mid-1;
                else l=mid+1;
            }
            cnt--;
        }
    }
	return -1;
}

Compilation message

prize.cpp: In function 'int find_best(int)':
prize.cpp:29:35: error: 'rng' was not declared in this scope
   29 |     shuffle(ord.begin(),ord.end(),rng);
      |                                   ^~~