제출 #1000336

#제출 시각아이디문제언어결과실행 시간메모리
1000336jer033말 (IOI15_horses)C++17
17 / 100
487 ms15344 KiB
#include "horses.h" #include <bits/stdc++.h> using ll = long long; using namespace std; const ll MOD = 1'000'000'007; const ll INF = 1'000'000'006; const int pus = 524288; ll regmul(ll a, ll b) { return (a*b)%MOD; } ll boundmul(ll a, ll b) { return min(INF, a*b); } ll modpow(ll x, int y) { if (y==0) return 1; if (y==1) return x; ll z = modpow(x, y/2); z = regmul(z, z); if (y%2) z = regmul(z, x); return z; } ll modinv(ll a, ll b) { return regmul(a, modpow(b, MOD-2)); } vector<int> x; vector<int> y; int n; int segtree[1048576]; void setupsegtree() { for (int i=0; i<n; i++) { segtree[pus+i] = y[i]; } for (int i=pus-1; i>=1; i--) { segtree[i] = max(segtree[2*i], segtree[2*i+1]); } } void updatesegtree(int index, int newval) { index = pus+index; segtree[index] = newval; while (index!=0) { index = index/2; segtree[index] = max(segtree[2*index], segtree[2*index+1]); } segtree[0] = 0; } int rangequery(int indexa, int indexb) { indexa = indexa+pus; indexb = indexb+pus; int ans = -1; while ((indexb-indexa)>=5) { if ((indexa%2)==1) { ans = max(segtree[indexa], ans); indexa++; } if ((indexb%2)==0) { ans = max(segtree[indexb], ans); indexb--; } indexa = indexa/2; indexb = indexb/2; } for (int i=indexa; i<=indexb; i++) ans = max(segtree[i], ans); return ans; } priority_queue<int> nonone; vector<int> candidates; vector<int> mybes; ll c; void initpq(bool first) { if (first) { c = 1; for (int i=0; i<n; i++) { if (x[i]>1) { nonone.push(i); c = regmul(c, x[i]); } } } else { mybes.clear(); int m = candidates.size(); for (int i=0; i<m; i++) { c = regmul(c, candidates[i]); nonone.push(candidates[i]); } candidates.clear(); } int j = 0; while ((j<30) and (not nonone.empty())) { int q = nonone.top(); if (x[q]>1) { candidates.push_back(nonone.top()); c = modinv(c, x[nonone.top()]); j++; } nonone.pop(); } //reverse the list vector<int> newcandidates; for (int i=j-1; i>=0; i--) { newcandidates.push_back(candidates[i]); } candidates = newcandidates; for (int i=0; i<j; i++) { if (i!=(j-1)) { mybes.push_back(rangequery(candidates[i], candidates[i+1]-1)); } else { mybes.push_back(rangequery(candidates[i], n-1)); } } } ll solve() { int m = candidates.size(); if (m==0) return rangequery(0, n-1); ll safe = x[candidates[0]]; ll bes = mybes[0]; ll currmul = 1; for (int i=1; i<m; i++) { if (boundmul(boundmul(currmul, x[candidates[i]]), mybes[i])>=bes) { safe = regmul(safe, currmul); safe = regmul(safe, x[candidates[i]]); currmul = 1; bes = mybes[i]; } else { currmul = boundmul(currmul, x[candidates[i]]); } } ll doubans = regmul(c, regmul(safe, bes)); return modinv(doubans, 2); } int init(int N, int X[], int Y[]) { x.push_back(2); y.push_back(1); for (int i=0; i<N; i++) { x.push_back(X[i]); y.push_back(Y[i]); } n=N+1; setupsegtree(); initpq(1); return solve(); } int updateX(int pos, int val) { pos++; ll oldval = x[pos]; x[pos] = val; int m = candidates.size(); //Update the ff: //pq nonone //vector candidates //vector mybes //ll c //Take into account: //Is pos >= candidates[0] ? //Is val 1? //Is candidates full? if (val==1) { nonone.push(pos); } c = regmul(modinv(c, oldval), val); initpq(0); return solve(); } int updateY(int pos, int val) { pos++; y[pos] = val; updatesegtree(pos, val); int j = candidates.size(); for (int i=0; i<j; i++) { if (i!=(j-1)) { if ((candidates[i]<=pos) and (pos<candidates[i+1])) mybes[i] = rangequery(candidates[i], candidates[i+1]-1); } else { if (candidates[i]<=pos) mybes[i] = rangequery(candidates[i], n-1); } } return solve(); }

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

horses.cpp: In function 'void initpq(bool)':
horses.cpp:114:26: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
  114 |   int m = candidates.size();
      |           ~~~~~~~~~~~~~~~^~
horses.cpp: In function 'll solve()':
horses.cpp:157:25: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
  157 |  int m = candidates.size();
      |          ~~~~~~~~~~~~~~~^~
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:192:14: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  192 |  return solve();
      |         ~~~~~^~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:199:25: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
  199 |  int m = candidates.size();
      |          ~~~~~~~~~~~~~~~^~
horses.cpp:218:14: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  218 |  return solve();
      |         ~~~~~^~
horses.cpp:199:6: warning: unused variable 'm' [-Wunused-variable]
  199 |  int m = candidates.size();
      |      ^
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:225:25: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
  225 |  int j = candidates.size();
      |          ~~~~~~~~~~~~~~~^~
horses.cpp:240:14: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  240 |  return solve();
      |         ~~~~~^~
#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...