結果
| 問題 |
No.489 株に挑戦
|
| コンテスト | |
| ユーザー |
tookunn_1213
|
| 提出日時 | 2017-02-27 22:21:56 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 383 ms / 1,000 ms |
| コード長 | 3,273 bytes |
| コンパイル時間 | 2,996 ms |
| コンパイル使用メモリ | 87,748 KB |
| 実行使用メモリ | 55,488 KB |
| 最終ジャッジ日時 | 2024-07-19 23:36:42 |
| 合計ジャッジ時間 | 12,648 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 |
ソースコード
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.NoSuchElementException;
public class Main{
int N,D,K;
int[] x;
static final int INF = -((int)1e9+7);
P[] segment;
int size;
private class P{
int i,v;
public P(int i,int v){
this.i = i;
this.v = v;
}
}
public void segInit(int N){
size = 1;
while(size < N){
size <<= 1;
}
segment = new P[size*2];
for(int i = 0;i < size * 2;i++){
segment[i] = new P(INF,INF);
}
}
public void segUpdate(int i,int a){
P tmp = new P(i,a);
i = size + i - 1;
segment[i] = tmp;
while(i > 0){
i = (i-1)>>1;
int i1 = i*2+1;
int i2 = i*2+2;
if (segment[i1].v < segment[i2].v){
segment[i] = segment[i2];
}else if (segment[i1].v > segment[i2].v){
segment[i] = segment[i1];
}else if(segment[i1].i <= segment[i2].i){
segment[i] = segment[i1];
}else{
segment[i] = segment[i2];
}
}
}
public P segQuery(int a,int b,int k,int l,int r){
if(r <= a || b <= l)return new P(INF,INF);
if(a <= l && r <= b)return segment[k];
P left = segQuery(a,b,2*k+1,l,(l+r)/2);
P right = segQuery(a,b,2*k+2,(l+r)/2,r);
if (left.v == INF && right.v == INF)return new P(INF,INF);
if(left.v == INF)return right;
if(right.v == INF)return left;
if(left.v < right.v)return right;
if(left.v > right.v)return left;
if(left.i <= right.i)return left;
else return right;
}
public void solve() {
N = nextInt();
D = nextInt();
K = nextInt();
x = new int[N];
for(int i = 0;i < N;i++){
x[i] = nextInt();
}
segInit(N);
for(int i = 0;i < N;i++){
segUpdate(i,x[i]);
}
long ans = INF;
int[] pair = {INF,INF};
for(int i = 0;i < N - 1;i++){
P ret = segQuery(i+1,Math.min(N, i+D+1),0,0,size);
if (ans < ret.v-x[i]){
ans = ret.v-x[i];
pair[0] = i;
pair[1] = ret.i;
}
}
if(ans <= 0){
out.println(0);
}else{
out.println(ans*K);
out.println(pair[0] + " " + pair[1]);
}
}
public static void main(String[] args) {
out.flush();
new Main().solve();
out.close();
}
/* Input */
private static final InputStream in = System.in;
private static final PrintWriter out = new PrintWriter(System.out);
private final byte[] buffer = new byte[2048];
private int p = 0;
private int buflen = 0;
private boolean hasNextByte() {
if (p < buflen)
return true;
p = 0;
try {
buflen = in.read(buffer);
} catch (IOException e) {
e.printStackTrace();
}
if (buflen <= 0)
return false;
return true;
}
public boolean hasNext() {
while (hasNextByte() && !isPrint(buffer[p])) {
p++;
}
return hasNextByte();
}
private boolean isPrint(int ch) {
if (ch >= '!' && ch <= '~')
return true;
return false;
}
private int nextByte() {
if (!hasNextByte())
return -1;
return buffer[p++];
}
public String next() {
if (!hasNext())
throw new NoSuchElementException();
StringBuilder sb = new StringBuilder();
int b = -1;
while (isPrint((b = nextByte()))) {
sb.appendCodePoint(b);
}
return sb.toString();
}
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {
return Long.parseLong(next());
}
public double nextDouble() {
return Double.parseDouble(next());
}
}
tookunn_1213