PloadyFree

SIMD hard

Oct 25th, 2019
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. https://codeforces.com/gym/101485 G
  2.  
  3. #ifndef ONLINE_JUDGE
  4. #pragma GCC optimize("O0")
  5. #elif ONLINE_JUDGE
  6. #pragma GCC optimize("Ofast")
  7. #pragma GCC target("sse4.2")
  8. #pragma GCC target("avx2")
  9. #endif
  10.  
  11. #include <bits/stdc++.h>
  12. #include <x86intrin.h>
  13.  
  14. using namespace std;
  15.  
  16. const int maxn = 200000;
  17. alignas(32) int a[maxn];
  18. alignas(32) int b[maxn];
  19. alignas(32) int c[maxn];
  20. alignas(32) int posb[maxn];
  21. alignas(32) int posc[maxn];
  22. alignas(32) int specialC[maxn];
  23.  
  24. #define PACK_SIZE 128
  25.  
  26. int cnt[PACK_SIZE];
  27. int find1(int pb, int pc, int x) {
  28.   for (int i = 0; i < PACK_SIZE; i++) cnt[i] = 0;
  29.   for (int i = 0; i + PACK_SIZE <= pb; i += PACK_SIZE) {
  30.     for (int j = 0; j < PACK_SIZE; j++) {
  31.       cnt[j] += b[i + j] < x && specialC[i + j] < pc;
  32.     }
  33.   }
  34.   int result = 0;
  35.   for (int i = 0; i < PACK_SIZE; i++) result += cnt[i];
  36.   for (int i = pb / PACK_SIZE * PACK_SIZE; i < pb; i++) result += b[i] < x && specialC[i] < pc;
  37.   return result;
  38. }
  39.  
  40. int main(int argc, char *argv[]) {
  41.   ios::sync_with_stdio(false);
  42.   cin.tie(nullptr);
  43.  
  44.   int n;
  45.   cin >> n;
  46.   for (int i = 0; i < n; i++) cin >> a[i], a[i]--;
  47.   for (int i = 0; i < n; i++) cin >> b[i], b[i]--;
  48.   for (int i = 0; i < n; i++) cin >> c[i], c[i]--;
  49.   for (int i = 0; i < n; i++) posb[b[i]] = i;
  50.   for (int i = 0; i < n; i++) posc[c[i]] = i;
  51.   for (int i = 0; i < n; i++) b[posb[a[i]]] = i;
  52.   for (int i = 0; i < n; i++) c[posc[a[i]]] = i;
  53.   for (int i = 0; i < n; i++) posb[b[i]] = i;
  54.   for (int i = 0; i < n; i++) posc[c[i]] = i;
  55.   for (int i = 0; i < n; i++) specialC[i] = posc[b[i]];
  56.   long long answer = 0;
  57.   for (int i = 0; i < n; i++) {
  58.     int pb = posb[i];
  59.     int pc = posc[i];
  60.     answer += find1(pb,pc,i);
  61.   }
  62.   cout << answer;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment