結果
問題 | No.619 CardShuffle |
ユーザー |
![]() |
提出日時 | 2017-12-20 19:08:50 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 892 ms / 3,000 ms |
コード長 | 6,432 bytes |
コンパイル時間 | 3,878 ms |
コンパイル使用メモリ | 90,284 KB |
実行使用メモリ | 99,800 KB |
最終ジャッジ日時 | 2024-12-22 23:11:25 |
合計ジャッジ時間 | 22,243 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 35 |
ソースコード
import java.io.*;import java.util.*;import java.math.*;// import java.awt.Point;public class Main {InputStream is;PrintWriter out;String INPUT = "";long MOD = 1_000_000_007;int inf = Integer.MAX_VALUE;int[] c,o;SegmentTree seg;void update(int i){if(i==0) seg.update(i,new long[]{1,0,c[i]});else if(o[i-1]==1) seg.update(i,new long[]{c[i],0,-1});else seg.update(i,new long[]{1,0,c[i]});}void solve(){int n=ni();c=new int[n/2+1];o=new int[n/2+1];for(int i=0;i<n;++i){char s = nc();if(i%2==0)c[i/2]=s-'0';elseo[i/2]=(s=='*'?1:0);}o[n/2]=0;int q=ni();seg=new SegmentTree();for(int i=0;i<n/2+1;++i)update(i);List <Long> arr = new ArrayList<>();for(int i=0;i<q;++i){char t = nc();int x=ni();int y=ni();if(t=='!'){x--;y--;if(x%2==1){int temp=o[x/2];o[x/2]=o[y/2];o[y/2]=temp;update(x/2+1);update(y/2+1);}else{int temp =c[x/2];c[x/2]=c[y/2];c[y/2]=temp;update(x/2);update(y/2);}}else{long[]res=seg.query(x/2,y/2+1);long ans=0;// out.println(res[0]+" "+res[1]+" "+res[2]);if(x/2>0){if(res[0]!=1 || o[x/2-1]==1) ans = (ans+res[0])%MOD;}ans = (ans+res[1])%MOD;if(res[2]!=-1) ans = (ans+res[2])%MOD;arr.add(ans);out.println(ans);}}// for(long j : arr){// out.println(j);// }}class SegmentTree {int SIZE = 1 << 18;long[][] seg;SegmentTree() {this.seg = new long[2 * SIZE][3];for(int i=0;i<2*SIZE;++i){seg[i][0]=-1;seg[i][2]=1;}}long[]comb(long[]a,long[]b){if(a[2]==-1&&b[2]==-1)return new long[]{a[0]*b[0]%MOD,0,-1};if(a[2]==-1&&b[2]>=0)return new long[]{a[0]*b[0]%MOD,b[1],b[2]};if(a[2]>=0&&b[2]==-1)return new long[]{a[0],a[1],a[2]*b[0]%MOD};return new long[]{a[0],(a[1]+b[1]+a[2]*b[0])%MOD,b[2]};}void update(int x, long[]value) {x += SIZE - 1;for(int i=0;i<3;++i)this.seg[x][i] = value[i];while (x > 0) {x = (x - 1) / 2;this.seg[x] = comb(this.seg[2 * x + 1], this.seg[2 * x + 2]);}}long[]query(int a,int b,int l,int r,int k){if(a<=l&&r<=b)return seg[k];if(b<=l||r<=a)return new long[]{1,0,-1};long[]ans1=query(a,b,l,(l+r)/2,2*k+1);long[]ans2=query(a,b,(l+r)/2,r,2*k+2);return comb(ans1,ans2);}long[]query(int l, int r) {return query(l,r,0,SIZE,0);}}void run() throws Exception{is = INPUT.isEmpty() ? System.in : new ByteArrayInputStream(INPUT.getBytes());out = new PrintWriter(System.out);long s = System.currentTimeMillis();solve();out.flush();if(!INPUT.isEmpty())tr(System.currentTimeMillis()-s+"ms");}public static void main(String[] args) throws Exception { new Main().run(); }private byte[] inbuf = new byte[1024];private int lenbuf = 0, ptrbuf = 0;private int readByte(){if(lenbuf == -1)throw new InputMismatchException();if(ptrbuf >= lenbuf){ptrbuf = 0;try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }if(lenbuf <= 0)return -1;}return inbuf[ptrbuf++];}private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }private double nd() { return Double.parseDouble(ns()); }private char nc() { return (char)skip(); }private String ns(){int b = skip();StringBuilder sb = new StringBuilder();while(!(isSpaceChar(b) && b != ' ')){sb.appendCodePoint(b);b = readByte();}return sb.toString();}private char[] ns(int n){char[] buf = new char[n];int b = skip(), p = 0;while(p < n && !(isSpaceChar(b))){buf[p++] = (char)b;b = readByte();}return n == p ? buf : Arrays.copyOf(buf, p);}private char[][] nm(int n, int m){char[][] map = new char[n][];for(int i = 0;i < n;i++)map[i] = ns(m);return map;}private int[] na(int n){int[] a = new int[n];for(int i = 0;i < n;i++)a[i] = ni();return a;}private int ni(){int num = 0, b;boolean minus = false;while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));if(b == '-'){minus = true;b = readByte();}while(true){if(b >= '0' && b <= '9'){num = num * 10 + (b - '0');}else{return minus ? -num : num;}b = readByte();}}private long nl(){long num = 0;int b;boolean minus = false;while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));if(b == '-'){minus = true;b = readByte();}while(true){if(b >= '0' && b <= '9'){num = num * 10 + (b - '0');}else{return minus ? -num : num;}b = readByte();}}private static void tr(Object... o) { System.out.println(Arrays.deepToString(o)); }}