#include "horses.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e5+5;
const int MAXV=1e9;
const int MOD=1e9+7;
int n;
int a[MAXN];
int x[MAXN];
struct SegmentTree
{
int tree[4*MAXN];
void init()
{
fill(tree,tree+4*n,0);
}
void build(int node,int l,int r)
{
if(l==r)
{
tree[node]=a[l];
return;
}
int mid=(l+r)/2;
build(2*node,l,mid);
build(2*node+1,mid+1,r);
tree[node]=max(tree[2*node],tree[2*node+1]);
}
void update(int node,int l,int r,int pos,int val)
{
if(l==r)
{
tree[node]=val;
return;
}
int mid=(l+r)/2;
if(pos<=mid) update(2*node,l,mid,pos,val);
if(mid<pos) update(2*node+1,mid+1,r,pos,val);
tree[node]=max(tree[2*node], tree[2*node+1]);
}
int query(int node,int l,int r,int ql,int qr)
{
if(ql<=l && r<=qr) return tree[node];
int ret=0;
int mid=(l+r)/2;
if(ql<=mid) ret=max(ret, query(2*node,l,mid,ql,qr));
if(mid<qr) ret=max(ret, query(2*node+1,mid+1,r,ql,qr));
return ret;
}
void update(int pos,int val)
{
update(1,1,n,pos,val);
}
int query(int l,int r)
{
return query(1,1,n,l,r);
}
};
SegmentTree tree;
long long prod=1;
set<int> mlts;
int fastPow(long long x,int pwr)
{
long long ret=1;
while(pwr)
{
if(pwr&1) ret=ret*x%MOD;
pwr/=2;
x=x*x%MOD;
}
return ret;
}
int inv(int x)
{
return fastPow(x,MOD-2);
}
int query()
{
vector<int> pos;
long long tmp=1;
for(auto it=mlts.rbegin();it!=mlts.rend();it++)
{
if(tmp>=MAXV) break;
pos.push_back((*it));
tmp*=x[(*it)];
}
reverse(pos.begin(), pos.end());
long long T=prod*inv(tmp)%MOD;
//for(auto x: pos) cout<<x<<" "; cout<<endl;
vector<pair<int,int> > cur;
for(int i=0;i<pos.size();i++)
{
int r=((i+1<pos.size()) ? pos[i+1]-1 : n);
cur.push_back({x[pos[i]], tree.query(pos[i],r)});
}
long long ret=1;
tmp=1;
for(int i=0;i<cur.size();i++)
{
tmp*=cur[i].first;
if(tmp>LLONG_MAX/cur[i].second) cout<<1/0<<endl;
ret=max(ret, tmp*cur[i].second);
}
return T*ret%MOD;
/*
int bst=a[n];
int ret=prod;
long long curProd=x[n];
for(int i=pos.size()-1;i>=0;i--)
{
if(pos[i]==n) continue;
int l=pos[i];
int r=(i+1<pos.size() ? pos[i+1]-1 : n-1);
int mx=tree.query(l,r);
if(mx>curProd*bst)
{
ret=ret*inv(curProd);
bst=mx;
curProd=1;
}
curProd*=x[l];
}
return 1LL*ret*bst%MOD;
*/
}
int init(int N, int X[], int Y[])
{
n=N;
for(int i=1;i<=n;i++) a[i]=Y[i-1];
for(int i=1;i<=n;i++) x[i]=X[i-1];
prod=1;
for(int i=1;i<=n;i++)
{
if(x[i]>1) mlts.insert(i);
prod=prod*x[i]%MOD;
}
tree.init();
tree.build(1,1,n);
return query();
}
int updateX(int pos, int val)
{
pos++;
if(x[pos]==1) mlts.insert(pos);
else mlts.erase(pos);
mlts.insert(1);
prod=prod*inv(x[pos])%MOD;
x[pos]=val;
prod=prod*x[pos]%MOD;
return query();
}
int updateY(int pos, int val)
{
pos++;
a[pos]=val;
tree.update(pos,val);
return query();
}
컴파일 시 표준 에러 (stderr) 메시지
horses.cpp: In function 'int query()':
horses.cpp:115:56: warning: division by zero [-Wdiv-by-zero]
115 | if(tmp>LLONG_MAX/cur[i].second) cout<<1/0<<endl;
| ~^~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |