Submission #221988

# Submission time Handle Problem Language Result Execution time Memory
221988 2020-04-11T16:34:59 Z TheLorax Building 4 (JOI20_building4) C++11
0 / 100
123 ms 5368 KB
#include <bits/stdc++.h>

//#pragma GCC optimize ("O3")
//#pragma GCC optimize ("Ofast")

#define F first
#define S second
#define MT make_tuple
#define MP make_pair
#define SZ(a) ((int)(a).size())
#define PB push_back
#define LBS 20
#define MOD ((ll)1224736769)//((ll)((1<<24)+(1<<16)+(1<<8)+1))//((long long)1e9+7) //1e9+9
#define PHIMOD ((ll)MOD-1) //((ll)(1<<24))
#define LEFT(i) (2*(i))
#define RIGHT(i) (2*(i)+1)
#define PAR(i) ((i)/2)
#define ALL(a) (a).begin(), (a).end()
#define END(s) {cout << s;return;}

using namespace std;

typedef uint64_t ll;
typedef double rat;
typedef long long bi;
typedef pair<ll, ll> ii;
typedef std::vector<ii> vii;
typedef std::map<ll, ll> mii;
typedef bitset<LBS> bis;
typedef std::vector<bis> vbs;
typedef array<std::vector<ll>, 4> av; //aa,ab,ba,bb

template<class T>
void in(T &a){
  for(auto &x: a)
    cin >> x;
}

template<class T>
void out(T &a, string sep=" "){
  for(auto x: a)
    cout << x<<sep;
  cout << '\n';
}

template<class T>
void err(T &a, string sep=" "){
  for(auto x: a)
    cerr << x <<sep;
  cerr << '\n';
}

void fft(std::vector<ll> &v, std::vector<ll> &f, int n, ll a){
  std::vector<int> mp(n);
  std::vector<ll> pa(n+1);
  pa[0]=1;
  for(int i=1; i<=n; i++)
    pa[i]=(pa[i-1]*a)%MOD;
  iota(ALL(mp),0);
  sort(ALL(mp),[](const int &a, const int &b){
    for(int i=0; i<32; i++)
      if((a&(1<<i))!=(b&(1<<i)))
        return (a&(1<<i))<(b&(1<<i));
    return false;
  });
  for(int i=0; i<n; i++)
    f[i]=v[mp[i]];
  ll t;
  for(int l=1; l<n; l*=2)
    for(int st=0; st<n; st+=l*2)
      for(int i=0; i<l; i++){
        t=f[st+i];
        f[st+i]=(t+(pa[(i*n/l/2)%n]*f[st+i+l])%MOD+MOD)%MOD;
        f[st+i+l]=(t+(pa[((i+l)*n/l/2)%n]*f[st+i+l])%MOD+MOD)%MOD;
      }
}

ll np2=1, fa, infa;
std::vector<ll> pa;
map<ii,av> miiav;

void rek(const av &a, av &v, int st=0, int l=np2){
  if(l==1){
    v[0][0]=v[3][0]=1;
    return;
  }
  if(miiav.count({st,l})){
    v=miiav[{st,l}];
    return;
  }
  av lv, rv, lf, rf;
  for(int i=0; i<4; i++){
    lv[i].resize(l,0);
    rv[i].resize(l,0);
    lf[i].resize(l,0);
    rf[i].resize(l,0);
  }
  rek(a,lv,st,l/2);
  rek(a,rv,st+l/2,l/2);
  for(int i=0; i<4; i++){
    fft(lv[i], lf[i], l, pa[np2/l]);
    fft(rv[i], rf[i], l, pa[np2/l]);
  }
  av f;
  for(int j=0; j<4; j++){
    f[j].resize(l,0);
    for(int k=0; k<4; k++)
      if(a[k/2][st+l/2-1]<=a[k%2][st+l/2])
        for(int i=0; i<l; i++)
          f[j][i]+=(lf[(j/2)*2+k/2][i]*(rf[(k%2)*2+j%2][i]*(k/2?1:pa[(np2/l*i)%np2]))%MOD)%MOD;
  }
  for(int i=0; i<4; i++){
    fft(f[i],v[i],l, pa[np2-np2/l]);
    for(auto &x: v[i])
      x=(x!=0);
  }
  miiav[{st,l}]=v;
}

void path(const av &a, string &s, int an, int dir, int st=0, int l=np2){
  if(l==1){
    assert(dir==0 || dir==3);
    s[st]=(dir==0?'A':'B');
    return;
  }
  av lv, rv;
  for(int i=0; i<4; i++){
    lv[i].resize(l);
    rv[i].resize(l);
  }
  rek(a,lv,st,l/2);
  rek(a,rv,st+l/2,l/2);
  for(int k=0; k<4; k++)
    if(a[k/2][st+l/2-1]<=a[k%2][st+l/2])
      for(int i=max((1-k/2),an-l); i<=min(an,l+(1-k/2)); i++)
        if(lv[(dir/2)*2+k/2][i-(1-k/2)] && rv[(k%2)*2+dir%2][an-i]){
          path(a,s,i-(1-k/2),(dir/2)*2+k/2,st,l/2);
          path(a,s,an-i,(k%2)*2+dir%2,st+l/2,l/2);
          return;
        }
  assert(1);
}

int main(){
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  n*=2;
  while(np2<n)
    np2*=2;
  av a;
  for(int i=0; i<2; i++){
    a[i].resize(n);
    in(a[i]);
    a[i].resize(np2);
  }
  for(int i=n; i<np2; i++){
    a[0][i]=a[0][n-1]+a[1][n-1];
    a[1][i]=0;
  }

  fa=1;
  for(int i=0; i<73; i++)
    fa=(fa*3)%MOD;
  for(int i=1; i<PHIMOD/73/np2; i*=2)
    fa=(fa*fa)%MOD;
  infa=1;
  for(int i=1; i<np2; i++)
    infa=(infa*fa)%MOD;

  pa.resize(np2+1);
  pa[0]=1;
  for(int i=1; i<=np2; i++)
    pa[i]=(pa[i-1]*fa)%MOD;
  // err(pa);
  // cerr << infa<<" "<<fa<<" "<<MOD<<"\n";

  av v;
  for(int i=0; i<4; i++)
    v[i].resize(np2);
  rek(a,v);
  for(int i=0; i<4; i++)
    if(v[i][np2-n/2-(1-i%2)]){
      string s(np2,'0');
      path(a,s,np2-n/2-(1-i%2),i);
      cout << s.substr(0,n)<<"\n";
      return 0;
    }
  cout << "-1\n";
}

Compilation message

building4.cpp: In function 'int main()':
building4.cpp:150:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(np2<n)
         ~~~^~
building4.cpp:158:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=n; i<np2; i++){
                ~^~~~
building4.cpp:166:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=1; i<PHIMOD/73/np2; i*=2)
                ~^~~~~~~~~~~~~~
building4.cpp:169:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=1; i<np2; i++)
                ~^~~~
building4.cpp:174:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=1; i<=np2; i++)
                ~^~~~~
# Verdict Execution time Memory Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
3 Correct 5 ms 384 KB Output is correct
4 Correct 4 ms 384 KB Output is correct
5 Correct 122 ms 5368 KB Output is correct
6 Incorrect 123 ms 5368 KB Token "000000000000000000000000000000...0000000000000000000000000000000" doesn't correspond to pattern "[AB\-1]{1,3598}"
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
3 Correct 5 ms 384 KB Output is correct
4 Correct 4 ms 384 KB Output is correct
5 Correct 122 ms 5368 KB Output is correct
6 Incorrect 123 ms 5368 KB Token "000000000000000000000000000000...0000000000000000000000000000000" doesn't correspond to pattern "[AB\-1]{1,3598}"
7 Halted 0 ms 0 KB -