Submission #649508

#TimeUsernameProblemLanguageResultExecution timeMemory
649508ToroTNHorses (IOI15_horses)C++14
17 / 100
428 ms29552 KiB
#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 (stderr)

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 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...