Pentru această operație este nevoie să te autentifici.

Cod sursă (job #810141)

Utilizator avatar deniscorman Corman Denis deniscorman 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];
}