結果
| 問題 | No.489 株に挑戦 |
| コンテスト | |
| ユーザー |
IL_msta
|
| 提出日時 | 2017-02-24 23:18:23 |
| 言語 | C++11 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,755 bytes |
| 記録 | |
| コンパイル時間 | 2,241 ms |
| コンパイル使用メモリ | 159,160 KB |
| 実行使用メモリ | 7,976 KB |
| 最終ジャッジ日時 | 2026-06-06 09:10:36 |
| 合計ジャッジ時間 | 3,825 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 WA * 21 RE * 2 |
ソースコード
//以下を参考にした
//https://yukicoder.me/wiki/auto_vectorization
#ifdef __GNUC__
#pragma GCC optimize ("O3")
#pragma GCC target ("avx")
#endif
#define _USE_MATH_DEFINES
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <sstream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <vector>
#include <valarray>
//#include <array>//x C++ (G++ 4.6.4)
#include <queue>
#include <complex>
#include <set>
#include <map>
#include <stack>
#include <list>
#include <cassert>//assert();
#include <fstream>
#include <random>
/////////
#define REP(i, x, n) for(int i = x; i < n; ++i)
#define rep(i,n) REP(i,0,n)
/////////
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
#define PII pair<int,int>
/////////
using namespace::std;
// 最大公約数
template<class T>
inline T gcd(T a, T b){return b ? gcd(b, a % b) : a;}
//inline T gcd(T a, T b){return b == 0 ? a : gcd(b, a % b);}
// 最小公倍数
template<class T>
inline T lcm(T a, T b){return a / gcd(a, b) * b;}
//inline T lcm(T a, T b){return a * b / gcd(a, b);}
////////////////////////////////
class segment{
int n; //nは2のべき乗
int MAX_VAL;
vector< pair<int,int> > dat;//first:val second:index
public:
int getN(){return n;}
void init(int N,int MAX_num){//N:要素数,最大値
MAX_VAL = MAX_num;
n = 2;
while(n < N ){
n <<= 1;
}
dat.assign(2*n-1,pair<int,int>(MAX_VAL,-1));
}
void update(int i,int x){
i += n-1;//葉のノード番号
dat[i] = pair<int,int>(x,i -(n-1));//値を更新,index
while(i>0){
i = (i-1)/2;
dat[i] = min(dat[i*2+1],dat[i*2+2]);
}
}
//query(a,b,0,0,n)
pair<int,int> query(int a,int b,int k,int l,int r){
if(r<=a || b<=l){
return pair<int,int>(MAX_VAL,-1);//交差しない
}
if(a<=l && r<=b)return dat[k];
else{
pair<int,int> vl = query(a,b,k*2+1,l,(l+r)/2);
pair<int,int> vr = query(a,b,k*2+2,(l+r)/2,r);
if( vl.first <= vr.first ){
return vl;
}
return vr;
}
}
};
void solve(){
LL N,D,K;
cin >> N >> D >> K;
segment seg;
seg.init((int)N,1000001);
vector<int> X(N+1);
for(int i=1;i<=N;++i){
cin >> X[i];
seg.update(i,-X[i]);
}
int MAX = -1;
int posL = -1;
int posR = -1;
for(int i=1;i<=N;++i){
pair<int,int> res = seg.query(i,i+(int)D,0,0,(int)N);
if( -res.first-X[i] > MAX ){
MAX = -res.first-X[i];
posL = i-1;
posR = res.second-1;
}
}
LL ans = MAX * K;
if( MAX >= 0 ){
cout << ans << endl;
cout << posL << " " << posR << endl;
}else{
cout << 0 << endl;
}
}
signed main(void){
std::cin.tie(0);
std::ios::sync_with_stdio(false);
//std::cout << std::fixed;//小数を10進数表示
//cout << setprecision(16);//小数点以下の桁数を指定
solve();
}
IL_msta