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);
}

Download