Advertisement
Mr_Olympia

Untitled

Apr 26th, 2020
343
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.45 KB | None | 0 0
  1. #ifdef ONPC
  2. # define _GLIBCXX_DEBUG
  3. #define deb(a) cerr << "yo " << #a << " = " << a << endl;
  4. #else
  5. #define deb(a)
  6. #endif
  7. #include <bits/stdc++.h>
  8. #define endl "\n"
  9. //#pragma GCC optimize("Ofast")
  10. //#pragma GCC target("avx,avx2,fma,sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  11.  
  12.  
  13.  
  14. using namespace std;
  15.  
  16.  
  17. typedef long long ll;
  18. typedef long double ld;
  19. ll MOD = 998244353;
  20. ll INF = 1e18;
  21. #define int ll
  22.  
  23.  
  24. const int N = 600000;
  25.  
  26. int t[N*4];
  27. int nn,s=1;
  28. vector<ll> pp;
  29. void build(){
  30.     nn = pp.size();
  31.     while(s<nn)s*=2;
  32.     for (int i = s; i < 2 * s; i++) t[i] = INF;
  33.     for (int i = s; i < s + nn; i++) t[i] = pp[i - s];
  34.     for(int i=s;--i;)t[i]=min(t[i+i], t[i+i+1]);
  35. }
  36. //void add(int i,int val){for(t[i+=s]+=val;i/=2;)t[i]=t[i+i]+t[i+i+1];}
  37. int get(int l,int r){//[l..r]
  38.     int res=INF;
  39.     for(l+=s,r+=s+1;l<r;l/=2,r/=2){
  40.         if(l&1)res = min(res,t[l++]);
  41.         if(r&1)res = min(res,t[--r]);
  42.     }
  43.     return res;
  44. }
  45.  
  46. vector<vector<ll> > pl;
  47. vector<ll> p;
  48. vector<ll> us;
  49. set<pair<ll, ll> > st;
  50. ll gv = 1;
  51. void ad(ll l, ll r){ // [l; r]
  52.     if (!gv)
  53.         return;
  54.  
  55.     auto l1 = st.lower_bound({l, r});
  56.     //cout << l << " suk " << r << endl;
  57.     if ((*l1).first > r){
  58.         l1--;
  59.         if ((*l1).second < l){
  60.             st.insert({l, r});
  61.         }
  62.         else{
  63.             gv = 0;
  64.         }
  65.     } else{
  66.         gv = 0;
  67.     }
  68.     if (!gv) return;
  69.     //cout <<  gv << endl;
  70.     //cout << pl[p[l]][0] << " " << pl[p[l]][1] << " " << pl[p[l]][2] << "\n";
  71.     us[pl[p[l]][0]] = us[pl[p[l]][1]] = us[pl[p[r]][2]] = 2;
  72.     us[l]--;
  73.     us[r]--;
  74.     for (int i = l + 1; i < r; i++){
  75.         if (!us[pl[p[i]][0]] && pl[p[i]][0] == i && pl[p[i]][1] > r){
  76.             ad(pl[p[i]][1], pl[p[i]][2]);
  77.         }
  78.         else {
  79.             if (!us[pl[p[i]][0]] && pl[p[i]][2] == i && pl[p[i]][1] < l) {
  80.                 ad(pl[p[i]][0], pl[p[i]][1]);
  81.             }
  82.             else{
  83.                 //cout << "suka";
  84.                 gv = 0;
  85.             }
  86.         }
  87.         us[i] = 1;
  88.     }
  89. }
  90.  
  91. ll go(vector<ll> a){
  92.     //cout << 234324;
  93.     gv = 1;
  94.     st.insert({-1, -1});
  95.     st.insert({INF, INF});
  96.     ll ans = 0;
  97.     ll n = a.size();
  98.  
  99.     us.resize(n, 0);
  100.     for (int i = 0; i < n; i++) us[i] = 0;
  101.     p = a;
  102.     ll r =0;
  103.     for (int i = 1; i < n; i++){
  104.         if (a[i] == 1){
  105.             r = i;
  106.             break;
  107.         }
  108.     }
  109.     pl.clear();
  110.     pl.resize(n / 3 + 1);
  111.     for (int i = 0; i < n; i++){
  112.         pl[a[i]].push_back(i);
  113.     }
  114.  
  115.     vector<ll> nxt(n);
  116.     vector<ll> lst(n, INF);
  117.     for (int i = n - 1; i > -1; i--){
  118.         nxt[i] = lst[a[i]];
  119.         lst[a[i]] = i;
  120.     }
  121.     pp = nxt;
  122.     build();
  123.  
  124.     ad(0, r);
  125.     //cout << gv << endl;
  126.     for (int i = 1; i <= n / 3; i++){
  127.         if (!us[pl[i][0]] && get(pl[i][0], pl[i][1]) < pl[i][1]){
  128.             ad(pl[i][1], pl[i][2]);
  129.         }
  130.         if (!us[pl[i][0]] && get(pl[i][1], pl[i][2]) < pl[i][2]){
  131.             ad(pl[i][0], pl[i][1]);
  132.         }
  133.     }
  134.  
  135.     //cout << gv << endl;
  136.     ans = 1;
  137.     {
  138.         for (int i = 0; i < n; i++) {
  139.             cout << p[i] << " ";
  140.         }
  141.         cout << endl;
  142.         for (int i = 0; i < n; i++) {
  143.             cout << us[i] << " ";
  144.         }
  145.         cout << endl;
  146.     }
  147.     cout << "gv " << gv << endl;
  148.     for (int i = 0; i < n;){
  149.         if (!us[i]){
  150.             //cout << i << " " << gv << endl;
  151.             if (i >= n - 2){
  152.                 gv = 0;
  153.                 break;
  154.             }
  155.             vector<ll> nx;
  156.             ll lst = 0;
  157.             for (int j = i; j < n; j++){
  158.                 if (us[j] == 0){
  159.                     nx.push_back(j);
  160.                 }
  161.                 if (us[j] == 1){
  162.                     break;
  163.                 }
  164.                 lst = j;
  165.                 if (nx.size() == 6){
  166.                     break;
  167.                 }
  168.             }
  169.             lst++;
  170.             if (nx.size() != 3 && nx.size() != 6){
  171.                 //cout << "suka";
  172.                 gv = 0;
  173.                 break;
  174.             }
  175.             if (nx.size() == 3) {
  176.                 if (p[nx[0]] == p[nx[1]] && p[nx[1]] == p[nx[2]]) {
  177.                     ans *= 2;
  178.                     ans %= MOD;
  179.                     i  = lst;
  180.                 }
  181.                 else{
  182.                     gv = 0;
  183.                     break;
  184.                 }
  185.             }
  186.             else{
  187.                 if (p[nx[0]] == p[nx[2]] && p[nx[2]] == p[nx[4]] && p[nx[1]] == p[nx[3]] && p[nx[3]] == p[nx[5]]){
  188.                     i = lst;
  189.                 }
  190.                 else{
  191.                     if (p[nx[0]] == p[nx[1]] && p[nx[1]] == p[nx[2]] && p[nx[3]] == p[nx[4]] && p[nx[4]] == p[nx[5]]) {
  192.                         ans *= 4;
  193.                         ans %= MOD;
  194.                         i  = lst;
  195.                     }
  196.                     else{
  197.                         gv = 0;
  198.                         break;
  199.                     }
  200.                 }
  201.  
  202.             }
  203.         }
  204.         else{
  205.             i++;
  206.         }
  207.     }
  208.     st.clear();
  209.     cout << ans << endl;
  210.     cout << gv << endl;
  211.     return ans * gv;
  212. }
  213.  
  214.  
  215. signed main() {
  216.     ios::sync_with_stdio(0), cin.tie(0), cout.tie(0), cout << fixed << setprecision(20);
  217.     ll n;
  218.     cin >> n;
  219.     vector<ll> b(3 * n);
  220.     vector<ll> a(3 * n);
  221.     for (int i = 0; i < 3 * n; i++){
  222.         cin >> b[i];
  223.     }
  224.     ll fl = 0;
  225.     ll sd = 0;
  226.     for (int i = 0; i < 3 * n; i++){
  227.         if (b[i] == 1){
  228.             fl++;
  229.         }
  230.         if (fl == 1){
  231.             sd = i;
  232.             break;
  233.         }
  234.     }
  235.     for (int i = 0; i < 3 * n; i++){
  236.         a[i] = b[(i + sd) % (3 * n)];
  237.     }
  238.     ll ans = 0;
  239.  
  240.     ans += go(a);
  241.  
  242.     fl = 0;
  243.     sd = 0;
  244.     for (int i = 0; i < 3 * n; i++){
  245.         if (b[i] == 1){
  246.             fl++;
  247.         }
  248.         if (fl == 2){
  249.             sd = i;
  250.             break;
  251.         }
  252.     }
  253.     for (int i = 0; i < 3 * n; i++){
  254.         a[i] = b[(i + sd) % (3 * n)];
  255.     }
  256.  
  257.     ans += go(a);
  258.  
  259.     fl = 0;
  260.     sd = 0;
  261.     for (int i = 0; i < 3 * n; i++){
  262.         if (b[i] == 1){
  263.             fl++;
  264.         }
  265.         if (fl == 3){
  266.             sd = i;
  267.             break;
  268.         }
  269.     }
  270.     for (int i = 0; i < 3 * n; i++){
  271.         a[i] = b[(i + sd) % (3 * n)];
  272.     }
  273.     ans += go(a);
  274.     ans %= MOD;
  275.     cout << ans;
  276.  
  277.  
  278.  
  279. #ifdef ONPC
  280.   //  cerr << endl << "finished in " << clock() * 1.0 / CLOCKS_PER_SEC << " sec" << endl;
  281. #endif
  282. }
  283. //egor lox
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement