Submission #411698

#TimeUsernameProblemLanguageResultExecution timeMemory
411698losmi247Horses (IOI15_horses)C++14
34 / 100
1595 ms24728 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 5e5+23; const int mod = 1000000007; int n; ll x[N],y[N]; ll dp[105][1005]; ll dajdp(){ for(int i = 0; i <= n; i++){ for(int j = 0; j <= 1000; j++){ dp[i][j] = -1; } } dp[0][1] = 0; for(int i = 1; i <= n; i++){ /// nakon kraja i-te godine for(ll j = 0; j <= 1000; j++){ /// imam j konja posle prodavanja int nagore = (j+x[i]-1)/x[i]; nagore *= x[i]; for(ll pre = nagore; pre <= 1000; pre += x[i]){ /// koliko sam konja imao pre prodavanja if(dp[i-1][pre/x[i]] != -1) dp[i][j] = max(dp[i][j],dp[i-1][pre/x[i]]+(pre-j)*y[i]); } } } return dp[n][0]; } bool cmp(int i,int j){ if(i == j) return 0; if(i < j){ ll prod = y[j]; for(int h = i+1; h <= j; h++){ /// da li nekad prestigne ili postane jednako y[i]? if(x[h] >= (y[i]+prod-1)/prod) return 0; else prod *= x[h]; } return 1; } else{ ll prod = y[i]; for(int h = j+1; h <= i; h++){ if(x[h] >= (y[j]+prod-1)/prod) return 1; else prod *= x[h]; } return 0; } } ll probaj(){ vector <int> v; for(int i = 1; i <= n; i++) v.push_back(i); sort(v.begin(),v.end(),cmp); int pos = v[0]; ll sol = 1; for(int i = 1; i <= pos; i++){ sol *= x[i]; sol %= mod; } sol *= y[pos]; sol %= mod; return sol; } vector <ll> novx,novy; bool cmp1(pair <int,int> a,pair <int,int> b){ int i = a.first,j = b.first; if(i == j) return 0; if(i < j){ ll prod = novy[i]; for(int h = i; h < j; h++){ /// da li nekad prestigne ili postane jednako y[i]? if(novx[h] >= (novy[j]+prod-1)/prod) return 1; else prod *= novx[h]; } return 0; } else{ ll prod = novy[j]; for(int h = j; h < i; h++){ if(novx[h] >= (novy[i]+prod-1)/prod) return 0; else prod *= novx[h]; } return 1; } } int drvox[4*N],drvoy[4*N]; void build(int i,int j,int node){ if(i == j){ drvox[node] = x[i]; drvoy[node] = y[i]; return; } int mid = i+(j-i)/2; build(i,mid,2*node); build(mid+1,j,2*node+1); drvox[node] = max(drvox[2*node],drvox[2*node+1]); drvoy[node] = max(drvoy[2*node],drvoy[2*node+1]); } void updatex(int i,int j,int pos,int val,int node){ if(i == j){ drvox[node] = val; return; } int mid = i+(j-i)/2; if(pos <= mid){ updatex(i,mid,pos,val,2*node); } else{ updatex(mid+1,j,pos,val,2*node+1); } drvox[node] = max(drvox[2*node],drvox[2*node+1]); } void updatey(int i,int j,int pos,int val,int node){ if(i == j){ drvoy[node] = val; return; } int mid = i+(j-i)/2; if(pos <= mid){ updatey(i,mid,pos,val,2*node); } else{ updatey(mid+1,j,pos,val,2*node+1); } drvoy[node] = max(drvoy[2*node],drvoy[2*node+1]); } int getx(int i,int j,int l,int r,int node){ if(j < l || i > r) return 0; if(l <= i && r >= j) return drvox[node]; int mid = i+(j-i)/2; return max(getx(i,mid,l,r,2*node),getx(mid+1,j,l,r,2*node+1)); } int gety(int i,int j,int l,int r,int node){ if(j < l || i > r) return 0; if(l <= i && r >= j) return drvoy[node]; int mid = i+(j-i)/2; return max(gety(i,mid,l,r,2*node),gety(mid+1,j,l,r,2*node+1)); } ll bit[N]; void update(int pos,ll val){ while(pos <= n){ bit[pos] *= val; bit[pos] %= mod; pos += (pos & (-pos)); } } ll daj(int pos){ ll ret = 1; while(pos){ ret *= bit[pos]; ret %= mod; pos -= (pos & (-pos)); } return ret; } ll probaj1(){ novx = novy = {0}; vector <pair<int,int>> v; int pos = n,br = 1; for(int puta = 1; puta <= 30; puta++){ /// poslednjih 30 ne nula xova if(pos <= 0) break; int l = 1,r = pos,ans = 0; while(l <= r){ int mid = l+(r-l)/2; if(getx(1,n,mid,pos,1) == 1){ ans = mid; r = mid-1; } else{ l = mid+1; } } //cout << "dobijam " << pos << " " << ans << endl; if(ans == 0){ /// nema keceva v.push_back({br,pos}); novx.push_back(x[pos]); novy.push_back(y[pos]); br++; pos--; continue; } ll sta = gety(1,n,ans,pos,1); //cout << "sta " << sta << endl; if(ans == 1){ /// nema normalan iza v.push_back({br,ans}); novx.push_back(x[ans]); novy.push_back(sta); pos = ans-1; br++; continue; } /// ima normalan iza v.push_back({br,ans-1}); novx.push_back(x[ans-1]); novy.push_back(max(y[ans-1],sta)); pos = ans-2; br++; } /*cout << "na kraju " << endl; cout << v.size() << endl; for(auto f : v){ cout << f.first << " " << f.second << endl; } cout << endl; cout << novx.size() << endl; for(auto f : novx){ cout << f << " "; } cout << endl; cout << novy.size() << endl; for(auto f : novy){ cout << f << " "; } cout << endl;*/ sort(v.begin(),v.end(),cmp1); /*cout << "posle sortiranja" << endl; cout << v.size() << endl; for(auto f : v){ cout << f.first << " " << f.second << endl; } cout << endl;*/ int poz = v[0].second; //cout << "poz je " << poz << endl; ll sol = daj(poz); //cout << "sol je " << sol << endl; ll sacim = novy[v[0].first]; sol *= sacim; sol %= mod; return sol; } ll init(int n1,int *x1,int *y1){ n = n1; for(int i = 1; i <= n; i++) x[i] = x1[i-1], y[i] = y1[i-1]; /*ll pr = 1,prvi = 1; for(int i = 1; i <= n; i++){ if(x[i] > 1000/pr) prvi = 0; else pr *= x[i]; } if(n <= 10 && prvi){ return dajdp(); }*/ build(1,n,1); for(int i = 1; i <= n; i++){ bit[i] = 1; } for(int i = 1; i <= n; i++){ update(i,x[i]); } return probaj1(); } ll fp(ll x,ll y){ if(y == 0) return 1; ll p = fp(x,y/2); p = (p*p)%mod; if(y&1) p = (p*x)%mod; return p; } ll updateX(int pos,int val){ pos++; updatex(1,n,pos,val,1); ll v = fp(x[pos],mod-2); update(pos,v); v = val; update(pos,v); x[pos] = val; return probaj1(); } ll updateY(int pos,int val){ pos++; updatey(1,n,pos,val,1); y[pos] = val; return probaj1(); } /*int main(){ ios_base::sync_with_stdio(false); cin.tie(0); int a; cin >> a; int *prvi = (int*)malloc(sizeof(int)*a); int *drugi = (int*)malloc(sizeof(int)*a); for(int i = 1; i <= a; i++){ int x; cin >> x; prvi[i-1] = x; } for(int i = 1; i <= a; i++){ int x; cin >> x; drugi[i-1] = x; } cout << init(a,prvi,drugi) << endl; cout << updateY(1,2) << endl; }*/

Compilation message (stderr)

horses.cpp: In function 'll dajdp()':
horses.cpp:21:36: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   21 |             int nagore = (j+x[i]-1)/x[i];
      |                          ~~~~~~~~~~^~~~~
horses.cpp:22:20: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   22 |             nagore *= x[i];
      |             ~~~~~~~^~~~~~~
horses.cpp: In function 'void build(int, int, int)':
horses.cpp:98:26: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   98 |         drvox[node] = x[i];
      |                       ~~~^
horses.cpp:99:26: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   99 |         drvoy[node] = y[i];
      |                       ~~~^
horses.cpp: In function 'll fp(ll, ll)':
horses.cpp:285:15: warning: declaration of 'y' shadows a global declaration [-Wshadow]
  285 | ll fp(ll x,ll y){
      |            ~~~^
horses.cpp:8:9: note: shadowed declaration is here
    8 | ll x[N],y[N];
      |         ^
horses.cpp:285:10: warning: declaration of 'x' shadows a global declaration [-Wshadow]
  285 | ll fp(ll x,ll y){
      |       ~~~^
horses.cpp:8:4: note: shadowed declaration is here
    8 | ll x[N],y[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...