Submission #1232706

#TimeUsernameProblemLanguageResultExecution timeMemory
1232706MuhammadSaramMosaic (IOI24_mosaic)C++20
100 / 100
643 ms48508 KiB
#include "mosaic.h"
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define all(v) v.begin(), v.end()

vector<long long> mosaic(vector<int> a, vector<int> b,vector<int> r,
							vector<int> r1,vector<int> c, vector<int> c1)
{
	int n=a.size();
	vector<int> rw[3],cl[3];
	vector<ll> v;
	set<pair<int,int>> se;
	for (int i=0;i<n;i++)
		for (int j=0;j<n;j++)
		{
			if (i>3 && j>3) break;
			if (!i)
			{
				if (a[j]) se.insert({i,j}),rw[0].push_back(j);
			}
			else if (!j)
			{
				if (b[i])
				{
					se.insert({i,j}),cl[0].push_back(i);
					if (i<3) rw[i].push_back(j);
				}
			}
			else
			{
				if (!se.count({i-1,j}) && !se.count({i,j-1}))
				{
					se.insert({i,j});
					if (min(i,j)==3)
						v.push_back(i-j);
					else
					{
						if (i<3) rw[i].push_back(j);
						else if (j<3) cl[j].push_back(i);
					}
				}
			}
		}
	for (int i=0;i<3;i++)
		sort(all(rw[i])),sort(all(cl[i]));
	sort(all(v));
	int m=v.size();
	ll pre[m]={};
	for (int i=1;i<=m;i++)
		pre[i]=pre[i-1]+v[i-1];
	vector<ll> ans(r.size());
	for (int i=0;i<(int)r.size();i++)
	{
		for (int j=0;j<3;j++)
		{
			if (j>=r[i] && j<=r1[i])
				ans[i]+=upper_bound(all(rw[j]),c1[i])-lower_bound(all(rw[j]),c[i]);
			if (j>=c[i] && j<=c1[i] && r1[i]>2)
				ans[i]+=upper_bound(all(cl[j]),r1[i])-lower_bound(all(cl[j]),max(3,r[i]));
		}
		r[i]=max(r[i],3);
		c[i]=max(c[i],3);
		if (r[i]>r1[i] or c[i]>c1[i]) continue;
		if (lower_bound(all(v),r[i]-c[i])!=upper_bound(all(v),r1[i]-c[i]))
		{
			int x=lower_bound(all(v),r[i]-c[i])-begin(v);
			int y=upper_bound(all(v),r1[i]-c[i])-begin(v)-1;
			int s=x-1,e=y+1;
			while (s+1<e)
			{
				int mid=(s+e)/2;
				if (r1[i]-(v[mid]+c[i])>=c1[i]-c[i])
					s=mid;
				else
					e=mid;
			}
			ans[i]+=1ll*(c1[i]-c[i]+1)*(s-x+1);
			ll su=pre[y+1]-pre[s+1]+1ll*c[i]*(y-s);
			ans[i]+=1ll*(r1[i]+1)*(y-s)-su;
		}
		if (c[i]==c1[i]) continue;
		c[i]++;
		if (lower_bound(all(v),r[i]-c1[i])!=upper_bound(all(v),r[i]-c[i]))
		{
			int x=lower_bound(all(v),r[i]-c1[i])-begin(v);
			int y=upper_bound(all(v),r[i]-c[i])-begin(v)-1;
			int s=x-1,e=y+1;
			while (s+1<e)
			{
				int mid=(s+e)/2;
				if (c1[i]-(r[i]-v[mid])>=r1[i]-r[i])
					e=mid;
				else
					s=mid;
			}
			ans[i]+=1ll*(r1[i]-r[i]+1)*(y-e+1);
			ll su=1ll*r[i]*(e-x)-(pre[e]-pre[x]);
			ans[i]+=1ll*(c1[i]+1)*(e-x)-su;
		}
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...