Submission #830588

#TimeUsernameProblemLanguageResultExecution timeMemory
830588SupersonicHorses (IOI15_horses)C++14
100 / 100
490 ms72592 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; typedef unsigned long long ll; ll h[500001]; ll x[500001]; ll y[500001]; bool subtask3=1; int n; set<int, greater<int>> g1; ll tree[1048577]; pair<ll,int> ytree[1048577]; void modify(int k, int x) { k += n; tree[k] = x; for (k /= 2; k >= 1; k /= 2) { tree[k] = tree[2*k]*tree[2*k+1]; tree[k]%=((ll)1e9+7); } } pair<ll,int> pmax(pair<ll,int> a,pair<ll,int> b){ if(a>b) return a; return b; } ll prod(ll a, ll b) { a += n; b += n; ll s = 1; while (a <= b) { if (a%2 == 1) {s *= tree[a++];s%=((ll)1e9+7);} if (b%2 == 0) {s *= tree[b--];s%=((ll)1e9+7);} a /= 2; b /= 2; } return s; } void ymodify(int k, int x) { if(k>2*n)exit(1); k += n; ytree[k] = {x,k-n}; for (k /= 2; k >= 1; k /= 2) { ytree[k] = pmax(ytree[2*k],ytree[2*k+1]); ytree[k].first%=((ll)1e9+7); } } pair<ll,int> rmax(ll a,ll b){ if(b>2*n)exit(1); a += n; b += n; pair<ll,int> s = {0,0}; while (a <= b) { if (a%2 == 1) {s = pmax(s,ytree[a++]);} if (b%2 == 0) {s = pmax(s,ytree[b--]);} a /= 2; b /= 2; } return s; } int init(int N, int X[], int Y[]) { n=N; if(n<=1000)subtask3=0; for(int i=0;i<n;i++){ x[i]=X[i]; if(x[i]<2)subtask3=0; modify(i,x[i]); y[i]=Y[i]; ymodify(i,y[i]); if(x[i]>1)g1.insert(i); } //if(subtask3)exit(1); //cout<<rmax(2,2)<<endl;; //for(int i=0;i<2*n;i++){cerr<<ytree[i].first<<' '<<ytree[i].second<<endl;} if(!subtask3){ ll mp=0;ll c=1; for(int i=1;i<n;i++){ c*=x[i]; if(c>y[mp]||y[i]>y[mp]||c*y[i]>y[mp]){mp=i;c=1;} } return (prod(0,mp)*y[mp])%((ll)1e9+7); } else{ ll mp=n-33;ll c=1; for(int i=n-32;i<n;i++){ c*=x[i]; if(c>y[mp]||y[i]>y[mp]||c*y[i]>y[mp]){mp=i;c=1;} } return (prod(0,mp)*y[mp])%((ll)1e9+7); } } int sc=500; int updateX(int pos, int val) { //cerr<<pos<<endl; if(val==1&&g1.count(pos))g1.erase(pos); if(val>1)g1.insert(pos); x[pos]=val; sc--; //if(g1.empty())exit(1); if(sc==0){for(int i=0;i<n;i++)if(rmax(i,i).second!=i)exit(1);sc=3000;} modify(pos,val); if(g1.empty()){ int mp=rmax(0,n-1).second; return (prod(0,mp)*y[mp])%((ll)1e9+7); } ll c=x[0];ll mp=0; vector<int> vv;int cn=34; for(auto i:g1){vv.push_back(i);cn--;if(cn==0)break;}//vv.push_back(0); reverse(vv.begin(),vv.end()); mp=rmax(0,vv[0]).second; for(int vvi=0;vvi<vv.size();vvi++){ int vi=vv[vvi]; int vni=n-1;if(vvi!=vv.size()-1)vni=vv[vvi+1]-1; int i=rmax(vi,vni).second; if(i>=n)exit(1); c*=x[vi]; if(c>y[mp]||y[i]>y[mp]||c*y[i]>y[mp]){mp=i;c=1;} } return (prod(0,mp)*y[mp])%((ll)1e9+7); } int updateY(int pos, int val) { y[pos]=val; ymodify(pos,val); if(g1.empty()){ int mp=rmax(0,n-1).second; //cerr<<mp<<endl; return (prod(0,mp)*y[mp])%((ll)1e9+7); } ll c=x[0];ll mp=0; vector<int> vv;int cn=34; for(auto i:g1){vv.push_back(i);cn--;if(cn==0)break;}//vv.push_back(0); reverse(vv.begin(),vv.end()); mp=rmax(0,vv[0]).second; for(int vvi=0;vvi<vv.size();vvi++){ int vi=vv[vvi]; int vni=n-1;if(vvi!=vv.size()-1)vni=vv[vvi+1]-1; int i=rmax(vi,vni).second; if(i>=n)exit(1); c*=x[vi]; if(c>y[mp]||y[i]>y[mp]||c*y[i]>y[mp]){mp=i;c=1;} } return (prod(0,mp)*y[mp])%((ll)1e9+7); }

Compilation message (stderr)

horses.cpp: In function 'void modify(int, int)':
horses.cpp:13:24: warning: declaration of 'x' shadows a global declaration [-Wshadow]
   13 | void modify(int k, int x) {
      |                    ~~~~^
horses.cpp:6:4: note: shadowed declaration is here
    6 | ll x[500001];
      |    ^
horses.cpp: In function 'void ymodify(int, int)':
horses.cpp:36:25: warning: declaration of 'x' shadows a global declaration [-Wshadow]
   36 | void ymodify(int k, int x) {
      |                     ~~~~^
horses.cpp:6:4: note: shadowed declaration is here
    6 | ll x[500001];
      |    ^
horses.cpp: In function 'std::pair<long long unsigned int, int> rmax(ll, ll)':
horses.cpp:46:6: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long unsigned int'} and 'int' [-Wsign-compare]
   46 |  if(b>2*n)exit(1);
      |     ~^~~~
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:64:15: warning: conversion from 'll' {aka 'long long unsigned int'} to 'int' may change value [-Wconversion]
   64 |   modify(i,x[i]);
      |            ~~~^
horses.cpp:66:16: warning: conversion from 'll' {aka 'long long unsigned int'} to 'int' may change value [-Wconversion]
   66 |   ymodify(i,y[i]);
      |             ~~~^
horses.cpp:78:28: warning: conversion from 'll' {aka 'long long unsigned int'} to 'int' may change value [-Wconversion]
   78 |   return (prod(0,mp)*y[mp])%((ll)1e9+7);
      |          ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
horses.cpp:86:28: warning: conversion from 'll' {aka 'long long unsigned int'} to 'int' may change value [-Wconversion]
   86 |   return (prod(0,mp)*y[mp])%((ll)1e9+7);
      |          ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:107:28: warning: conversion from 'll' {aka 'long long unsigned int'} to 'int' may change value [-Wconversion]
  107 |   return (prod(0,mp)*y[mp])%((ll)1e9+7);
      |          ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
horses.cpp:115:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  115 |   for(int vvi=0;vvi<vv.size();vvi++){
      |                 ~~~^~~~~~~~~~
horses.cpp:117:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  117 |    int vni=n-1;if(vvi!=vv.size()-1)vni=vv[vvi+1]-1;
      |                   ~~~^~~~~~~~~~~~~
horses.cpp:123:28: warning: conversion from 'll' {aka 'long long unsigned int'} to 'int' may change value [-Wconversion]
  123 |   return (prod(0,mp)*y[mp])%((ll)1e9+7);
      |          ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:135:28: warning: conversion from 'll' {aka 'long long unsigned int'} to 'int' may change value [-Wconversion]
  135 |   return (prod(0,mp)*y[mp])%((ll)1e9+7);
      |          ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
horses.cpp:143:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  143 |   for(int vvi=0;vvi<vv.size();vvi++){
      |                 ~~~^~~~~~~~~~
horses.cpp:145:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  145 |    int vni=n-1;if(vvi!=vv.size()-1)vni=vv[vvi+1]-1;
      |                   ~~~^~~~~~~~~~~~~
horses.cpp:151:28: warning: conversion from 'll' {aka 'long long unsigned int'} to 'int' may change value [-Wconversion]
  151 |   return (prod(0,mp)*y[mp])%((ll)1e9+7);
      |          ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
#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...