結果
問題 | No.2065 Sum of Min |
ユーザー |
![]() |
提出日時 | 2022-04-29 14:52:59 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 1,220 ms / 2,000 ms |
コード長 | 18,956 bytes |
コンパイル時間 | 3,808 ms |
コンパイル使用メモリ | 94,736 KB |
実行使用メモリ | 87,216 KB |
最終ジャッジ日時 | 2024-11-06 19:16:21 |
合計ジャッジ時間 | 23,272 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 20 |
ソースコード
import java.util.*;import java.io.*;class Main {private static final void solve() throws IOException {int n = ni(), q = ni();var a = ni(n);var g = new ArrayList<ArrayList<Point>>();for (int i = 0; i < n; i++)g.add(new ArrayList<>());var x = new int[q];for (int i = 0; i < q; i++) {int l = ni() - 2, r = ni() - 1;x[i] = ni();if (l != -1)g.get(l).add(new Point(i, false));g.get(r).add(new Point(i, true));}var za1 = new TreeSet<Integer>();za1.add(0);for (int i : a)za1.add(i);var za2 = new HashMap<Integer, Integer>();za1.forEach(i -> za2.put(i, m++));var ans = new long[q];var bit1 = new FenwickTree(m);var bit2 = new FenwickTree(m);for (int i = 0; i < n; i++) {int za = za2.get(a[i]);bit1.add(za, a[i]);bit2.add(za, 1L);for (Point p : g.get(i)) {int xx = za2.get(za1.floor(x[p.idx])) + 1;long sum = bit1.sum(0, xx);long idx = i + 1 - bit2.sum(0, xx);long s = sum + x[p.idx] * idx;if (p.se)ans[p.idx] += s;elseans[p.idx] -= s;}}ou.println(ans);}private static int m = 0;private static final class Point {int idx;boolean se;Point(int idx, boolean se) {this.idx = idx;this.se = se;}}public static void main(String[] args) throws IOException {solve();ou.flush();}private static final int ni() throws IOException {return sc.nextInt();}private static final int[] ni(int n) throws IOException {return sc.nextIntArray(n);}private static final long nl() throws IOException {return sc.nextLong();}private static final long[] nl(int n) throws IOException {return sc.nextLongArray(n);}private static final String ns() throws IOException {return sc.nextString();}private static final ContestInputStream sc = new ContestInputStream();private static final ContestOutputStream ou = new ContestOutputStream();}class FenwickTree {private int _n;private long[] data;public FenwickTree(int n) {this._n = n;data = new long[n];}public void set(int p, long x) {add(p, x - get(p));}public void add(int p, long x) {assert (0 <= p && p < _n);p++;while (p <= _n) {data[p - 1] += x;p += p & -p;}}public long sum(int l, int r) {assert (0 <= l && l <= r && r <= _n);return sum(r) - sum(l);}public long get(int p) {return sum(p, p + 1);}private long sum(int r) {long s = 0;while (r > 0) {s += data[r - 1];r -= r & -r;}return s;}}class ContestInputStream extends FilterInputStream {protected final byte[] buf;protected int pos = 0;protected int lim = 0;private final char[] cbuf;public ContestInputStream() {super(System.in);this.buf = new byte[1 << 13];this.cbuf = new char[1 << 19];}boolean hasRemaining() throws IOException {if (pos < lim)return true;lim = in.read(buf);pos = 0;return lim > 0;}int remaining() throws IOException {if (pos >= lim) {lim = in.read(buf);pos = 0;}return lim - pos;}@Overridepublic int available() throws IOException {if (pos < lim)return lim - pos + in.available();return in.available();}@Overridepublic long skip(long n) throws IOException {if (pos < lim) {int rem = lim - pos;if (n < rem) {pos += n;return n;}pos = lim;return rem;}return in.skip(n);}@Overridepublic int read() throws IOException {if (hasRemaining())return buf[pos++];return -1;}@Overridepublic int read(byte[] b, int off, int len) throws IOException {if (pos < lim) {int rem = Math.min(lim - pos, len);for (int i = 0; i < rem; i++)b[off + i] = buf[pos + i];pos += rem;return rem;}return in.read(b, off, len);}public char[] readToken() throws IOException {int cpos = 0;int rem;int i;byte b;l: while ((rem = remaining()) > 0) {for (i = 0; i < rem; i++) {b = buf[pos + i];if (b <= 0x20) {pos += i + 1;cpos += i;break l;}cbuf[cpos + i] = (char) b;}pos += rem;cpos += rem;}char[] arr = new char[cpos];for (i = 0; i < cpos; i++)arr[i] = cbuf[i];return arr;}public int readToken(char[] cbuf, int off) throws IOException {int cpos = off;int rem;int i;byte b;l: while ((rem = remaining()) > 0) {for (i = 0; i < rem; i++) {b = buf[pos + i];if (b <= 0x20) {pos += i + 1;cpos += i;break l;}cbuf[cpos + i] = (char) b;}pos += rem;cpos += rem;}return cpos - off;}public int readToken(char[] cbuf) throws IOException {return readToken(cbuf, 0);}public String nextString() throws IOException {int cpos = 0;int rem;int i;byte b;l: while ((rem = remaining()) > 0) {for (i = 0; i < rem; i++) {b = buf[pos + i];if (b <= 0x20) {pos += i + 1;cpos += i;break l;}cbuf[cpos + i] = (char) b;}pos += rem;cpos += rem;}return String.valueOf(cbuf, 0, cpos);}public int nextInt() throws IOException {if (!hasRemaining())return 0;int value = 0;byte b = buf[pos++];if (b == 0x2d) {while (hasRemaining() && (b = buf[pos++]) > 0x20)value = value * 10 - b + 0x30;} else {do {value = value * 10 + b - 0x30;} while (hasRemaining() && (b = buf[pos++]) > 0x20);}return value;}public long nextLong() throws IOException {if (!hasRemaining())return 0L;long value = 0L;byte b = buf[pos++];if (b == 0x2d) {while (hasRemaining() && (b = buf[pos++]) > 0x20)value = value * 10 - b + 0x30;} else {do {value = value * 10 + b - 0x30;} while (hasRemaining() && (b = buf[pos++]) > 0x20);}return value;}public float nextFloat() throws IOException {return Float.parseFloat(nextString());}public double nextDouble() throws IOException {return Double.parseDouble(nextString());}public boolean[] nextBooleanArray(char ok) throws IOException {char[] s = nextString().toCharArray();int n = s.length;boolean[] t = new boolean[n];for (int i = 0; i < n; i++)t[i] = s[i] == ok;return t;}public String[] nextStringArray(int len) throws IOException {String[] arr = new String[len];for (int i = 0; i < len; i++)arr[i] = nextString();return arr;}public int[] nextIntArray(int len) throws IOException {int[] arr = new int[len];for (int i = 0; i < len; i++)arr[i] = nextInt();return arr;}public int[] nextIntArray(int len, java.util.function.IntUnaryOperator map) throws IOException {int[] arr = new int[len];for (int i = 0; i < len; i++)arr[i] = map.applyAsInt(nextInt());return arr;}public long[] nextLongArray(int len, java.util.function.LongUnaryOperator map) throws IOException {long[] arr = new long[len];for (int i = 0; i < len; i++)arr[i] = map.applyAsLong(nextLong());return arr;}public int[][] nextIntMatrix(int h, int w) throws IOException {int[][] arr = new int[h][w];for (int i = 0; i < h; i++)for (int j = 0; j < w; j++)arr[i][j] = nextInt();return arr;}public long[] nextLongArray(int len) throws IOException {long[] arr = new long[len];for (int i = 0; i < len; i++)arr[i] = nextLong();return arr;}public long[][] nextLongMatrix(int h, int w) throws IOException {long[][] arr = new long[h][w];for (int i = 0; i < h; i++)for (int j = 0; j < w; j++)arr[i][j] = nextLong();return arr;}public float[] nextFloatArray(int len) throws IOException {float[] arr = new float[len];for (int i = 0; i < len; i++)arr[i] = nextFloat();return arr;}public double[] nextDoubleArray(int len) throws IOException {double[] arr = new double[len];for (int i = 0; i < len; i++)arr[i] = nextDouble();return arr;}public char[][] nextCharMatrix(int h, int w) throws IOException {char[][] arr = new char[h][];for (int i = 0; i < h; i++)arr[i] = nextString().toCharArray();return arr;}}class ContestOutputStream extends FilterOutputStream implements Appendable {protected final byte[] buf;protected int pos = 0;public ContestOutputStream() {super(System.out);this.buf = new byte[1 << 13];}@Overridepublic void flush() throws IOException {out.write(buf, 0, pos);pos = 0;out.flush();}void put(byte b) throws IOException {if (pos >= buf.length)flush();buf[pos++] = b;}int remaining() throws IOException {if (pos >= buf.length)flush();return buf.length - pos;}@Overridepublic void write(int b) throws IOException {put((byte) b);}@Overridepublic void write(byte[] b, int off, int len) throws IOException {int o = off;int l = len;while (l > 0) {int rem = Math.min(remaining(), l);for (int i = 0; i < rem; i++)buf[pos + i] = b[o + i];pos += rem;o += rem;l -= rem;}}@Overridepublic ContestOutputStream append(char c) throws IOException {put((byte) c);return this;}@Overridepublic ContestOutputStream append(CharSequence csq, int start, int end) throws IOException {int off = start;int len = end - start;while (len > 0) {int rem = Math.min(remaining(), len);for (int i = 0; i < rem; i++)buf[pos + i] = (byte) csq.charAt(off + i);pos += rem;off += rem;len -= rem;}return this;}@Overridepublic ContestOutputStream append(CharSequence csq) throws IOException {return append(csq, 0, csq.length());}public ContestOutputStream append(char[] arr, int off, int len) throws IOException {int o = off;int l = len;while (l > 0) {int rem = Math.min(remaining(), l);for (int i = 0; i < rem; i++)buf[pos + i] = (byte) arr[o + i];pos += rem;o += rem;l -= rem;}return this;}public ContestOutputStream print(char[] arr) throws IOException {return append(arr, 0, arr.length).newLine();}public ContestOutputStream print(boolean value) throws IOException {if (value)return append("o");return append("x");}public ContestOutputStream println(boolean value) throws IOException {if (value)return append("o\n");return append("x\n");}public ContestOutputStream print(boolean[][] value) throws IOException {final int n = value.length, m = value[0].length;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++)print(value[i][j]);newLine();}return this;}public ContestOutputStream print(int value) throws IOException {return append(String.valueOf(value));}public ContestOutputStream println(int value) throws IOException {return append(String.valueOf(value)).newLine();}public ContestOutputStream print(long value) throws IOException {return append(String.valueOf(value));}public ContestOutputStream println(long value) throws IOException {return append(String.valueOf(value)).newLine();}public ContestOutputStream print(float value) throws IOException {return append(String.valueOf(value));}public ContestOutputStream println(float value) throws IOException {return append(String.valueOf(value)).newLine();}public ContestOutputStream print(double value) throws IOException {return append(String.valueOf(value));}public ContestOutputStream println(double value) throws IOException {return append(String.valueOf(value)).newLine();}public ContestOutputStream print(char value) throws IOException {return append(String.valueOf(value));}public ContestOutputStream println(char value) throws IOException {return append(String.valueOf(value)).newLine();}public ContestOutputStream print(String value) throws IOException {return append(String.valueOf(value));}public ContestOutputStream println(String value) throws IOException {return append(String.valueOf(value)).newLine();}public ContestOutputStream print(Object value) throws IOException {return append(String.valueOf(value));}public ContestOutputStream println(Object value) throws IOException {return append(String.valueOf(value)).newLine();}public ContestOutputStream printYN(boolean yes) throws IOException {if (yes)return println("Yes");return println("No");}public ContestOutputStream print(CharSequence[] arr) throws IOException {if (arr.length > 0) {append(arr[0]);for (int i = 1; i < arr.length; i++)append('\u0020').append(arr[i]);}return this;}public ContestOutputStream print(int[] arr) throws IOException {if (arr.length > 0) {print(arr[0]);for (int i = 1; i < arr.length; i++)append('\u0020').print(arr[i]);}newLine();return this;}public ContestOutputStream println(int[] arr) throws IOException {for (int i : arr)print(i).newLine();return this;}public ContestOutputStream print(long[] arr) throws IOException {if (arr.length > 0) {print(arr[0]);for (int i = 1; i < arr.length; i++)append('\u0020').print(arr[i]);}newLine();return this;}public ContestOutputStream println(long[] arr) throws IOException {for (long i : arr)print(i).newLine();return this;}public ContestOutputStream print(float[] arr) throws IOException {if (arr.length > 0) {print(arr[0]);for (int i = 1; i < arr.length; i++)append('\u0020').print(arr[i]);}return this;}public ContestOutputStream println(float[] arr) throws IOException {for (float i : arr)print(i).newLine();return this;}public ContestOutputStream print(double[] arr) throws IOException {if (arr.length > 0) {print(arr[0]);for (int i = 1; i < arr.length; i++)append('\u0020').print(arr[i]);}return this;}public ContestOutputStream println(double[] arr) throws IOException {for (double i : arr)print(i).newLine();return this;}public ContestOutputStream print(Object[] arr) throws IOException {if (arr.length > 0) {print(arr[0]);for (int i = 1; i < arr.length; i++)append('\u0020').print(arr[i]);}return newLine();}public ContestOutputStream print(java.util.ArrayList<?> arr) throws IOException {final int n = arr.size();print(arr.get(0));for (int i = 1; i < n; i++)print(" ").print(arr.get(i));return newLine();}public ContestOutputStream println(java.util.ArrayList<?> arr) throws IOException {final int n = arr.size();for (int i = 0; i < n; i++)println(arr.get(i));return this;}public ContestOutputStream println(Object[] arr) throws IOException {for (Object i : arr)print(i).newLine();return this;}public ContestOutputStream newLine() throws IOException {return append('\n');}public ContestOutputStream endl() throws IOException {newLine().flush();return this;}public ContestOutputStream print(int[][] arr) throws IOException {for (int[] i : arr)print(i);return this;}public ContestOutputStream print(long[][] arr) throws IOException {for (long[] i : arr)print(i);return this;}public ContestOutputStream print(char[][] arr) throws IOException {for (char[] i : arr)print(i);return this;}public ContestOutputStream print(Object[][] arr) throws IOException {for (Object[] i : arr)print(i);return this;}}