Pentru această operație este nevoie să te autentifici.
Cod sursă (job #810141)
Utilizator |
|
IP | ascuns |
---|---|---|---|
Problemă | Domino | Compilator | cpp-32 | 1,61 kb |
Rundă | lasm_20_02_2025_clasa11 | Status | evaluat |
Dată | 20 feb. 2025 18:17:06 | Scor | 96 |
#include<bits/stdc++.h>
#define x first
#define y second
#define pb push_back
using namespace std;
const int DN=1e4+5;
int n,k1,k2,z[DN],m,nr,ls,vf,val1,val2;
pair<int,int>a[DN];
int stk[5][DN],cnt,nrz;
//0 val
//1 nr de el
//2 nr de rot
//3 nr de la 1 pana la capat
int ver(int poz)
{
if(a[poz].x>=a[poz].y)
return 0;
if(nr<k1)
return 1;
if(nrz==0)
return 0;
int f=z[nrz];
int val=stk[0][f];
f=stk[3][f];
if(f+n-poz<m)
return 0;
if(a[poz].y<=val)
return 0;
return 1;
}
int main()
{
freopen("domino.in", "r", stdin);
freopen("domino.out", "w", stdout);
cin>>n>>k1>>k2;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
val1=a[i].x*10+a[i].y;
val2=a[i].y*10+a[i].x;
a[i].x=val1;
a[i].y=val2;
}
m=n-k2;
for(int i=1;i<=n;i++)
{
vf=ver(i);
if(vf)
{
nr++;
swap(a[i].x,a[i].y);
}
while(1)
{
if(cnt==0)
break;
if(stk[3][cnt]+n-i<m)
break;
if(a[i].x<=stk[0][cnt])
break;
stk[3][cnt]--;
stk[1][cnt]--;
if(stk[2][cnt])
{
stk[2][cnt]--;
nr--;
if(stk[2][cnt]==0)
nrz--;
}
if(stk[1][cnt]==0)
cnt--;
}
if(stk[3][cnt]==m)
{
if(stk[2][cnt]&&(a[i].x==stk[0][cnt]&&!vf))
{
stk[2][cnt]--;
nr--;
if(stk[2][cnt]==0)
nrz--;
}
continue;
}
if(a[i].x!=stk[0][cnt])
{
cnt++;
stk[3][cnt]=stk[3][cnt-1];
}
stk[0][cnt]=a[i].x;
stk[1][cnt]++;
stk[2][cnt]+=vf;
stk[3][cnt]++;
if(stk[2][cnt]==1)
{
nrz++;
z[nrz]=cnt;
}
}
for(int i=1;i<=cnt;i++)
while(stk[1][i]--)
cout<<stk[0][i];
}