제출 #998899

#제출 시각아이디문제언어결과실행 시간메모리
998899inesfi말 (IOI15_horses)C++14
17 / 100
303 ms65364 KiB
#include "horses.h" #include<bits/stdc++.h> using namespace std; #define ll long long const ll MODULO=1000*1000*1000+7,PUISS=1048576; ll arbreprixmaxi[PUISS+1],arbremultiprod[PUISS+1]; ll nbannees,decalage,nb1,ancien,deb,fin,atester,zero,dernier,debec,finec,produit; set<pair<ll,ll>> inter; set<pair<ll,ll>>::iterator it; ll maxi(ll a,ll b){ if (a==b){ return arbreprixmaxi[a]; } if (a%2==1){ return max(arbreprixmaxi[a],maxi(a+1,b)); } if (b%2==0){ return max(arbreprixmaxi[b],maxi(a,b-1)); } return maxi(a/2,b/2); } ll prod(ll a,ll b){ if (a==b){ return arbremultiprod[a]; } if (a%2==1){ return (arbremultiprod[a]*prod(a+1,b))%MODULO; } if (b%2==0){ return (arbremultiprod[b]*prod(a,b-1))%MODULO; } return prod(a/2,b/2); } void remonteprix(ll endroit){ if (endroit==0){ return ; } arbreprixmaxi[endroit]=max(arbreprixmaxi[2*endroit],arbreprixmaxi[2*endroit+1]); remonteprix(endroit/2); } void remontemulti(ll endroit){ if (endroit==0){ return ; } arbremultiprod[endroit]=(arbreprixmaxi[2*endroit]*arbreprixmaxi[2*endroit+1])%MODULO; remontemulti(endroit/2); } ll trouver(){ zero=0; atester=max((ll)inter.size()-62,zero); dernier=atester+1; produit=1; it=inter.end(); for (int i=inter.size();i>atester;i--){ it--; } deb=(*(it)).first; fin=(*(it)).second; it++; while (dernier<(int)inter.size()){ debec=(*(it)).first; finec=(*(it)).second; if (maxi(deb+decalage,fin+decalage)>=maxi(debec+decalage,finec+decalage)*produit and maxi(deb+decalage,fin+decalage)>=maxi(debec+decalage,finec+decalage)*produit*arbremultiprod[debec+decalage]){ produit*=arbremultiprod[debec+decalage]; } else { atester=dernier; deb=debec; fin=finec; produit=1; } it++; dernier++; } //cout<<maxi(deb+decalage,fin+decalage)<<" "<<prod(decalage,fin+decalage)<<endl; return (maxi(deb+decalage,fin+decalage)*prod(decalage,fin+decalage))%MODULO; } int init (int N, int X[], int Y[]){ nbannees=N; decalage=PUISS/2; for (int i=0;i<PUISS/2;i++){ arbremultiprod[i+decalage]=1; } for (int iannee=0;iannee<nbannees;iannee++){ arbreprixmaxi[iannee+decalage]=Y[iannee]; arbremultiprod[iannee+decalage]=X[iannee]; } for (int icase=decalage-1;icase>=0;icase--){ arbreprixmaxi[icase]=max(arbreprixmaxi[2*icase],arbreprixmaxi[2*icase+1]); arbremultiprod[icase]=(arbremultiprod[2*icase]*arbremultiprod[2*icase+1])%MODULO; } for (int icase=0;icase<nbannees;icase++){ if (X[icase]!=1){ if (nb1>0){ inter.insert(make_pair(icase-nb1,icase-1)); } inter.insert(make_pair(icase,icase)); nb1=0; } else { nb1++; } } if (nb1>0){ inter.insert(make_pair(nbannees-nb1,nbannees-1)); } return trouver(); } int updateX(int pos, int val){ ancien=arbremultiprod[pos+decalage]; arbremultiprod[pos+decalage]=val; remontemulti((pos+decalage)/2); it=inter.lower_bound(make_pair(pos,0)); if (it==inter.end() or (*(it)).first>pos){ it--; } deb=(*(it)).first; fin=(*(it)).second; if (val!=1){ if (ancien==1){ if (deb==pos){ if (fin!=pos){ inter.insert(make_pair(pos,pos)); inter.insert(make_pair(pos+1,fin)); inter.erase(it); } } else { if (fin==pos){ inter.insert(make_pair(pos,pos)); inter.insert(make_pair(deb,pos-1)); inter.erase(it); } else { inter.insert(make_pair(pos,pos)); inter.insert(make_pair(deb,pos-1)); inter.insert(make_pair(pos+1,fin)); } } } } else { if (ancien!=1){ if (pos==0){ if (arbremultiprod[decalage+1]==1){ it=inter.erase(it); inter.insert(make_pair(pos,(*(it)).second)); inter.erase(it); } } else { if (arbremultiprod[decalage+pos-1]==1){ it=inter.erase(it); it--; inter.insert(make_pair((*(it)).first,pos)); it=inter.erase(it); } if (arbremultiprod[decalage+pos+1]==1){ deb=(*(it)).first; it=inter.erase(it); it++; inter.insert(make_pair(deb,(*(it)).second)); inter.erase(it); } } } } return trouver(); } int updateY(int pos, int val){ arbreprixmaxi[pos+decalage]=val; remonteprix((pos+decalage)/2); return trouver(); }

컴파일 시 표준 에러 (stderr) 메시지

horses.cpp: In function 'long long int trouver()':
horses.cpp:61:26: warning: conversion from 'std::set<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   61 |     for (int i=inter.size();i>atester;i--){
      |                ~~~~~~~~~~^~
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:97:28: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   97 |     for (int icase=decalage-1;icase>=0;icase--){
      |                    ~~~~~~~~^~
horses.cpp:116:19: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  116 |     return trouver();
      |            ~~~~~~~^~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:178:19: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  178 |     return trouver();
      |            ~~~~~~~^~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:184:19: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  184 |     return trouver();
      |            ~~~~~~~^~
#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...