#include <iostream>
#include <vector>
#include <climits>
using namespace std;
typedef long long int LL;
LL NWD(LL a, LL b)
{
while(a!=b)
if(a>b)
a-=b;
else
b-=a;
return a;
}
main()
{
LL n,m, nwd, len, el;
cin >> n;
vector<LL> money(n);
for (LL i=0; i<n; i++)
cin >> money[i];
cin >> m;
nwd = NWD(n,m); // ilosc cykli
len = m/nwd; // dlugosc cyklu
el = n/nwd; // elementow w grupie;
vector< vector <LL> > cyclek;
vector< vector <LL> > cycle;
vector< vector <LL> > cycleMin;
for (LL i=0; i<nwd; i++)
{
cycle.push_back( vector<LL>(len,0) );
cyclek.push_back( vector<LL>(len,0) );
cycleMin.push_back( vector<LL>(len,0) );
}
vector<LL> inCycle(n,0);
vector<LL> startPos(n,0);
char v;
for (LL i=0, j; i<len; i++)
{
for (j=0; j<nwd; j++)
{
cin >> v;
if (v=='P') cyclek[j][i]=-1;
else cyclek[j][i]=1;
}
}
for (LL i=0, j, ind=0; i<len; ind=(ind + n)%len, i++)
for (j=0; j<nwd; j++)
cycle[j][i]=cyclek[j][ind];
for (LL i=0; i<n; i++)
{
inCycle[i]=i%nwd;
startPos[i]=i%len;
}
vector<LL> cyclesum(nwd,0);
for (LL j=0, i; j<nwd; j++)
{
cyclesum[j]=0;
cycleMin[j][0]=0;
for (i=0; i<len; i++)
{
cyclesum[j]+=cycle[j][i];
if (cycleMin[j][0] > cyclesum[j])
cycleMin[j][0] = cyclesum[j];
}
}
for (LL j=0, i; j<nwd; j++)
for (i=1; i<len; i++)
cycleMin[j][i]=cycleMin[j][i-1]-cycle[j][i-1];
vector<LL> l(n,LLONG_MAX);
for (LL i=0; i<n; i++)
{
if ((cyclesum[inCycle[i]] >= 0) && (-cycleMin[inCycle[i]][startPos[i]] < money[i])) continue;
if ((cyclesum[inCycle[i]] < 0) && (-cycleMin[inCycle[i]][startPos[i]] < money[i]))
{
l[i] = (money[i]+cycleMin[inCycle[i]][startPos[i]])/(-cyclesum[inCycle[i]]);
}
else
l[i] = 0;
}
LL minc=LLONG_MAX, minpos=LLONG_MAX;
for (LL i=0; i<n; i++)
if (l[i]<minc) minc=l[i];
if (minc==LLONG_MAX)
{
cout << "-1" << endl;
return 0;
}
LL result=minc*len;
for (LL i=0; i<n; i++)
money[i]+=minc*cyclesum[inCycle[i]];
LL i=0;
do
{
money[i%n]+=cyclek[inCycle[i%n]][i%len];
result++;
if (!money[i%n])
{
cout << result << endl;
return 0;
}
i=(i+1)%(n*m);
}
while (true);
}
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 125 126 | #include <iostream> #include <vector> #include <climits> using namespace std; typedef long long int LL; LL NWD(LL a, LL b) { while(a!=b) if(a>b) a-=b; else b-=a; return a; } main() { LL n,m, nwd, len, el; cin >> n; vector<LL> money(n); for (LL i=0; i<n; i++) cin >> money[i]; cin >> m; nwd = NWD(n,m); // ilosc cykli len = m/nwd; // dlugosc cyklu el = n/nwd; // elementow w grupie; vector< vector <LL> > cyclek; vector< vector <LL> > cycle; vector< vector <LL> > cycleMin; for (LL i=0; i<nwd; i++) { cycle.push_back( vector<LL>(len,0) ); cyclek.push_back( vector<LL>(len,0) ); cycleMin.push_back( vector<LL>(len,0) ); } vector<LL> inCycle(n,0); vector<LL> startPos(n,0); char v; for (LL i=0, j; i<len; i++) { for (j=0; j<nwd; j++) { cin >> v; if (v=='P') cyclek[j][i]=-1; else cyclek[j][i]=1; } } for (LL i=0, j, ind=0; i<len; ind=(ind + n)%len, i++) for (j=0; j<nwd; j++) cycle[j][i]=cyclek[j][ind]; for (LL i=0; i<n; i++) { inCycle[i]=i%nwd; startPos[i]=i%len; } vector<LL> cyclesum(nwd,0); for (LL j=0, i; j<nwd; j++) { cyclesum[j]=0; cycleMin[j][0]=0; for (i=0; i<len; i++) { cyclesum[j]+=cycle[j][i]; if (cycleMin[j][0] > cyclesum[j]) cycleMin[j][0] = cyclesum[j]; } } for (LL j=0, i; j<nwd; j++) for (i=1; i<len; i++) cycleMin[j][i]=cycleMin[j][i-1]-cycle[j][i-1]; vector<LL> l(n,LLONG_MAX); for (LL i=0; i<n; i++) { if ((cyclesum[inCycle[i]] >= 0) && (-cycleMin[inCycle[i]][startPos[i]] < money[i])) continue; if ((cyclesum[inCycle[i]] < 0) && (-cycleMin[inCycle[i]][startPos[i]] < money[i])) { l[i] = (money[i]+cycleMin[inCycle[i]][startPos[i]])/(-cyclesum[inCycle[i]]); } else l[i] = 0; } LL minc=LLONG_MAX, minpos=LLONG_MAX; for (LL i=0; i<n; i++) if (l[i]<minc) minc=l[i]; if (minc==LLONG_MAX) { cout << "-1" << endl; return 0; } LL result=minc*len; for (LL i=0; i<n; i++) money[i]+=minc*cyclesum[inCycle[i]]; LL i=0; do { money[i%n]+=cyclek[inCycle[i%n]][i%len]; result++; if (!money[i%n]) { cout << result << endl; return 0; } i=(i+1)%(n*m); } while (true); } |
English