Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- https://codeforces.com/gym/101485/submission/62876199 Problem G
- #ifndef ONLINE_JUDGE
- #pragma GCC optimize("O0")
- #pragma GCC target("sse4.2")
- #elif ONLINE_JUDGE
- #pragma GCC optimize("Ofast")
- #pragma GCC target("avx2")
- #endif
- #include <bits/stdc++.h>
- #include <x86intrin.h>
- using namespace std;
- #define ALIGN 32
- const int maxn = 200000;
- alignas(ALIGN) int a[maxn];
- alignas(ALIGN) int b[maxn];
- alignas(ALIGN) int c[maxn];
- alignas(ALIGN) int posb[maxn];
- alignas(ALIGN) int posc[maxn];
- alignas(ALIGN) int specialC[maxn];
- #define PACK_SIZE 8
- int find1(int pb, int pc, int x) {
- int result = 0;
- for (int i = 0; i + PACK_SIZE <= pb; i += PACK_SIZE) {
- for (int j = 0; j < PACK_SIZE; j++) {
- result += b[i + j] < x && specialC[i + j] < pc;
- }
- }
- for (int i = pb / PACK_SIZE * PACK_SIZE; i < pb; i++) result += b[i] < x && specialC[i] < pc;
- return result;
- }
- int find2(int pb, int pc, int x) {
- __m256i accum = _mm256_setzero_si256();
- __m256i xs = _mm256_set1_epi32(x);
- __m256i pcs = _mm256_set1_epi32(pc);
- __m256i ones = _mm256_set1_epi32(1);
- for (int i = 0; i + PACK_SIZE <= pb; i += PACK_SIZE) {
- __m256i bs = _mm256_load_si256((__m256i *) &b[i]);
- __m256i cs = _mm256_load_si256((__m256i *) &specialC[i]);
- __m256i cmp1 = _mm256_cmpgt_epi32(pcs, cs);
- __m256i cmp2 = _mm256_cmpgt_epi32(xs, bs);
- __m256i res = _mm256_and_si256(cmp1, cmp2);
- __m256i res1 = _mm256_and_si256(res, ones);
- accum = _mm256_add_epi32(accum, res1);
- }
- int result = 0;
- int* array = (int*) &accum;
- for (int i = 0; i < PACK_SIZE; i++) result += array[i];
- for (int i = pb / PACK_SIZE * PACK_SIZE; i < pb; i++) result += b[i] < x && specialC[i] < pc;
- return result;
- }
- int main(int argc, char *argv[]) {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- int n;
- cin >> n;
- for (int i = 0; i < n; i++) cin >> a[i], a[i]--;
- for (int i = 0; i < n; i++) cin >> b[i], b[i]--;
- for (int i = 0; i < n; i++) cin >> c[i], c[i]--;
- for (int i = 0; i < n; i++) posb[b[i]] = i;
- for (int i = 0; i < n; i++) posc[c[i]] = i;
- for (int i = 0; i < n; i++) b[posb[a[i]]] = i;
- for (int i = 0; i < n; i++) c[posc[a[i]]] = i;
- for (int i = 0; i < n; i++) posb[b[i]] = i;
- for (int i = 0; i < n; i++) posc[c[i]] = i;
- for (int i = 0; i < n; i++) specialC[i] = posc[b[i]];
- long long answer = 0;
- for (int i = 0; i < n; i++) {
- int pb = posb[i];
- int pc = posc[i];
- answer += find2(pb,pc,i);
- }
- cout << answer;
- }
Advertisement
Add Comment
Please, Sign In to add comment