Submission #295706

#TimeUsernameProblemLanguageResultExecution timeMemory
295706cfalasHorses (IOI15_horses)C++17
17 / 100
326 ms66096 KiB
#include<bits/stdc++.h> #include "horses.h" using namespace std; #define FORi(i,a,b) for(int i=a;i<b;i++) #define FOR(i,n) FORi(i,0,n) template<typename T> #define MID ((l+r)/2) #define len(x) ((int)((x).size())) struct seg_tree{ struct node{ T val; T laz; int left=-1; int right=-1; node() {val=0, laz=0, left=-1, right=-1;} node(T v) {val=v, laz=0, right=-1, left=-1;} }; vector<node> seg; static inline int N; const int RAND_VALUE=0; seg_tree(int n){N=n, seg.assign(1, node());} seg_tree(){seg.assign(1, node());} inline node merge(node par, node a, node b){ node ret; ret.left = par.left, ret.right = par.right; ret.val = max(a.val , b.val); return ret; } inline void update_node(int ind, int val, int l, int r){ seg[ind].val += val * (r-l+1); seg[ind].laz += val; } inline void down(node &par, int l, int r){ seg[par.left].val += par.laz * (MID-l+1); seg[par.right].val += par.laz * (r-MID); seg[par.left].laz = par.laz; seg[par.right].laz = par.laz; par.laz = 0; } inline void create_children(int ind){ node par = seg[ind]; if(par.left==-1){ //cout<<"left\n"; par.left=len(seg), seg.push_back(node()); } if(par.right==-1) par.right=len(seg), seg.push_back(node()); seg[ind] = par; } void build(vector<T>& arr, int l=0, int r=N-1, int ind=0){ if(l==r) seg[ind] = node(arr[l]); else{ create_children(ind); build(arr,l,MID,seg[ind].left); build(arr,MID+1,r,seg[ind].right); seg[ind] = merge(seg[ind], seg[seg[ind].left], seg[seg[ind].right]); } } void update(int rl, int rr, int val, int l=0, int r=N-1, int ind=0){ if(rl<=l && r<=rr) update_node(ind, val,l,r); else if(rr<l || r<rl) return; else{ create_children(ind); down(seg[ind],l,r); update(rl,rr,val,l,MID,seg[ind].left); update(rl,rr,val,MID+1,r,seg[ind].right); seg[ind] = merge(seg[ind], seg[seg[ind].left], seg[seg[ind].right]); } } node _query(int rl, int rr, int l=0, int r=N-1, int ind=0){ if(rl<=l && r<=rr) return seg[ind]; else if(rl>r || l>rr) return RAND_VALUE; else{ create_children(ind); down(seg[ind],l,r); return merge(seg[ind], _query(rl, rr, l, MID, seg[ind].left), _query(rl,rr,MID+1,r,seg[ind].right)); } } T query(int l, int r){ return _query(l,r).val; } }; seg_tree<long double> seg; typedef vector<int> vi; vi x,y; vector<long double> a; #define MOD 1000000007 int init(int N, int X[], int Y[]) { seg.N = N; a.assign(N,0); x.resize(N); y.resize(N); FOR(i,N) x[i] = X[i], y[i] = Y[i]; FOR(i,N){ if(i!=0) a[i] = a[i-1]; a[i] += log(X[i]); //cout<<log(X[i])<<" "; } //cout<<endl; FOR(i,N) a[i]+=log(Y[i]); //FOR(i,N) cout<<a[i]<<" "; //cout<<endl; seg.build(a); long double res = seg.query(0,N-1); //cout<<pow(2.718281828,res)<<endl; return round(pow(2.718281828,res)); } int updateX(int pos, int val) { seg.update(0, pos, val - x[pos]); x[pos] = val; long double res = seg.query(0,seg.N-1); //cout<<pow(2.718281828,res)<<endl; return round(pow(2.718281828,res)); } int updateY(int pos, int val) { seg.update(pos, pos, val - y[pos]); y[pos] = val; long double res = seg.query(0,seg.N-1); //cout<<pow(2.718281828,res)<<endl; return round(pow(2.718281828,res)); }

Compilation message (stderr)

horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:121:14: warning: conversion from 'long double' to 'int' may change value [-Wfloat-conversion]
  121 |  return round(pow(2.718281828,res));
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:129:14: warning: conversion from 'long double' to 'int' may change value [-Wfloat-conversion]
  129 |  return round(pow(2.718281828,res));
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:137:14: warning: conversion from 'long double' to 'int' may change value [-Wfloat-conversion]
  137 |  return round(pow(2.718281828,res));
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...