C11LOCK - Ổ khóa đặc biệt

Tác giả: flashmt

Ngôn ngữ: C++

#include <iostream>
#include <algorithm>
using namespace std;

int n,a[5][555],b[255255],cntB[255255],B,c[255255],cntC[255255],C,S;
long long ans;

int modify(int b[],int cntB[],int B)
{
	int res=1;
	sort(b,b+B);
	cntB[0]=1;
	for (int i=1;i<B;i++)
	{
		if (b[i]!=b[res-1]) b[res++]=b[i];
		cntB[res-1]++;
	}
	return res;
}

int main()
{
	cin >> n >> S;
	for (int i=0;i<5;i++)
		for (int j=0;j<n;j++)
			cin >> a[i][j];
	
	for (int i=0;i<n;i++)
		for (int j=0;j<n;j++)	
		{
			b[B++]=a[0][i]+a[1][j];
			c[C++]=a[2][i]+a[3][j];
		}
		
	B=modify(b,cntB,B);
	C=modify(c,cntC,C);
		
	for (int i=0;i<n;i++)
	{
		int target=S-a[4][i];
		for (int j=0,k=C-1;j<B && k>=0;)
		{
			long long x=b[j]+c[k];
			if (x==target) ans+=1LL*cntB[j++]*cntC[k--];
			else
				if (x>target) k--;
				else j++;
		}
	}
				
	cout << ans << endl;
}

Download