Submission #743820

#TimeUsernameProblemLanguageResultExecution timeMemory
743820Abrar_Al_SamitHorses (IOI15_horses)C++17
17 / 100
1591 ms92076 KiB
#include <bits/stdc++.h> #include "horses.h" using namespace std; const int nax = 5e5 + 2; const int mod = 1e9 + 7; const int MX = 1e9; long long x[nax], y[nax]; int n; long long mul(long long a, long long b) { return (a * b) % mod; } long long quickpow(long long a, long long b) { long long ret = 1; while(b) { if(b&1) ret = mul(ret, a); a = mul(a, a); b >>= 1; } return ret; } struct BIT { long long b[nax]; BIT() { for(int i=0; i<nax; ++i) { b[i] = 1; } } void update(int p, int val) { while(p<nax) { b[p] = mul(b[p], val); p += p&-p; } } long long query(int p) { long long ret = 1; while(p) { ret = mul(ret, b[p]); p -= p&-p; } return ret; } } fen; int seg[nax * 4]; void update(int pos, int val, int l=1, int r=n, int v=1) { if(l==r) { seg[v] = val; return; } int mid = (l+r)/2; if(pos<=mid) update(pos, val, l, mid, v*2); else update(pos, val, mid+1, r, v*2+1); seg[v] = max(seg[v*2], seg[v*2+1]); } int query(int L, int R, int l=1, int r=n, int v=1) { if(l>=L && r<=R) return seg[v]; if(l>R || r<L) return 0; int mid = (l+r)/2; return max(query(L, R, l, mid, v*2), query(L, R, mid+1, r, v*2+1)); } set<int>nonone; int mem[nax]; long long get_ans(int day) { int sell_max_day; auto it = nonone.upper_bound(day); if(it==nonone.end()) { sell_max_day = n-1; } else { sell_max_day = *it-1; } long long price = query(day+1, sell_max_day+1); long long cnt = 1; bool better = 0; for(; it!=nonone.end(); ++it) { cnt *= x[*it]; int then_sell_max_day; if(next(it)==nonone.end()) { then_sell_max_day = n-1; } else { then_sell_max_day = *next(it) - 1; } if(mem[*it]==-1) mem[*it] = query(*it+1, then_sell_max_day+1); long long then_price = mem[*it]; if(cnt * then_price > price) { better = true; break; } if(cnt>MX) { better = true; break; } } if(better) return -1; return mul(price, fen.query(day+1)); } int get() { auto it = nonone.end(); int iter = 30; long long prd = 1; while(iter--) { if(prd>MX) break; if(it!=nonone.begin()) --it; else break; prd *= *it; } if(it==nonone.begin()) { long long ans = get_ans(0); if(ans!=-1) { mem[0] = -1; return ans; } } while(it!=nonone.end()) { long long ans = get_ans(*it); if(ans!=-1) { while(it!=nonone.end()) { mem[*it] = -1; ++it; } return ans; } mem[*it] = -1; ++it; } } int init(int N, int X[], int Y[]) { n = N; for(int i=0; i<n; ++i) { x[i] = X[i], y[i] = Y[i]; fen.update(i+1, x[i]); update(i+1, y[i]); if(x[i]>1) nonone.insert(i); } memset(mem, -1, sizeof mem); return get(); } int updateX(int pos, int val) { fen.update(pos+1, quickpow(x[pos], mod-2)); fen.update(pos+1, val); if(x[pos]==1 && val>1) { nonone.insert(pos); } else if(x[pos]>1 && val==1) { nonone.erase(pos); } x[pos] = val; get(); } int updateY(int pos, int val) { update(pos+1, val); y[pos] = val; get(); }

Compilation message (stderr)

horses.cpp: In function 'int get()':
horses.cpp:124:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  124 |    return ans;
      |           ^~~
horses.cpp:134:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  134 |    return ans;
      |           ^~~
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:146:22: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  146 |   fen.update(i+1, x[i]);
      |                   ~~~^
horses.cpp:147:18: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  147 |   update(i+1, y[i]);
      |               ~~~^
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:156:28: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  156 |  fen.update(pos+1, quickpow(x[pos], mod-2));
      |                    ~~~~~~~~^~~~~~~~~~~~~~~
horses.cpp:168:1: warning: no return statement in function returning non-void [-Wreturn-type]
  168 | }
      | ^
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:175:1: warning: no return statement in function returning non-void [-Wreturn-type]
  175 | }
      | ^
horses.cpp: In function 'int get()':
horses.cpp:141:1: warning: control reaches end of non-void function [-Wreturn-type]
  141 | }
      | ^
#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...