제출 #199724

#제출 시각아이디문제언어결과실행 시간메모리
199724FieryPhoenix말 (IOI15_horses)C++11
컴파일 에러
0 ms0 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <map>
#include <queue>
#include <set>
#include <iomanip>
#include <deque>
#include <cassert>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <chrono>
#include <ctime>
#include <random>
#include <stack>
#include <unordered_set>
#include <unordered_map>
#include <iterator>
#include <climits>
#include <horses.h>
using namespace std;
 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef long long ll;
typedef long double ld;
#define INF 2001001001
#define MOD 1000000007
 
ll N;
ll worth[100005],X[500001],Y[500001];
bool over[100005];
set<ll>bigInd;
ll treeMax[1000001],treeMult[1000001];
 
void updateMax(ll pos, ll val){
  pos+=N;
  treeMax[pos]=val;
  for (pos/=2;pos>=1;pos/=2)
    treeMax[pos]=max(treeMax[pos*2],treeMax[pos*2+1]);
}
 
ll queryMax(ll L, ll R){
  L+=N; R+=N;
  ll ans=0;
  while (L<=R){
    if (L%2==1)
      ans=max(ans,treeMax[L++]);
    if (R%2==0)
      ans=max(ans,treeMax[R--]);
    L/=2;
    R/=2;
  }
  return ans;
}
 
void updateMult(ll pos, ll val){
  pos+=N;
  treeMult[pos]=val;
  for (pos/=2;pos>=1;pos/=2)
    treeMult[pos]=(treeMult[pos*2]*treeMult[pos*2+1])%MOD;
}
 
ll queryMult(ll L, ll R){
  L+=N; R+=N;
  ll ans=1;
  while (L<=R){
    if (L%2==1)
      ans*=treeMult[L++];
    ans%=MOD;
    if (R%2==0)
      ans*=treeMult[R--];
    ans%=MOD;
    L/=2;
    R/=2;
  }
  return ans;
}
 
ll calc(){
  if (bigInd.size()==0)
    return queryMax(0,N-1);
  vector<ll>v;
  set<ll>::iterator it=bigInd.end();
  it--;
  for (;;){
    v.push_back(*it);
    if (it==bigInd.begin() || v.size()==31)
      break;
    it--;
  }
  reverse(v.begin(),v.end());
  ll M=v.size();
  for (ll i=0;i<=M;i++){
    worth[i]=0;
    over[i]=false;
  }
  for (ll i=M-1;i>=0;i--){
    if (over[i+1])
      worth[i]=X[v[i]]*worth[i+1];
    else{
      ll L=v[i];
      ll R;
      if (i==M-1)
	R=N-1;
      else
	R=v[i+1]-1;
      assert(L<=R);
      worth[i]=X[v[i]]*max(queryMax(L,R),worth[i+1]);
    }
    over[i]=(worth[i]>1000000000) | over[i+1];
    if (over[i])
      worth[i]%=MOD;
  }
  return (worth[0]*queryMult(0,v[0]-1))%MOD;
}
 
ll init(ll n, ll x[], ll y[]){
  N=n;
  for (ll i=0;i<N;i++){
    X[i]=x[i];
    Y[i]=y[i];
    updateMax(i,Y[i]);
    updateMult(i,X[i]);
    if (X[i]>1)
      bigInd.insert(i);
  }
  return calc();
}
 
ll updateX(ll pos, ll val){
  if (X[pos]>1 && val==1)
    bigInd.erase(pos);
  else if (X[pos]==1 && val>1)
    bigInd.insert(pos);
  X[pos]=val;
  updateMult(pos,val);
  return calc();
}
 
ll updateY(ll pos, ll val){
  Y[pos]=val;
  updateMax(pos,val);
  return calc();
}
 

컴파일 시 표준 에러 (stderr) 메시지

/tmp/cchzFeaz.o: In function `main':
grader.c:(.text.startup+0x2db): undefined reference to `init(int, int*, int*)'
grader.c:(.text.startup+0x71a): undefined reference to `updateX(int, int)'
grader.c:(.text.startup+0x8a6): undefined reference to `updateY(int, int)'
collect2: error: ld returned 1 exit status