Submission #1308580

#TimeUsernameProblemLanguageResultExecution timeMemory
1308580arashmemarLamps (JOI19_lamps)C++20
100 / 100
94 ms25856 KiB
#include <bits/stdc++.h>
using namespace std;

const int minn = 1e6 + 100;

struct ans
{
	int a, b;
	ans (int a = 0, int b = 0) : a(a), b (b) {};

	bool operator < (ans other)
	{
		if (a < other.a)
		{
			return 1;
		}
		if (a > other.a)
		{
			return 0;
		}
		return b >= other.b;
	}

	ans inc()
	{
		ans ret = *this;
		ret.a++;
		return ret;
	}

	ans dec()
	{
		ans ret = *this;
		ret.a--;
		return ret;
	}
};

ans min(ans a, ans b)
{
	if (a < b)
	{
		return a;
	}
	return b;
}

ans dp[minn], pd[minn], pdd[minn];

bool a[minn], b[minn];

void inp(bool &x)
{
	char y;
	cin >> y;
	x = (y == '1');
	return ;
}

int main()
{
	ans minf(0, -1);
	int n;
	cin >> n;
	for (int i = 1;i <= n;i++)
	{
		inp(a[i]);
	}
	for (int i = 1;i <= n;i++)
	{
		inp(b[i]);
	}

	pd[0] = pdd[0] = {1, 0};

	for (int i = 1;i <= n;i++)
	{
		dp[i] = min(dp[i - 1], min(pd[i - 1], pdd[i - 1]));
		if ((dp[i].b & 1) ^ (a[i] ^ b[i]))
		{
			dp[i].b--;
		}
		if (dp[i].b == -1)
		{
			dp[i].b = 1;
			dp[i].a++;
		}

		pd[i] = min(pd[i - 1], min(dp[i - 1].inc(), pdd[i - 1].inc()));
		if ((pd[i].b & 1) ^ b[i])
		{
			pd[i].b--;
		}
		if (pd[i].b == -1)
		{
			pd[i].b = 1;
			pd[i].a++;
		}

		pdd[i] = min(pdd[i - 1], min(dp[i - 1].inc(), pd[i - 1].inc()));
		if ((pdd[i].b & 1) ^ 1 ^ b[i])
		{
			pdd[i].b--;
		}
		if (pdd[i].b == -1)
		{
			pdd[i].b = 1;
			pdd[i].a++;
		}
	}
	cout << min(dp[n].a, min(pd[n].a, pdd[n].a));
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...