Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Em. Cerchez 100 puncte
- #include <fstream>
- #define NRMAX 50002
- using namespace std;
- ifstream fin("strips.in");
- ofstream fout("strips.out");
- struct zona {int inc, sf;};
- zona Z[2][NRMAX]; //0 Ana 1 Bogdan
- int nrz[2];
- int N, L, Nr, poz, C;
- int p[2], lgmax[2];
- int cautbinar(int poz);
- bool valid(int poz, int unde, int culoare);
- void plaseaza (int poz, int cine);
- int main()
- {int i, poz, j;
- fin>>C>>N>>Nr>>L;
- for (i=1; i<=Nr; i++)
- {
- fin>>poz;
- plaseaza(poz, 0);
- fin>>poz;
- plaseaza(poz, 1);
- }
- if (C==1) fout<<p[0]<<' '<<p[1]<<'\n';
- else
- {for (j=0; j<2; j++)
- for (i=1; i<=nrz[j]; i++)
- if (lgmax[j]<Z[j][i].sf-Z[j][i].inc+1)
- lgmax[j]=Z[j][i].sf-Z[j][i].inc+1;
- fout<<lgmax[0]<<' '<<lgmax[1]<<'\n';
- }
- fout.close();
- return 0;
- }
- int cautbinar(int poz, int unde)
- ///invariant Z[unde][st].inc<poz<=Z[unde][dr].inc
- {int st=0, dr=nrz[unde]+1, mij;
- while (dr-st>1)
- {
- mij=(st+dr)/2;
- if (Z[unde][mij].inc>=poz) dr=mij;
- else st=mij;
- }
- return dr;
- }
- void plaseaza (int poz, int cine)
- {int unde, adv, alipit,j;
- if (poz+L-1>=N) {p[cine]++; return;}
- adv=1-cine;
- unde=cautbinar(poz,adv);
- if (unde<=nrz[adv] && poz+L-1>=Z[adv][unde].inc-1) {p[cine]++; return;}
- if (unde>1 && poz<=Z[adv][unde-1].sf+1) {p[cine]++; return;}
- ///mutare valida
- unde=cautbinar(poz,cine);
- //alipire
- alipit=0;
- if (unde-1>0)
- if (poz<=Z[cine][unde-1].sf+1)
- {Z[cine][unde-1].sf=max(poz+L-1,Z[cine][unde-1].sf); alipit=1;}
- if (unde<=nrz[cine])
- if (poz+L-1>=Z[cine][unde].inc-1)
- {Z[cine][unde].inc=min(poz,Z[cine][unde].inc); alipit=1;}
- //eliminare
- if (unde<=nrz[cine] && unde>1 && Z[cine][unde].inc<=Z[cine][unde-1].sf+1)
- {
- Z[cine][unde-1].sf=Z[cine][unde].sf;
- for (j=unde; j<nrz[cine]; j++) Z[cine][j]=Z[cine][j+1];
- nrz[cine]--;
- }
- if (!alipit) //inserare
- {
- for (j=nrz[cine]; j>=unde; j--) Z[cine][j+1]=Z[cine][j];
- nrz[cine]++;
- Z[cine][unde].inc=poz; Z[cine][unde].sf=poz+L-1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement