C11LOCK - Ổ khóa đặc biệt
Tác giả: skyvn97
Ngôn ngữ: C++
#include<stdio.h>
#include<algorithm>
#define MAX 512
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
struct st
{
ll v;
ll r;
};
ll n,k;
ll a[10][MAX];
ll t[MAX*MAX];
ll s[MAX*MAX];
st b[MAX*MAX];
st c[MAX*MAX];
ll i,j,p,q,x;
ull cnt;
ll bsearch(ll left,ll right,ll val)
{
if (left>right) return 0;
if (left==right)
{
if (b[left].v==val) return (b[left].r);
else return 0;
}
ll mid=(left+right)/2;
if (b[mid].v==val) return (b[mid].r);
if (b[mid].v>val) return (bsearch(left,mid-1,val));
if (b[mid].v<val) return (bsearch(mid+1,right,val));
}
int main(void)
{
scanf("%lld",&n);
scanf("%lld",&k);
for (i=1;i<=5;i=i+1)
for (j=1;j<=n;j=j+1)
scanf("%lld",&a[i][j]);
for (i=1;i<=n;i=i+1)
for (j=1;j<=n;j=j+1)
{
s[i*n-n+j]=a[1][i]+a[2][j];
t[i*n-n+j]=a[3][i]+a[4][j];
}
sort(&t[1],&t[n*n+1]);
sort(&s[1],&s[n*n+1]);
p=0;
b[0].v=(-3)*10e9;
for (i=1;i<=n*n;i=i+1)
{
if (b[p].v!=s[i])
{
p=p+1;
b[p].v=s[i];
b[p].r=1;
}
else b[p].r++;
}
q=0;
c[0].v=(-3)*10e9;
for (i=1;i<=n*n;i=i+1)
{
if (c[q].v!=t[i])
{
q=q+1;
c[q].v=t[i];
c[q].r=1;
}
else c[q].r++;
}
cnt=0;
for (x=1;x<=n;x=x+1)
{
i=1;
j=q;
while ((i<=p) && (j>=1))
{
if (b[i].v+c[j].v+a[5][x]==k)
{
cnt+=b[i].r*c[j].r;
i=i+1;
j=j-1;
continue;
}
if (b[i].v+c[j].v+a[5][x]>k)
{
j=j-1;
continue;
}
i=i+1;
}
}
printf("%llu",cnt);
}