結果
問題 | No.619 CardShuffle |
ユーザー |
|
提出日時 | 2017-12-12 14:32:50 |
言語 | Java (openjdk 23) |
結果 |
WA
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 5,632 bytes |
コンパイル時間 | 2,728 ms |
コンパイル使用メモリ | 80,440 KB |
実行使用メモリ | 104,708 KB |
最終ジャッジ日時 | 2024-12-22 21:16:59 |
合計ジャッジ時間 | 31,255 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | WA * 1 |
other | WA * 35 |
ソースコード
import java.io.IOException;import java.io.InputStream;import java.util.ArrayDeque;import java.util.Arrays;import java.util.Deque;import java.util.NoSuchElementException;class Main {public static void main(String[] args) {long t = System.currentTimeMillis();new Main().run();System.err.println(System.currentTimeMillis() - t);}final long MOD = 1_000_000_000 + 7;StringBuilder sb = new StringBuilder();void run() {Scanner sc = new Scanner();int n = sc.nextInt();n = (n + 1) / 2;SegTree seg = new SegTree(n);for (int i = 0; i < n; ++i) {long v = sc.nextLong();int j = i + seg.n - 1;String leftop = "!", rightop = "!";if (i != n - 1)rightop = sc.next();if (i != 0)leftop = seg.val[j - 1].right_op;seg.val[j].dq.add(v);seg.val[j].left_op = leftop;seg.val[j].right_op = rightop;}for (int i = seg.n - 2; i >= 0; --i) {seg.val[i] = merge(seg.val[2 * i + 1], seg.val[2 * i + 2]);}int Q = sc.nextInt();while (Q-- > 0) {String T = sc.next();int x = sc.nextInt();int y = sc.nextInt();if (T.equals("?")) {sb.append(seg.query((x - 1) / 2, (y - 1) / 2 + 1));sb.append("\n");} else {if (x % 2 == 1) {x = (x - 1) / 2;y = (y - 1) / 2;seg.swapVal(x, y);} else {x = x / 2 - 1;y = y / 2 - 1;seg.swapOp(x, y);}}}System.out.println(sb);}class SegTree {int n;V[] val;public SegTree(int n_) {n = 1;while (n < n_) {n *= 2;}val = new V[2 * n - 1];for (int i = 0; i < val.length; ++i) {val[i] = new V();}}void swapOp(int i, int j) {i += n - 1;j += n - 1;String opI = val[i].right_op;String opJ = val[j].right_op;if (opI.equals(opJ))return;val[i].right_op = opJ;val[i + 1].left_op = opJ;val[j].right_op = opI;val[j + 1].left_op = opI;int[] a = new int[] { i, i + 1, j, j + 1 };while (a[0] > 0) {for (int k = 0; k < a.length; ++k) {a[k] = (a[k] - 1) / 2;val[a[k]] = merge(val[2 * a[k] + 1], val[2 * a[k] + 2]);}}}void swapVal(int i, int j) {long x = val[i + n - 1].dq.peek();long y = val[j + n - 1].dq.peek();if (x == y)return;setVal(i, y);setVal(j, x);}void setVal(int k, long v) {k += n - 1;val[k].dq.clear();val[k].dq.add(v);while (k > 0) {k = (k - 1) / 2;val[k] = merge(val[2 * k + 1], val[2 * k + 2]);}}long query(int a, int b) {long ret = 0;V pnd = query(a, b, 0, n, 0);for (long v : pnd.dq) {ret = ret + v;if (ret >= MOD)ret -= MOD;}return ret;}V query(int a, int b, int l, int r, int k) {if (b <= l || r <= a) {return new V();} else if (a <= l && r <= b) {return val[k];} else {V vl = query(a, b, l, (l + r) / 2, 2 * k + 1);V vr = query(a, b, (l + r) / 2, r, 2 * k + 2);return merge(vl, vr);}}}V merge(V u, V v) {V ret = new V();for (long n : u.dq) {ret.dq.addLast(n);}boolean f = false;if (u.right_op.equals("*") && v.left_op.equals("*")) {ret.dq.pollLast();ret.dq.addLast(u.dq.peekLast() * v.dq.peekFirst() % MOD);f = true;}for (long n : v.dq) {if (!f)ret.dq.addLast(n);elsef = false;}if (ret.dq.size() > 3) {long tmp1 = ret.dq.pollFirst();while (ret.dq.size() > 3) {long tmp2 = ret.dq.pollFirst() + ret.dq.pollFirst();if (tmp2 >= MOD)tmp2 -= MOD;ret.dq.addFirst(tmp2);}ret.dq.addFirst(tmp1);}ret.left_op = u.left_op;ret.right_op = v.right_op;return ret;}class V {Deque<Long> dq = new ArrayDeque<>();String left_op = "!";String right_op = "!";}static void tr(Object... objects) {System.out.println(Arrays.deepToString(objects));}class Scanner {private final InputStream in = System.in;private final byte[] buffer = new byte[1024];private int ptr = 0;private int buflen = 0;private boolean hasNextByte() {if (ptr < buflen) {return true;} else {ptr = 0;try {buflen = in.read(buffer);} catch (IOException e) {e.printStackTrace();}if (buflen <= 0) {return false;}}return true;}private int readByte() {if (hasNextByte())return buffer[ptr++];elsereturn -1;}private boolean isPrintableChar(int c) {return 33 <= c && c <= 126;}public boolean hasNext() {while (hasNextByte() && !isPrintableChar(buffer[ptr]))ptr++;return hasNextByte();}public String next() {if (!hasNext())throw new NoSuchElementException();StringBuilder sb = new StringBuilder();int b = readByte();while (isPrintableChar(b)) {sb.appendCodePoint(b);b = readByte();}return sb.toString();}public long nextLong() {if (!hasNext())throw new NoSuchElementException();long n = 0;boolean minus = false;int b = readByte();if (b == '-') {minus = true;b = readByte();}if (b < '0' || '9' < b) {throw new NumberFormatException();}while (true) {if ('0' <= b && b <= '9') {n *= 10;n += b - '0';} else if (b == -1 || !isPrintableChar(b)) {return minus ? -n : n;} else {throw new NumberFormatException();}b = readByte();}}public int nextInt() {long nl = nextLong();if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)throw new NumberFormatException();return (int) nl;}public double nextDouble() {return Double.parseDouble(next());}}}