제출 #221992

#제출 시각아이디문제언어결과실행 시간메모리
221992TheLorax건물 4 (JOI20_building4)C++11
11 / 100
2094 ms362764 KiB
#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 int64_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"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...