PloadyFree

avx

Oct 15th, 2019
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #pragma GCC optimize("Ofast")
  2. //#pragma GCC optimize("O0")
  3. #pragma GCC target("sse4.1,sse4.2,ssse3,sse3,sse2,sse")
  4. #pragma GCC target("avx")
  5. #pragma GCC target("avx2")
  6.  
  7. #include <bits/stdc++.h>
  8. #include <x86intrin.h>
  9.  
  10. using namespace std;
  11.  
  12. const int maxn = 100000;
  13. alignas(32) int LEFT[4];
  14. alignas(32) int RIGHT[4];
  15. alignas(32) int a[8][maxn * 8];
  16.  
  17. void shiftArrays(int n) {
  18.   for (int t = 0; t < 8; t++) {
  19.     int t0 = a[t][0];
  20.     for (int i = 0; i + 1 < 8 * n; i++) a[t][i] = a[t][i + 1];
  21.     a[t][8 * n - 1] = t0;
  22.   }
  23. }
  24.  
  25. int main(int argc, char *argv[]) {
  26.   ios::sync_with_stdio(false);
  27.   cin.tie(nullptr);
  28.  
  29. //  cout << __builtin_cpu_supports("avx") << endl;
  30. //  cout << __builtin_cpu_supports("avx2") << endl;
  31.  
  32.   int n;
  33.   cin >> n;
  34.   for (int i = 0; i < 4; i++) cin >> LEFT[i] >> RIGHT[i];
  35.   for (int i = 0; i < 4 * n; i++) {
  36.     int x;
  37.     cin >> x;
  38.     for (int t = 0; t < 8; t++) {
  39.       int at = (i - t + 8 * n) % (8 * n);
  40.       a[t][at] = a[t][(at + 4 * n) % (8 * n)] = x;
  41.     }
  42.   }
  43.   for (int shiftedTimes = 0; shiftedTimes < 8; shiftedTimes++) {
  44.     for (int firstElement = 0; firstElement < 4 * n; firstElement += 8) {
  45.       bool ok = true;
  46.       for (int j = 0; j < 4; j++) {
  47.         int packStart = firstElement + j * n;
  48.         int delta = packStart % 8;
  49.         packStart -= delta;
  50.         __m256i accum = _mm256_setzero_si256();
  51.         for (int k = 0; k + 8 <= n; k += 8) {
  52.           //todo fix
  53.           __m256i *p = (__m256i *) &a[delta][packStart + k];
  54.           __m256i b = _mm256_load_si256(p);
  55.           __m256i epi_32 = _mm256_add_epi32(accum, b);
  56.           accum = epi_32;
  57.         }
  58.         auto arr = ((int *) &accum);
  59.         int sum = arr[0] + arr[1] + arr[2] + arr[3] + arr[4] + arr[5] + arr[6] + arr[7];
  60.         for (int it = n / 8 * 8; it < n; it++) sum += a[delta][packStart + it];
  61.         if (!(LEFT[j] * n <= sum && sum <= RIGHT[j] * n)) {
  62.           ok = false;
  63.           break;
  64.         }
  65.       }
  66.       if (ok) {
  67.         cout << firstElement + shiftedTimes + 1;
  68.         return 0;
  69.       }
  70.     }
  71.     shiftArrays(n);
  72.   }
  73. }
Advertisement
Add Comment
Please, Sign In to add comment