# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
649508 |
2022-10-10T10:35:07 Z |
ToroTN |
Horses (IOI15_horses) |
C++14 |
|
428 ms |
29552 KB |
#include<bits/stdc++.h>
using namespace std;
#include "horses.h"
#define ll long long
#define X first
#define Y second
ll n,x[500005],y[500005],md=1e9+7,nw,fight;
ll seg[2000005],val,str,ans,last,mul[2000005],big;
void build(ll tree,ll st,ll ed)
{
ll md=(st+ed)/2;
if(st==ed)
{
seg[tree]=y[ed];
mul[tree]=x[ed];
return;
}
build(2*tree,st,md);
build(2*tree+1,md+1,ed);
seg[tree]=max(seg[2*tree],seg[2*tree+1]);
mul[tree]=1;
if(mul[2*tree]!=0)
{
mul[tree]=(mul[tree]*mul[2*tree]);
mul[tree]%=1000000007;
}
if(mul[2*tree+1]!=0)
{
mul[tree]=(mul[tree]*mul[2*tree+1]);
mul[tree]%=1000000007;
}
}
void update(ll tree,ll st,ll ed,ll idx,ll val)
{
ll md=(st+ed)/2;
if(st==ed)
{
seg[tree]=y[idx];
mul[tree]=x[idx];
return;
}
if(idx<=md)
{
update(2*tree,st,md,idx,val);
}else
{
update(2*tree+1,md+1,ed,idx,val);
}
seg[tree]=max(seg[2*tree],seg[2*tree+1]);
mul[tree]=1;
if(mul[2*tree]!=0)
{
mul[tree]=(mul[tree]*mul[2*tree]);
mul[tree]%=1000000007;
}
if(mul[2*tree+1]!=0)
{
mul[tree]=(mul[tree]*mul[2*tree+1]);
mul[tree]%=1000000007;
}
}
ll query(ll tree,ll st,ll ed,ll l,ll r)
{
ll md=(st+ed)/2;
if(st>r||ed<l)return -1e9;
if(st>=l&&ed<=r)return seg[tree];
return max(query(2*tree,st,md,l,r),query(2*tree+1,md+1,ed,l,r));
}
ll query2(ll tree,ll st,ll ed,ll l,ll r)
{
ll md=(st+ed)/2;
if(st>r||ed<l)return 1;
if(st>=l&&ed<=r)return mul[tree];
return (query2(2*tree,st,md,l,r)*query2(2*tree+1,md+1,ed,l,r))%1000000007;
}
set<ll> s;
stack<pair<ll,ll> > stk;
int init(int N, int X[], int Y[]) {
n=N;
for(int i=1;i<=n;i++)
{
x[i]=X[i-1];
y[i]=Y[i-1];
}
build(1,1,n);
/*printf("%lld\n",mul[1]);
for(int i=1;i<=7;i++)
{
printf("%d %lld\n",i,mul[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%d %d %lld\n",i,j,query2(1,1,n,(ll)i,(ll)j));
}
}*/
for(int i=1;i<n;i++)
{
if(x[i]>1)s.insert(i);
if((int)s.size()>20)
{
if(s.find(*s.begin())!=s.end())
{
s.erase(s.begin());
}
}
}
for(auto it=s.begin();it!=s.end();it++)
{
stk.push({*it,query(1,1,n,(*it)+1,n)});
}
nw=n;
str=y[n];
ans=str;
while(!stk.empty())
{
fight=stk.top().X;
val=stk.top().Y;
//printf("%lld %lld\n",fight,val);
stk.pop();
if(str>1e9)
{
str=1e18;
ans*=x[nw];
ans%=md;
}else
{
if(val>str*x[nw])
{
str=val;
ans=val;
}else
{
str*=x[nw];
ans*=x[nw];
ans%=md;
}
}
if(y[fight]>str)
{
str=y[fight];
ans=y[fight];
}
nw=fight;
}
big=query2(1,1,n,1,nw);
//printf("%lld\n",big);
if(str>1e9)
{
str=1e18;
ans*=big;
ans%=md;
return ans;
}else
{
last=seg[1];
if(last>str*big)
{
return last;
}else
{
ans*=big;
ans%=md;
return ans;
}
}
}
int updateX(int pos, int val) {
++pos;
x[pos]=val;
update(1,1,n,pos,val);
if(pos<n)
{
if(x[pos]>1)
{
s.insert(pos);
}else
{
if(s.find(pos)!=s.end())
{
s.erase(pos);
}
}
if(s.size()>20)
{
if(s.find(*s.begin())!=s.end())
{
s.erase(*s.begin());
}
}
}
for(auto it=s.begin();it!=s.end();it++)
{
stk.push({*it,query(1,1,n,(*it)+1,n)});
}
nw=n;
str=y[n];
ans=str;
while(!stk.empty())
{
fight=stk.top().X;
val=stk.top().Y;
//printf("%lld %lld\n",fight,val);
stk.pop();
if(str>1e9)
{
str=1e18;
ans*=x[nw];
ans%=md;
}else
{
if(val>str*x[nw])
{
str=val;
ans=val;
}else
{
str*=x[nw];
ans*=x[nw];
ans%=md;
}
}
if(y[fight]>str)
{
str=y[fight];
ans=y[fight];
}
nw=fight;
}
big=query2(1,1,n,1,nw);
//printf("%lld\n",big);
if(str>1e9)
{
str=1e18;
ans*=big;
ans%=md;
return ans;
}else
{
last=seg[1];
if(last>str*big)
{
return last;
}else
{
ans*=big;
ans%=md;
return ans;
}
}
}
int updateY(int pos, int val) {
++pos;
y[pos]=val;
update(1,1,n,pos,val);
for(auto it=s.begin();it!=s.end();it++)
{
stk.push({*it,query(1,1,n,(*it)+1,n)});
}
nw=n;
str=y[n];
ans=str;
while(!stk.empty())
{
fight=stk.top().X;
val=stk.top().Y;
//printf("%lld %lld\n",fight,val);
stk.pop();
if(str>1e9)
{
str=1e18;
ans*=x[nw];
ans%=md;
}else
{
if(val>str*x[nw])
{
str=val;
ans=val;
}else
{
str*=x[nw];
ans*=x[nw];
ans%=md;
}
}
if(y[fight]>str)
{
str=y[fight];
ans=y[fight];
}
nw=fight;
}
big=query2(1,1,n,1,nw);
//printf("%lld\n",big);
if(str>1e9)
{
str=1e18;
ans*=big;
ans%=md;
return ans;
}else
{
last=seg[1];
if(last>str*big)
{
return last;
}else
{
ans*=big;
ans%=md;
return ans;
}
}
}
Compilation message
horses.cpp: In function 'void build(long long int, long long int, long long int)':
horses.cpp:11:5: warning: declaration of 'md' shadows a global declaration [-Wshadow]
11 | ll md=(st+ed)/2;
| ^~
horses.cpp:7:26: note: shadowed declaration is here
7 | ll n,x[500005],y[500005],md=1e9+7,nw,fight;
| ^~
horses.cpp: In function 'void update(long long int, long long int, long long int, long long int, long long int)':
horses.cpp:33:43: warning: declaration of 'val' shadows a global declaration [-Wshadow]
33 | void update(ll tree,ll st,ll ed,ll idx,ll val)
| ^
horses.cpp:8:17: note: shadowed declaration is here
8 | ll seg[2000005],val,str,ans,last,mul[2000005],big;
| ^~~
horses.cpp:35:5: warning: declaration of 'md' shadows a global declaration [-Wshadow]
35 | ll md=(st+ed)/2;
| ^~
horses.cpp:7:26: note: shadowed declaration is here
7 | ll n,x[500005],y[500005],md=1e9+7,nw,fight;
| ^~
horses.cpp: In function 'long long int query(long long int, long long int, long long int, long long int, long long int)':
horses.cpp:64:5: warning: declaration of 'md' shadows a global declaration [-Wshadow]
64 | ll md=(st+ed)/2;
| ^~
horses.cpp:7:26: note: shadowed declaration is here
7 | ll n,x[500005],y[500005],md=1e9+7,nw,fight;
| ^~
horses.cpp: In function 'long long int query2(long long int, long long int, long long int, long long int, long long int)':
horses.cpp:71:5: warning: declaration of 'md' shadows a global declaration [-Wshadow]
71 | ll md=(st+ed)/2;
| ^~
horses.cpp:7:26: note: shadowed declaration is here
7 | ll n,x[500005],y[500005],md=1e9+7,nw,fight;
| ^~
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:122:6: warning: conversion from 'long long int' to 'double' may change value [-Wconversion]
122 | if(str>1e9)
| ^~~
horses.cpp:149:5: warning: conversion from 'long long int' to 'double' may change value [-Wconversion]
149 | if(str>1e9)
| ^~~
horses.cpp:154:10: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
154 | return ans;
| ^~~
horses.cpp:160:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
160 | return last;
| ^~~~
horses.cpp:165:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
165 | return ans;
| ^~~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:170:26: warning: declaration of 'val' shadows a global declaration [-Wshadow]
170 | int updateX(int pos, int val) {
| ~~~~^~~
horses.cpp:8:17: note: shadowed declaration is here
8 | ll seg[2000005],val,str,ans,last,mul[2000005],big;
| ^~~
horses.cpp:6:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
6 | #define Y second
| ^
horses.cpp:204:17: note: in expansion of macro 'Y'
204 | val=stk.top().Y;
| ^
horses.cpp:207:6: warning: conversion from 'long long int' to 'double' may change value [-Wconversion]
207 | if(str>1e9)
| ^~~
horses.cpp:234:5: warning: conversion from 'long long int' to 'double' may change value [-Wconversion]
234 | if(str>1e9)
| ^~~
horses.cpp:239:10: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
239 | return ans;
| ^~~
horses.cpp:245:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
245 | return last;
| ^~~~
horses.cpp:250:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
250 | return ans;
| ^~~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:255:26: warning: declaration of 'val' shadows a global declaration [-Wshadow]
255 | int updateY(int pos, int val) {
| ~~~~^~~
horses.cpp:8:17: note: shadowed declaration is here
8 | ll seg[2000005],val,str,ans,last,mul[2000005],big;
| ^~~
horses.cpp:6:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
6 | #define Y second
| ^
horses.cpp:269:17: note: in expansion of macro 'Y'
269 | val=stk.top().Y;
| ^
horses.cpp:272:6: warning: conversion from 'long long int' to 'double' may change value [-Wconversion]
272 | if(str>1e9)
| ^~~
horses.cpp:299:5: warning: conversion from 'long long int' to 'double' may change value [-Wconversion]
299 | if(str>1e9)
| ^~~
horses.cpp:304:10: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
304 | return ans;
| ^~~
horses.cpp:310:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
310 | return last;
| ^~~~
horses.cpp:315:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
315 | return ans;
| ^~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
0 ms |
212 KB |
Output is correct |
4 |
Correct |
0 ms |
212 KB |
Output is correct |
5 |
Correct |
0 ms |
212 KB |
Output is correct |
6 |
Correct |
1 ms |
212 KB |
Output is correct |
7 |
Correct |
0 ms |
212 KB |
Output is correct |
8 |
Correct |
1 ms |
212 KB |
Output is correct |
9 |
Correct |
0 ms |
212 KB |
Output is correct |
10 |
Correct |
1 ms |
212 KB |
Output is correct |
11 |
Correct |
1 ms |
212 KB |
Output is correct |
12 |
Correct |
0 ms |
212 KB |
Output is correct |
13 |
Correct |
0 ms |
212 KB |
Output is correct |
14 |
Correct |
0 ms |
212 KB |
Output is correct |
15 |
Correct |
0 ms |
212 KB |
Output is correct |
16 |
Correct |
0 ms |
212 KB |
Output is correct |
17 |
Correct |
0 ms |
212 KB |
Output is correct |
18 |
Correct |
0 ms |
212 KB |
Output is correct |
19 |
Correct |
0 ms |
212 KB |
Output is correct |
20 |
Correct |
1 ms |
212 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
0 ms |
212 KB |
Output is correct |
4 |
Correct |
0 ms |
212 KB |
Output is correct |
5 |
Correct |
1 ms |
212 KB |
Output is correct |
6 |
Correct |
1 ms |
212 KB |
Output is correct |
7 |
Correct |
1 ms |
212 KB |
Output is correct |
8 |
Correct |
1 ms |
212 KB |
Output is correct |
9 |
Correct |
1 ms |
212 KB |
Output is correct |
10 |
Correct |
0 ms |
212 KB |
Output is correct |
11 |
Correct |
1 ms |
212 KB |
Output is correct |
12 |
Correct |
1 ms |
212 KB |
Output is correct |
13 |
Correct |
0 ms |
212 KB |
Output is correct |
14 |
Correct |
0 ms |
212 KB |
Output is correct |
15 |
Correct |
1 ms |
212 KB |
Output is correct |
16 |
Correct |
0 ms |
212 KB |
Output is correct |
17 |
Correct |
0 ms |
212 KB |
Output is correct |
18 |
Correct |
1 ms |
212 KB |
Output is correct |
19 |
Correct |
0 ms |
212 KB |
Output is correct |
20 |
Correct |
0 ms |
212 KB |
Output is correct |
21 |
Correct |
0 ms |
212 KB |
Output is correct |
22 |
Correct |
0 ms |
212 KB |
Output is correct |
23 |
Incorrect |
3 ms |
340 KB |
Output isn't correct |
24 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
428 ms |
29552 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
0 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
0 ms |
212 KB |
Output is correct |
5 |
Correct |
0 ms |
212 KB |
Output is correct |
6 |
Correct |
0 ms |
212 KB |
Output is correct |
7 |
Correct |
0 ms |
212 KB |
Output is correct |
8 |
Correct |
1 ms |
212 KB |
Output is correct |
9 |
Correct |
1 ms |
212 KB |
Output is correct |
10 |
Correct |
0 ms |
212 KB |
Output is correct |
11 |
Correct |
0 ms |
212 KB |
Output is correct |
12 |
Correct |
0 ms |
212 KB |
Output is correct |
13 |
Correct |
0 ms |
212 KB |
Output is correct |
14 |
Correct |
1 ms |
212 KB |
Output is correct |
15 |
Correct |
0 ms |
212 KB |
Output is correct |
16 |
Correct |
0 ms |
212 KB |
Output is correct |
17 |
Correct |
1 ms |
212 KB |
Output is correct |
18 |
Correct |
1 ms |
288 KB |
Output is correct |
19 |
Correct |
0 ms |
212 KB |
Output is correct |
20 |
Correct |
0 ms |
212 KB |
Output is correct |
21 |
Correct |
1 ms |
212 KB |
Output is correct |
22 |
Correct |
1 ms |
212 KB |
Output is correct |
23 |
Incorrect |
2 ms |
340 KB |
Output isn't correct |
24 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
Output is correct |
2 |
Correct |
0 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
0 ms |
212 KB |
Output is correct |
5 |
Correct |
0 ms |
212 KB |
Output is correct |
6 |
Correct |
1 ms |
212 KB |
Output is correct |
7 |
Correct |
1 ms |
212 KB |
Output is correct |
8 |
Correct |
0 ms |
212 KB |
Output is correct |
9 |
Correct |
1 ms |
212 KB |
Output is correct |
10 |
Correct |
0 ms |
212 KB |
Output is correct |
11 |
Correct |
0 ms |
212 KB |
Output is correct |
12 |
Correct |
0 ms |
212 KB |
Output is correct |
13 |
Correct |
0 ms |
212 KB |
Output is correct |
14 |
Correct |
0 ms |
212 KB |
Output is correct |
15 |
Correct |
0 ms |
212 KB |
Output is correct |
16 |
Correct |
0 ms |
212 KB |
Output is correct |
17 |
Correct |
0 ms |
212 KB |
Output is correct |
18 |
Correct |
1 ms |
212 KB |
Output is correct |
19 |
Correct |
0 ms |
212 KB |
Output is correct |
20 |
Correct |
0 ms |
212 KB |
Output is correct |
21 |
Correct |
0 ms |
212 KB |
Output is correct |
22 |
Correct |
1 ms |
212 KB |
Output is correct |
23 |
Incorrect |
2 ms |
340 KB |
Output isn't correct |
24 |
Halted |
0 ms |
0 KB |
- |