제출 #126501

#제출 시각아이디문제언어결과실행 시간메모리
126501dragonslayerit말 (IOI15_horses)C++14
100 / 100
406 ms53052 KiB
#include "horses.h"
#include <algorithm>
#include <cmath>
#include <cstdio>

const int MOD=1e9+7;

struct Number{
  int rem;
  double lg;
  Number(int x):rem(x),lg(std::log(x)){
  }
  Number(int rem,double lg):rem(rem),lg(lg){
  }
  Number operator*(Number num)const{
    return Number(1LL*rem*num.rem%MOD,lg+num.lg);
  }
  bool operator<(Number num)const{
    return lg<num.lg;
  }
};

struct Node{
  Number mult,sell;
  Node():mult(1),sell(1){
  }
  Node(Number mult,Number sell):mult(mult),sell(sell){
  }
}st[1000000];
int xs[1000000];
int ys[1000000];
int N;

Node combine(Node a,Node b){
  return Node(a.mult*b.mult,std::max(a.sell,a.mult*b.sell));
}

void pull(int i){
  st[i]=combine(st[i<<1],st[i<<1|1]);
}

void recalc(int i){
  st[i+N]=Node(Number(xs[i]),Number(xs[i])*Number(ys[i]));
  for(i+=N;i>1;i>>=1){
    pull(i>>1);
  }
}

Node query(int a,int b){
  Node lsum,rsum;
  for(a+=N,b+=N;a<b;a>>=1,b>>=1){
    if(a&1) lsum=combine(lsum,st[a++]);
    if(b&1) rsum=combine(st[--b],rsum);
  }
  return combine(lsum,rsum);
}

/*
void dump(){
  for(int i=0;i<N*2;i++){
    printf("(%d,%d)",st[i].mult.rem,st[i].sell.rem);
  }
  Node res=query(0,N);
  printf(":(%d,%d)\n",res.mult.rem,res.sell.rem);
}
*/

int init(int N, int X[], int Y[]) {
  ::N=N;
  std::copy(X,X+N,xs);
  std::copy(Y,Y+N,ys);
  for(int i=0;i<N;i++){
    recalc(i);
  }
  //dump();
  return query(0,N).sell.rem;
}

int updateX(int pos, int val) {
  xs[pos]=val;
  recalc(pos);
  //dump();
  return query(0,N).sell.rem;
}

int updateY(int pos, int val) {
  ys[pos]=val;
  recalc(pos);
  //dump();
  return query(0,N).sell.rem;
}

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

horses.cpp: In constructor 'Number::Number(int, double)':
horses.cpp:13:28: warning: declaration of 'lg' shadows a member of 'Number' [-Wshadow]
   Number(int rem,double lg):rem(rem),lg(lg){
                            ^
horses.cpp:10:10: note: shadowed declaration is here
   double lg;
          ^~
horses.cpp:13:28: warning: declaration of 'rem' shadows a member of 'Number' [-Wshadow]
   Number(int rem,double lg):rem(rem),lg(lg){
                            ^
horses.cpp:9:7: note: shadowed declaration is here
   int rem;
       ^~~
horses.cpp: In member function 'Number Number::operator*(Number) const':
horses.cpp:16:34: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
     return Number(1LL*rem*num.rem%MOD,lg+num.lg);
                   ~~~~~~~~~~~~~~~^~~~
horses.cpp: In constructor 'Node::Node(Number, Number)':
horses.cpp:27:32: warning: declaration of 'sell' shadows a member of 'Node' [-Wshadow]
   Node(Number mult,Number sell):mult(mult),sell(sell){
                                ^
horses.cpp:24:15: note: shadowed declaration is here
   Number mult,sell;
               ^~~~
horses.cpp:27:32: warning: declaration of 'mult' shadows a member of 'Node' [-Wshadow]
   Node(Number mult,Number sell):mult(mult),sell(sell){
                                ^
horses.cpp:24:10: note: shadowed declaration is here
   Number mult,sell;
          ^~~~
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:68:33: warning: declaration of 'N' shadows a global declaration [-Wshadow]
 int init(int N, int X[], int Y[]) {
                                 ^
horses.cpp:32:5: note: shadowed declaration is here
 int N;
     ^
#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...