Submission #946560
Source Code Expand
import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.Arrays; import java.util.InputMismatchException; public class Main { static InputStream is; static PrintWriter out; static String INPUT = ""; static void solve() { int n = ni(); int[] a = na(n); int[] zs = new int[n+1]; int[] pre = new int[n]; int[] lower = new int[n]; Arrays.fill(lower, -1); int[] fl = new int[n+3]; for(int i = n-1;i >= 0;i--){ if(a[i] != 0){ pre[a[i]-1] += 1; lower[i] = sumFenwick(fl, a[i]-1); addFenwick(fl, a[i]-1, 1); } } for(int i = 0;i < n;i++){ if(pre[i] >= 2){ out.println(0); return; } zs[i+1] = zs[i] + 1 - pre[i]; } // tr(zs); long F = 1; int mod = 1000000007; // 2*2+1*2+0*2 // (3*6+2*6+1*6+0*6)*6 // 6*6*6 // 3*2*4*2 // 1*1*12*1 // 216+48+12 long OFS = 1; { int space = 0; for(int i = n-1;i >= 0;i--){ if(a[i] == 0){ space++; OFS = OFS * space % mod; } } } int space = 0; long ret = 0; long ret2 = 0; long ret3 = 0; long FS = 1; // 24 3 // 23 2 // 4 2 long lowsum = 0; for(int i = n-1;i >= 0;i--){ if(a[i] == 0){ // tr(space, (long)space*(space+1)/2, F); ret = ret * (space+1) % mod; ret += (long)space*(space+1)/2%mod*F%mod*FS%mod; ret3 += lowsum%mod*F%mod*OFS%mod*invl(zs[n],mod)%mod; // 3*6 + 3*2 space++; FS = FS * space % mod; }else{ // l h // l/(l+h)*OFS*d*F ret2 += lower[i] * OFS % mod * F % mod; int los = zs[a[i]-1]; ret2 += los*invl(zs[n], mod) % mod * OFS % mod * space % mod * F % mod; lowsum += zs[n]-los; } F = F * (n-i) % mod; } ret += ret2; ret += ret3; ret += FS; ret%=mod; out.println(ret); } public static long invl(long a, long mod) { long b = mod; long p = 1, q = 0; while (b > 0) { long c = a / b; long d; d = a; a = b; b = d % b; d = p; p = q; q = d - c * q; } return p < 0 ? p + mod : p; } public static int sumFenwick(int[] ft, int i) { int sum = 0; for(i++;i > 0;i -= i&-i)sum += ft[i]; return sum; } public static void addFenwick(int[] ft, int i, int v) { if(v == 0 || i < 0)return; int n = ft.length; for(i++;i < n;i += i&-i)ft[i] += v; } public static void main(String[] args) throws Exception { long S = System.currentTimeMillis(); is = INPUT.isEmpty() ? System.in : new ByteArrayInputStream(INPUT.getBytes()); out = new PrintWriter(System.out); solve(); out.flush(); long G = System.currentTimeMillis(); tr(G-S+"ms"); } private static boolean eof() { if(lenbuf == -1)return true; int lptr = ptrbuf; while(lptr < lenbuf)if(!isSpaceChar(inbuf[lptr++]))return false; try { is.mark(1000); while(true){ int b = is.read(); if(b == -1){ is.reset(); return true; }else if(!isSpaceChar(b)){ is.reset(); return false; } } } catch (IOException e) { return true; } } private static byte[] inbuf = new byte[1024]; static int lenbuf = 0, ptrbuf = 0; private static 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 static boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); } // private static boolean isSpaceChar(int c) { return !(c >= 32 && c <= 126); } private static int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; } private static double nd() { return Double.parseDouble(ns()); } private static char nc() { return (char)skip(); } private static String ns() { int b = skip(); StringBuilder sb = new StringBuilder(); while(!(isSpaceChar(b))){ sb.appendCodePoint(b); b = readByte(); } return sb.toString(); } private static 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 static 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 static int[] na(int n) { int[] a = new int[n]; for(int i = 0;i < n;i++)a[i] = ni(); return a; } private static 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 static 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) { if(INPUT.length() != 0)System.out.println(Arrays.deepToString(o)); } }
Submission Info
Submission Time | |
---|---|
Task | E - Encyclopedia of Permutations |
User | uwi |
Language | Java8 (OpenJDK 1.8.0) |
Score | 1200 |
Code Size | 5559 Byte |
Status | AC |
Exec Time | 412 ms |
Memory | 19016 KB |
Judge Result
Set Name | Sample | Subtask | All | ||||||
---|---|---|---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 500 / 500 | 700 / 700 | ||||||
Status |
|
|
|
Set Name | Test Cases |
---|---|
Sample | 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt |
Subtask | 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt, 1_028.txt, 1_029.txt, 1_030.txt, 1_031.txt, 1_032.txt |
All | 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt, 1_028.txt, 1_029.txt, 1_030.txt, 1_031.txt, 1_032.txt, 2_033.txt, 2_034.txt, 2_035.txt, 2_036.txt, 2_037.txt, 2_038.txt, 2_039.txt, 2_040.txt, 2_041.txt, 2_042.txt, 2_043.txt, 2_044.txt, 2_045.txt, 2_046.txt, 2_047.txt, 2_048.txt, 2_049.txt, 2_050.txt, 2_051.txt, 2_052.txt, 2_053.txt, 2_054.txt, 2_055.txt, 2_056.txt, 2_057.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
0_000.txt | AC | 98 ms | 8020 KB |
0_001.txt | AC | 97 ms | 8148 KB |
0_002.txt | AC | 98 ms | 8020 KB |
0_003.txt | AC | 97 ms | 8144 KB |
0_004.txt | AC | 98 ms | 8148 KB |
1_005.txt | AC | 97 ms | 8148 KB |
1_006.txt | AC | 98 ms | 8148 KB |
1_007.txt | AC | 96 ms | 8148 KB |
1_008.txt | AC | 103 ms | 8268 KB |
1_009.txt | AC | 100 ms | 8144 KB |
1_010.txt | AC | 104 ms | 8404 KB |
1_011.txt | AC | 101 ms | 8272 KB |
1_012.txt | AC | 102 ms | 8272 KB |
1_013.txt | AC | 99 ms | 8272 KB |
1_014.txt | AC | 106 ms | 8400 KB |
1_015.txt | AC | 100 ms | 8144 KB |
1_016.txt | AC | 103 ms | 8276 KB |
1_017.txt | AC | 97 ms | 8140 KB |
1_018.txt | AC | 103 ms | 8272 KB |
1_019.txt | AC | 100 ms | 8268 KB |
1_020.txt | AC | 104 ms | 8400 KB |
1_021.txt | AC | 100 ms | 8144 KB |
1_022.txt | AC | 105 ms | 8276 KB |
1_023.txt | AC | 110 ms | 8404 KB |
1_024.txt | AC | 104 ms | 8276 KB |
1_025.txt | AC | 98 ms | 8144 KB |
1_026.txt | AC | 102 ms | 8276 KB |
1_027.txt | AC | 108 ms | 8148 KB |
1_028.txt | AC | 99 ms | 8404 KB |
1_029.txt | AC | 103 ms | 8404 KB |
1_030.txt | AC | 102 ms | 8276 KB |
1_031.txt | AC | 102 ms | 8400 KB |
1_032.txt | AC | 103 ms | 8272 KB |
2_033.txt | AC | 280 ms | 18880 KB |
2_034.txt | AC | 200 ms | 14028 KB |
2_035.txt | AC | 312 ms | 18888 KB |
2_036.txt | AC | 323 ms | 18240 KB |
2_037.txt | AC | 337 ms | 18884 KB |
2_038.txt | AC | 300 ms | 17728 KB |
2_039.txt | AC | 352 ms | 19008 KB |
2_040.txt | AC | 241 ms | 14012 KB |
2_041.txt | AC | 412 ms | 19016 KB |
2_042.txt | AC | 170 ms | 11060 KB |
2_043.txt | AC | 325 ms | 18884 KB |
2_044.txt | AC | 265 ms | 15700 KB |
2_045.txt | AC | 317 ms | 18900 KB |
2_046.txt | AC | 330 ms | 18500 KB |
2_047.txt | AC | 341 ms | 18884 KB |
2_048.txt | AC | 223 ms | 13380 KB |
2_049.txt | AC | 334 ms | 18884 KB |
2_050.txt | AC | 259 ms | 15552 KB |
2_051.txt | AC | 255 ms | 18900 KB |
2_052.txt | AC | 248 ms | 17876 KB |
2_053.txt | AC | 274 ms | 18876 KB |
2_054.txt | AC | 281 ms | 18896 KB |
2_055.txt | AC | 242 ms | 18896 KB |
2_056.txt | AC | 246 ms | 18892 KB |
2_057.txt | AC | 265 ms | 18892 KB |