题解
暴力就行(如果n 3000,那就要优化成 n^2
1 #include <cstdio> 2 3 #define RE register 4 #define FOR(i,a,b) for(RE int i=a;i<=b;++i) 5 #define ROF(i,a,b) for(RE int i=a;i>=b;--i) 6 #define sc(n) scanf("%d",&n) 7 8 using namespace std; 9 10 int m, n; 11 int a[305], b[5], e[6]; 12 int tex[301][301]; 13 long long ans; 14 15 int main() 16 { 17 sc(n); 18 FOR(i, 1, n) 19 { 20 FOR(j, 1, n)tex[j][i] = tex[j][i - 1]; 21 sc(a[i]); tex[a[i]][i] += 1; 22 } 23 FOR(i, 1, 4) 24 { 25 sc(b[i]); 26 FOR(j, 1, i - 1) 27 if (b[i] == b[j]) 28 if (j == 1)e[i - 2] = 1; 29 else if (j == 2)e[i] = 1; 30 else e[5] = 1; 31 } 32 FOR(i, 1, n - 3) 33 FOR(j, i + 1, n - 2) 34 { 35 if (e[0] && a[i] != a[j])continue; 36 if (!e[0] && a[i] == a[j])continue; 37 FOR(x, j + 1, n - 1) 38 if ((e[1] && a[i] != a[x]) || (!e[1] && a[i] == a[x]))continue; 39 else if ((e[3] && a[j] != a[x]) || (!e[3] && a[j] == a[x]))continue; 40 else if (e[2])ans += tex[a[i]][n] - tex[a[i]][x]; 41 else if (e[4])ans += tex[a[j]][n] - tex[a[j]][x]; 42 else if (e[5]) ans += tex[a[x]][n] - tex[a[x]][x]; 43 else ans += n - x - tex[a[i]][n] + tex[a[i]][x] - (!e[0]) * (tex[a[j]][n] - tex[a[j]][x]) - (!e[1] && !e[3]) * (tex[a[x]][n] - tex[a[x]][x]); 44 } 45 printf("%lld", ans); 46 return 0; 47 }