Advertisement
matheus_monteiro

Permutation

Nov 13th, 2022
504
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2.  
  3. /*
  4.  * Author: Matheus Monteiro
  5.  */
  6.  
  7. using namespace std;
  8. #define fastio std::ios_base::sync_with_stdio(0); std::cin.tie(0); std::cout.tie(0);
  9.  
  10. const int mod = 1000000007; //10^9 + 7
  11. const int n = 300010;
  12. int prime = 1238473;
  13. vector<int> pot;
  14. vector<int> h1;
  15. vector<int> h2;
  16.  
  17. inline int normalize(long long x) {
  18.     x = x % mod;
  19.     if(x < 0) x += mod;
  20.     return x;
  21. }
  22.  
  23. inline int add(int a, int b) {
  24.     return normalize(normalize(a) + normalize(b));
  25. }
  26.  
  27. inline int prod(int a, int b) {
  28.     return normalize(normalize(a) * 1ll * normalize(b));
  29. }
  30.  
  31. inline int sub(int a, int b) {
  32.     return normalize(normalize(a) - normalize(b));
  33. }
  34.  
  35. inline int expMod(int x, int e) {
  36.     int ans = 1;
  37.     while(e > 0) {
  38.         if(e & 1LL) ans = prod(ans, x), e--;
  39.         else x = prod(x, x), e /= 2;
  40.     }
  41.     return normalize(ans);
  42. }
  43.  
  44. inline int inv(int x) {
  45.     return expMod(x, mod - 2);
  46. }
  47.  
  48. inline int qry(int p) {
  49.     int h_val = 0;
  50.     while(p) h_val = add(h1[p], h_val), p -= p & (-p);
  51.     return h_val;
  52. }
  53.  
  54. inline void upd(int p, int val) {
  55.     val = prod(val, pot[p - 1]);
  56.     while(p <= n) h1[p] = add(h1[p], val), p += p & (-p);
  57. }
  58.  
  59. inline int hashVal(int l, int r) {
  60.     return prod(sub(qry(r), qry(l - 1)), inv(pot[l - 1]));
  61. }
  62.  
  63. inline int qryRev(int p) {
  64.     int h_val = 0;
  65.     while(p <= n) h_val = add(h2[p], h_val), p += p & (-p);
  66.     return h_val;
  67. }
  68.  
  69. inline void updRev(int p, int val) {
  70.     val = prod(val, pot[n - p]);
  71.     while(p) h2[p] = add(h2[p], val), p -= p & (-p);
  72. }
  73.  
  74. inline int hashValRev(int l, int r) {
  75.     return prod(sub(qryRev(l), qryRev(r + 1)), inv(pot[n - r]));
  76. }
  77.  
  78. void solve() {
  79.     h1.resize(n + 1);
  80.     h2.resize(n + 1);
  81.  
  82.     int m;
  83.     bool flag = false;
  84.     cin >> m;
  85.  
  86.     for(int i = 1; i <= n; ++i) {
  87.         upd(i, 2);
  88.         updRev(i, 2);
  89.     }
  90.  
  91.     for(int i = 1; i <= m; ++i) {
  92.         int x;
  93.         cin >> x;
  94.  
  95.         upd(x, -1);
  96.         updRev(x, -1);
  97.  
  98.         int k = min(x, m - x);
  99.        
  100.         if(hashVal(x - k + 1, x + k - 1) != hashValRev(x - k + 1, x + k - 1)) {
  101.             flag = true;
  102.             break;
  103.         }
  104.     }
  105.  
  106.     if(flag) cout << "YES\n";
  107.     else cout << "NO\n";
  108. }
  109.  
  110. int32_t main() {
  111.     fastio;
  112.  
  113.     pot.resize(n + 1);
  114.     pot[0] = 1;
  115.     for(int i = 1; i <= n; ++i) {
  116.         pot[i] = prod(pot[i - 1], prime);
  117.     }
  118.  
  119.     solve();
  120.  
  121.     return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement