Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- int x[]={0,1,0,-1};
- int y[]={1,0,-1,0};
- vector<int>ruchy;
- vector<long long>pozycje;
- long long dlugosc=-1;
- long long X,Y,cX,cY,nX,nY;
- long long xs,ys,n;
- long long wyst,t,wynik,teraz=-1;
- long long rodz=-1;
- bool ujem=true;
- int binsearch(long long szuk){
- // cout<<"szukam "<<t<<" wsrod \n";
- // for(auto it: pozycje) cout<<it<<" ";
- int p=0, k=pozycje.size()-1;
- int sr=(p+k)/2;
- while(k-p>1){
- sr=(p+k)/2;
- if(pozycje[sr]>szuk) k=sr;
- else p=sr;
- }
- // cout<<"\n znalazlem "<<p<<"\n";
- return p;
- }
- void sprawdz(int rodz){
- //cout<<"bombi "<<rodz<<endl;
- // cout<<X<<" "<<nX<<" "<<Y<<" "<<nY<<endl;
- if(rodz==0 && nX == xs && ys > Y && ys <= nY){
- //cout<<"bong 1 \n";
- wyst++;
- pozycje.push_back(dlugosc+abs(Y-ys));
- }
- else if(rodz==1 && nY == ys && xs > X && xs <= nX){
- //cout<<"bong 2 \n";
- wyst++;
- pozycje.push_back(dlugosc+abs(X-xs));
- }
- else if(rodz==2 && nX == xs && ys < Y && ys >= nY){
- //cout<<"bong 3 \n";
- wyst++;
- long long pom=abs(Y-ys);
- pozycje.push_back(dlugosc+pom);
- }
- else if(rodz==3 && nY == ys && xs < X && xs >= nX){
- //cout<<"bong 4 \n";
- wyst++;
- pozycje.push_back(dlugosc+abs(X-xs));
- }
- }
- void sprawdzdla41(int rodz,int i){
- nY=Y+y[rodz]*ruchy[i];
- nX=X+x[rodz]*ruchy[i];
- if(rodz == 0 || rodz == 2){
- double m=((double)xs-(double)X)/(double)cX;
- if(m==(long long)m){
- //cout<<"wszedlem w m1 "<<m<<endl;
- if(rodz==0){
- //cout<<"wszedlem w 1 \n";
- if(Y + m*cY < ys && ys <= nY + m*cY ){
- // cout<<"chce dodac do wyniku \n";
- // cout<<"teraz "<<teraz<<endl;
- if(m==0 && t>=teraz+abs(Y-ys)) wynik++;
- else if(m>0 && t>= teraz + abs(Y+m*cY-ys) + m * (dlugosc+1)) wynik++;
- }
- }
- if(rodz==2){
- // cout<<"wszedlem w 3 \n";
- if(Y + m*cY > ys && ys >= nY + m*cY ){
- // cout<<"chce dodac do wyniku \n";
- // cout<<"teraz "<<teraz<<endl;
- if(m==0 && t>=teraz+abs(Y-ys)) wynik++;
- else if(m>0 && t>= teraz + abs(Y+m*cY-ys) + m * (dlugosc+1)) wynik++;
- }
- }
- }
- }
- else if(rodz == 1 || rodz == 3){
- double m=((double)ys-(double)Y)/(double)cY;
- if(m==(long long)m){
- //cout<<"wszedlem w m2 "<<m<<endl;
- if(rodz==1){
- //cout<<"wszedlem w 2\n";
- //cout<<X<<" "<<nX<<endl;
- if(X + m*cX < xs && xs <= nX + m*cX ){
- // cout<<"chce dodac do wyniku \n";
- // cout<<"teraz "<<teraz<<endl;
- if(m==0 && t>=teraz+abs(X-xs)) wynik++;
- else if(m>0 && t>= teraz + abs(X+m*cX-xs) + m * (dlugosc+1)) wynik++;
- }
- }
- if(rodz==3){
- // cout<<"wszedlem w 4\n";
- if(X + m*cX > xs && xs >= nX + m*cX ){
- // cout<<"chce dodac do wyniku \n";
- // cout<<"teraz "<<teraz<<endl;
- if(m==0 && t>=teraz+abs(X-xs)) wynik++;
- else if(m>0 && t>= teraz + abs((X+m*cX)-xs) + m * (dlugosc+1)) wynik++;
- }
- }
- }
- }
- //cout<<wynik<<endl;
- }
- void sprawdzdla42(int rodz,int i){
- int starrodz=rodz;
- if(ujem==false){
- if(rodz==2) {
- rodz=0;
- }
- else if(rodz==0){
- rodz=2;
- }
- }
- nY=Y+y[rodz]*ruchy[i];
- nX=X+x[rodz]*ruchy[i];
- if(rodz==0 && xs == X){
- double mmin=ceil(((double)ys-(double)nY)/(double)cY);
- // cout<<"mmin "<<mmin<<endl;
- if(mmin<0) mmin=0;
- if(t>=abs(Y-ys)+teraz){
- long long mmax;
- double mmaxi=((double)t+Y-teraz-ys)/(dlugosc+1ll-cY);
- if(abs((double)t - (mmaxi * ((double)dlugosc+1.0) + teraz +abs((double)Y + mmaxi * (double)cY -ys))) > 0.000001)
- mmaxi=((double)t-Y-teraz+ys)/(dlugosc+1ll+cY);
- mmaxi=floor(mmaxi);
- mmax=mmaxi;
- long long pom;
- if(floor(((double)ys-(double)Y)/(double)cY) == ((double)ys-(double)Y)/(double)cY)
- pom=(((double)ys-(double)Y)/(double)cY)-1;
- else pom=floor(((double)ys-(double)Y)/(double)cY);
- // cout<<" maksy "<<mmax<<" "<<pom<<"\n";
- mmax=min(mmax,pom);
- if(mmax>=mmin) wynik+=(mmax-mmin+1);
- }
- }
- else if(rodz==2 && xs == X){
- double mmin=ceil(((double)ys-(double)Y)/(double)cY);
- if(mmin == ((double)ys-(double)Y)/(double)cY ) mmin++;
- //cout<<"mmin "<<mmin<<endl;
- if(mmin<0) mmin=0;
- if(t>=abs(Y-ys)+teraz){
- long long mmax;
- double mmaxi=((double)t+Y-teraz-ys)/(dlugosc+1ll-cY);
- if(abs((double)t - (mmaxi * ((double)dlugosc+1.0) + teraz +abs((double)Y + mmaxi * (double)cY -ys))) > 0.000001)
- mmaxi=((double)t-Y-teraz+ys)/(dlugosc+1ll+cY);
- mmaxi=floor(mmaxi);
- mmax=mmaxi;
- long long pom=floor(((double)ys-(double)nY)/(double)cY);
- //cout<<" maksy "<<mmax<<" "<<pom<<"\n";
- mmax=min(mmax,pom);
- if(mmax>=mmin) wynik+=(mmax-mmin+1);
- }
- }
- else if(rodz == 1 && xs > X && xs <= nX ){
- double m=(((double)ys-(double)Y)/(double)cY);
- if(m==(long long)m && m >= 0){
- //cout<<"pokazuje "<<teraz<<" "<<abs(X-xs)<<" "<<m*(dlugosc+1ll)<<"\n";
- long long czas=teraz+abs(X+m*cX-xs)+m*(dlugosc+1ll);
- if(t>=czas) wynik++;
- }
- }
- else if(rodz == 3 && xs < X && xs >= nX ){
- // cout<<"bada bing\n";
- double m=(((double)ys-(double)Y)/(double)cY);
- // cout<<m<<endl;
- if(m==(long long)m && m >= 0){
- // cout<<"twoja stara\n";
- // cout<<abs(X+m*cX-xs)<<endl;
- long long czas=teraz+abs(X+m*cX-xs)+m*(dlugosc+1ll);
- // cout<<"czas "<<czas<<endl;
- if(t>=czas) wynik++;
- }
- }
- rodz=starrodz;
- // cout<<wynik<<endl;
- }
- void sprawdzdla43(int rodz,int i){
- int starrodz=rodz;
- if(ujem==false){
- if(rodz==1) {
- starrodz=rodz;
- rodz=3;
- }
- else if(rodz==3){
- starrodz=rodz;
- rodz=1;
- }
- }
- nY=Y+y[rodz]*ruchy[i];
- nX=X+x[rodz]*ruchy[i];
- if(rodz==1 && ys == Y){
- double mmin=ceil(((double)xs-(double)nX)/(double)cX);
- if(mmin<0) mmin=0;
- if(t>=abs(X-xs)+teraz){
- long long mmax;
- double mmaxi=((double)t+X-teraz-xs)/(dlugosc+1ll-cX);
- // cout<<t<<" "<<" "<<X<<" "<<xs<<" "<<cX<<dlugosc+1ll<<"\n";
- // cout<<"PIERW MMAXI "<<mmaxi<<"\n";
- // cout<<mmaxi * (double)(dlugosc+1ll) + teraz +abs((double)X + mmaxi * (double)cX -xs)<<"\n";
- if(abs((double)t - (mmaxi * ((double)dlugosc+1.0) + teraz +abs((double)X + mmaxi * (double)cX -xs))) > 0.000001){
- // cout<<t - (mmaxi * ((double)dlugosc+1.0) + teraz +abs((double)X + mmaxi * (double)cX -xs))<<"\n";
- // cout<<t<<" "<<(mmaxi * ((double)dlugosc+1.0) + teraz +abs((double)X + mmaxi * (double)cX -xs))<<"\n";
- mmaxi=((double)t-X-teraz+xs)/(dlugosc+1ll+cX);
- }
- // cout<<mmaxi<<"\n";
- mmaxi=floor(mmaxi);
- // cout<<mmaxi<<"\n";
- mmax=mmaxi;
- long long pom;
- if(floor(((double)xs-(double)X)/(double)cX) == ((double)xs-(double)X)/(double)cX)
- pom=(((double)xs-(double)X)/(double)cX)-1;
- else pom=floor(((double)xs-(double)X)/(double)cX);
- mmax=min(mmax,pom);
- // cout<<"mmax mmin "<<mmax<<" "<<mmin<<"\n";
- if(mmax>=mmin) wynik+=(mmax-mmin+1);
- }
- }
- else if(rodz==3 && ys == Y){
- double mmin=ceil(((double)xs-(double)X)/(double)cX);
- if(mmin == ((double)xs-(double)X)/(double)cX ) mmin++;
- // cout<<"mmin "<<mmin<<endl;
- if(mmin<0) mmin=0;
- if(t>=abs(X-xs)+teraz){
- long long mmax;
- double mmaxi=((double)t+X-teraz-xs)/(dlugosc+1ll-cX);
- if(abs((double)t - (mmaxi * ((double)dlugosc+1.0) + teraz +abs((double)X + mmaxi * (double)cX -xs))) > 0.000001)
- mmaxi=((double)t-X-teraz+xs)/(dlugosc+1ll+cX);
- mmaxi=floor(mmaxi);
- mmax=mmaxi;
- // cout<<t<<" "<<abs(X-xs)<<" "<<teraz<<" "<<dlugosc+1-cX<<endl;
- long long pom=floor(((double)xs-(double)nX)/(double)cX);
- mmax=min(mmax,pom);
- // cout<<"mmin mmax "<<mmin<<" "<<mmax<<"\n";
- if(mmax>=mmin) wynik+=(mmax-mmin+1);
- }
- }
- else if(rodz == 0 && ys > Y && ys <= nY ){
- double m=(((double)xs-(double)X)/(double)cX);
- // cout<<xs<< " "<<X<< " "<<cX<<"\n";
- // cout<<"rodz 0 m "<<m<<"\n";
- if(m==(long long)m && m >= 0){
- long long czas=teraz+abs(Y+m*cY-ys)+m*(dlugosc+1ll);
- if(t>=czas) wynik++;
- }
- }
- else if(rodz == 2 && ys < Y && ys >= nY ){
- double m=(((double)xs-(double)X)/(double)cX);
- if(m==(long long)m && m >= 0){
- long long czas=teraz+abs(Y+m*cY-ys)+m*(dlugosc+1ll);
- if(t>=czas) wynik++;
- }
- }
- rodz=starrodz;
- // cout<<wynik<<endl;
- }
- void rozwiaz1(int Q){
- dlugosc=-1;
- while(Q--){
- //cout<<Q<<" ah \n";
- for(int i=0; i<ruchy.size(); i++){
- dlugosc++;
- rodz++;
- if(rodz==4) rodz=0;
- //cout<<"ruch "<<ruchy[i]<<"\n";
- nY=Y+y[rodz]*ruchy[i];
- nX=X+x[rodz]*ruchy[i];
- sprawdz(rodz);
- X=nX;
- Y=nY;
- dlugosc+=ruchy[i];
- //cout<<"dl "<<dlugosc<<" \n";
- //cout<<X<<" "<<Y<<"\n";
- }
- }
- // cout<<"pozyjcje\n";
- // for(auto it:pozycje) cout<<it<<" ";
- //cout<<dlugosc<<" "<<wyst<<"\n";
- pozycje.push_back(dlugosc+1);
- //cout<<"dlugosc "<<dlugosc<<"\n";
- if(wyst==0) cout<<0;
- else if(t<dlugosc) cout<<wynik+binsearch(t);
- else{
- t-=dlugosc;
- wynik+=wyst;
- wynik+=((t/(dlugosc+1ll))*wyst);
- t-=((t/(dlugosc+1ll))*(dlugosc+1ll));
- // cout<<wynik<<endl;
- // cout<<t<<endl;
- // for(auto it: pozycje){
- // cout<<it<<" ";
- // }
- // cout<<endl;
- // cout<<binsearch(t);
- cout<<wynik+binsearch(t-1);
- }
- }
- void czter(){
- for(int i=0; i<ruchy.size(); i++){
- dlugosc++;
- rodz++;
- if(rodz==4) rodz=0;
- nY=Y+y[rodz]*ruchy[i];
- nX=X+x[rodz]*ruchy[i];
- X=nX;
- Y=nY;
- dlugosc+=ruchy[i];
- }
- cX=X;
- cY=Y;
- if(X!=0 && Y!=0){
- X=0;
- Y=0;
- for(int i=0; i<ruchy.size(); i++){
- //cout<<"ruch "<<ruchy[i]<<"\n";
- teraz++;
- rodz++;
- if(rodz==4) rodz=0;
- //cout<<"nowe "<<nX<<" "<<nY<<"\n";
- sprawdzdla41(rodz,i);
- Y=nY;
- X=nX;
- // cout<<X<<" "<<Y<<endl;
- teraz+=ruchy[i];
- }
- cout<<wynik;
- }
- else if(Y!=0){
- Y=0;
- if(cY<0) {
- ujem=false;
- cY*=-1;
- ys*=-1;
- }
- for(int i=0; i<n; i++){
- teraz++;
- rodz++;
- if(rodz==4) rodz=0;
- nY=Y+y[rodz]*ruchy[i];
- nX=X+x[rodz]*ruchy[i];
- sprawdzdla42(rodz,i);
- X=nX;
- Y=nY;
- teraz+=ruchy[i];
- }
- cout<<wynik;
- }
- else if(X!=0){
- if(cX<0){
- ujem=false;
- cX*=-1;
- xs*=-1;
- }
- X=0;
- for(int i=0; i<n; i++){
- teraz++;
- rodz++;
- if(rodz==4) rodz=0;
- nY=Y+y[rodz]*ruchy[i];
- nX=X+x[rodz]*ruchy[i];
- sprawdzdla43(rodz,i);
- X=nX;
- Y=nY;
- teraz+=ruchy[i];
- }
- cout<<wynik;
- }
- else rozwiaz1(1);
- }
- int main(){
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- cin>>n>>t;
- pozycje.push_back(0);
- for(int i=0; i<n; i++){
- int a;
- cin>>a;
- ruchy.push_back(a);
- }
- cin>>xs>>ys;
- if(xs==0 && ys==0) wynik++;
- if(n%4==0) czter();
- else if(n%2==0) rozwiaz1(2);
- else rozwiaz1(4);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement