Submission #86840

#TimeUsernameProblemLanguageResultExecution timeMemory
86840JustasZHorses (IOI15_horses)C++14
17 / 100
1252 ms48892 KiB
#include "horses.h" #include <bits/stdc++.h> #define pb push_back #define all(a) a.begin(), a.end() #define sz(a) (int)a.size() #define x first #define y second #define debug(...) "["<<#__VA_ARGS__<<": "<<__VA_ARGS__<<"]" using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int>pii; const int maxn=5e5+100; const int mod=1e9+7; mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); ll pwr(ll a, ll pw) { ll ret=1; while(pw>0) { if(pw&1)ret=ret*a%mod; a=a*a%mod; pw>>=1; } return ret; } ll modinv(ll a) { return pwr(a, mod-2); } int N; ll X[maxn], Y[maxn], seg[maxn*4]; set<int>pos; void build(int id=1, int l=0, int r=N-1) { if(l == r) { seg[id]=Y[l]; return; } int mid=(l+r)/2; build(id*2, l, mid); build(id*2+1, mid+1, r); seg[id]=max(seg[id*2], seg[id*2+1]); } void modify(int p, ll d, int id=1, int l=0, int r=N-1) { if(l == r) { seg[id]+=d; return; } int mid=(l+r)/2; if(p <= mid)modify(p, d, id*2, l, mid); else modify(p, d, id*2+1, mid+1, r); seg[id]=max(seg[id*2], seg[id*2+1]); } ll query(int x, int y, int id=1, int l=0, int r=N-1) { if(l > y || r < x)return 0; if(l >= x && r <= y)return seg[id]; int mid=(l+r)/2; return max(query(x, y, id*2, l, mid), query(x, y, id*2+1, mid+1, r)); } ll F[maxn]; void upd(int p, ll val) { for(; p<=N; p+=p&-p) F[p]=(F[p]*val)%mod; } ll get(int p) { ll ret=1; for(; p>0; p-=p&-p) ret=(ret*F[p])%mod; return ret; } int getans() { if(!sz(pos))return query(0, N-1)%mod; auto it=prev(pos.end()); for(int c=0; c<=30; c++) { if(it == pos.begin())break; --it; } ll opt=*it, xbest=X[*it], xprod=1; bool big=false; while(it != pos.end()) { xprod*=X[*it]; if(xprod > mod) { big=true; xprod%=mod; } if(big && X[*it] >= 2) { opt=*it, xbest=xprod; ++it; continue; } assert(xprod < 1e18); assert(xprod % xbest == 0); if(xprod/xbest > (query(opt, N-1)+query(*it, N-1)-1)/query(*it, N-1)) opt=*it, xbest=xprod; ++it; } return (int)(get(opt+1)*query(opt, N-1)%mod); } 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]; for(int i=N-1; i>=0; i--) if(X[i] >= 2) pos.insert(i); build(); for(int i=1; i<=N; i++) F[i]=1; for(int i=0; i<N; i++) upd(i+1, X[i]); return getans(); } int updateX(int p, int val) { upd(p+1, val*modinv(X[p])%mod); if(X[p] == 1 && val >= 2)pos.insert(p); if(X[p] >= 2 && val == 1)pos.erase(p); X[p]=val; return getans(); } int updateY(int p, int val) { ll d=val-Y[p]; modify(p, d); Y[p]=val; return getans(); } /*int main() { ios_base::sync_with_stdio(false), cin.tie(0); freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); int n, A[maxn], B[maxn]; cin>>n; for(int i=0; i<n; i++) cin>>A[i]; for(int i=0; i<n; i++) cin>>B[i]; cout<<init(n, A, B)<<"\n"; int m; cin>>m; while(m--) { int a, b, c; cin>>a>>b>>c; if(a == 1)cout<<updateX(b, c)<<"\n"; else cout<<updateY(b, c)<<"\n"; } return 0; }*/

Compilation message (stderr)

horses.cpp: In function 'int getans()':
horses.cpp:81:37: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
     if(!sz(pos))return query(0, N-1)%mod;
                        ~~~~~~~~~~~~~^~~~
In file included from /usr/include/c++/7/cassert:44:0,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:33,
                 from horses.cpp:2:
horses.cpp:104:24: warning: conversion to 'double' from 'll {aka long long int}' may alter its value [-Wconversion]
         assert(xprod < 1e18);
                        ^
horses.cpp:106:41: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
         if(xprod/xbest > (query(opt, N-1)+query(*it, N-1)-1)/query(*it, N-1))
                                         ^
horses.cpp:110:25: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
     return (int)(get(opt+1)*query(opt, N-1)%mod);
                      ~~~^~
horses.cpp:110:43: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
     return (int)(get(opt+1)*query(opt, N-1)%mod);
                                           ^
#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...