#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <map> #include <queue> #include <set> using namespace std; const int N = 1000010; int A[N]; int B[N]; char S[N]; int P[N+N]; int PS[N+N]; vector<pair<int,pair<int,int> > > V; vector<pair<int,int> > VS; vector<pair<int,int> > IVS; set<pair<int, int> > SS; set<pair<int, int> > ISS; int gcd(int a, int b) { return b == 0 ? a : gcd(b,a%b); } int main() { int n; scanf("%d",&n); for(int i=0;i<n;++i) scanf("%d",&A[i]); int m; scanf("%d",&m); scanf("%s",S); int G=gcd(n,m); int lm=m/G; long long ret = 1000000000000000000LL; for(int i=0;i<G;++i) { int w=i; for(int j=0;j<lm;++j) { B[w]=j; P[j]=P[j+lm]=(S[w]=='P' ? 1: -1); w+=n; w%=m; } PS[0]=P[0]; for(int j=1;j<lm+lm;++j) PS[j]=PS[j-1]+P[j]; V.clear(); for(int j=i;j<n;j+=G) { V.push_back(make_pair(B[j%m],make_pair(A[j],j))); } sort(V.begin(), V.end()); SS.clear(); ISS.clear(); VS.clear(); IVS.clear(); for(int j=0;j<lm;++j) { pair<int,int> pii = make_pair(PS[j],j); VS.push_back(pii); SS.insert(pii); pair<int,int> ipii = make_pair(-PS[j],j); ISS.insert(ipii); IVS.push_back(ipii); } int ab=0; int cr=0; int r=PS[lm-1]; for(int j=0;j<V.size();++j) { int f1=V[j].first; int f2=V[j].second.first; int f3=V[j].second.second; while(f1>ab) { SS.erase(VS[ab]); ISS.erase(IVS[ab]); if (P[ab]==1) --cr; else ++cr; pair<int,int> pii = make_pair(PS[ab+lm-1]+P[ab+lm],ab+lm); pair<int,int> ipii = make_pair(-(PS[ab+lm-1]+P[ab+lm]),ab+lm); ab++; VS.push_back(pii); SS.insert(pii); IVS.push_back(ipii); ISS.insert(ipii); } set<pair<int,int> >::iterator it=SS.upper_bound(make_pair(f2-cr,-1)); if (it!=SS.end()) { int ind=(*it).second; long long ta=ind-ab; ret=min(ret,f3+ta*n); } else { if (r<=0) continue; set<pair<int,int> >::iterator it2 = ISS.lower_bound(make_pair(-1000000000,0)); int mxx=(-(*it2).first)+cr; long long cyc=(f2-mxx)/r; f2 -= cyc*r; if (f2>mxx) { f2-=r; ++cyc; } it=SS.upper_bound(make_pair(f2-cr, -1)); int ind=(*it).second; long long ta = ind-ab; ret=min(ret, f3+(n)*(lm*cyc+ta)); } } } if (ret==1000000000000000000LL) printf("-1\n"); else printf("%lld\n",ret+1); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | #include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <map> #include <queue> #include <set> using namespace std; const int N = 1000010; int A[N]; int B[N]; char S[N]; int P[N+N]; int PS[N+N]; vector<pair<int,pair<int,int> > > V; vector<pair<int,int> > VS; vector<pair<int,int> > IVS; set<pair<int, int> > SS; set<pair<int, int> > ISS; int gcd(int a, int b) { return b == 0 ? a : gcd(b,a%b); } int main() { int n; scanf("%d",&n); for(int i=0;i<n;++i) scanf("%d",&A[i]); int m; scanf("%d",&m); scanf("%s",S); int G=gcd(n,m); int lm=m/G; long long ret = 1000000000000000000LL; for(int i=0;i<G;++i) { int w=i; for(int j=0;j<lm;++j) { B[w]=j; P[j]=P[j+lm]=(S[w]=='P' ? 1: -1); w+=n; w%=m; } PS[0]=P[0]; for(int j=1;j<lm+lm;++j) PS[j]=PS[j-1]+P[j]; V.clear(); for(int j=i;j<n;j+=G) { V.push_back(make_pair(B[j%m],make_pair(A[j],j))); } sort(V.begin(), V.end()); SS.clear(); ISS.clear(); VS.clear(); IVS.clear(); for(int j=0;j<lm;++j) { pair<int,int> pii = make_pair(PS[j],j); VS.push_back(pii); SS.insert(pii); pair<int,int> ipii = make_pair(-PS[j],j); ISS.insert(ipii); IVS.push_back(ipii); } int ab=0; int cr=0; int r=PS[lm-1]; for(int j=0;j<V.size();++j) { int f1=V[j].first; int f2=V[j].second.first; int f3=V[j].second.second; while(f1>ab) { SS.erase(VS[ab]); ISS.erase(IVS[ab]); if (P[ab]==1) --cr; else ++cr; pair<int,int> pii = make_pair(PS[ab+lm-1]+P[ab+lm],ab+lm); pair<int,int> ipii = make_pair(-(PS[ab+lm-1]+P[ab+lm]),ab+lm); ab++; VS.push_back(pii); SS.insert(pii); IVS.push_back(ipii); ISS.insert(ipii); } set<pair<int,int> >::iterator it=SS.upper_bound(make_pair(f2-cr,-1)); if (it!=SS.end()) { int ind=(*it).second; long long ta=ind-ab; ret=min(ret,f3+ta*n); } else { if (r<=0) continue; set<pair<int,int> >::iterator it2 = ISS.lower_bound(make_pair(-1000000000,0)); int mxx=(-(*it2).first)+cr; long long cyc=(f2-mxx)/r; f2 -= cyc*r; if (f2>mxx) { f2-=r; ++cyc; } it=SS.upper_bound(make_pair(f2-cr, -1)); int ind=(*it).second; long long ta = ind-ab; ret=min(ret, f3+(n)*(lm*cyc+ta)); } } } if (ret==1000000000000000000LL) printf("-1\n"); else printf("%lld\n",ret+1); return 0; } |