[openjudge2987]小兔子捡金币

来源:互联网 发布:固结实验数据 编辑:程序博客网 时间:2024/04/26 23:49

题目←

头一次打那么长的代码re了一遍就过了!(哭)

唔……略微的眼熟,跟清北学堂那天的模拟有点像?
总之找规律吧……找找找找……
等等为什么代码这么长?
是不是处理了很多没用的东西?算了不管了……

#include<iostream>#include<cstdio>#include<algorithm>#define LL long longusing namespace std;const LL MAXN = 100000 + 50;struct zt{    LL l,r;}lim[MAXN];struct zt2{    LL u,d;}h[MAXN];LL n,L[MAXN],R[MAXN];LL U[MAXN],D[MAXN];LL find(LL x,LL y){    if(x <= n/2)    {        if(y >= lim[x].l && y <= lim[x].r)        {            return L[x] + (y - lim[x].l);        }        else if(y < lim[x].l)        {            return U[y] - (x - h[y].u);        }        else if(y > lim[x].r)        {            return U[y] + (x - h[y].u);        }    }    else    {        if(y >= lim[x].l && y <= lim[x].r)        {            return L[x] - (y - lim[x].l);        }        else if(y < lim[x].l)        {            return U[y] + (h[y].u - x);        }        else if(y > lim[x].r)        {            return U[y] - (h[y].u - x);        }    }}LL k;int main(){    scanf("%lld%lld",&k,&n);    LL tmp = 0;    for(LL i = 1;i <= n/2;i ++)    {        lim[i].l = 1 + tmp;        lim[i].r = n - tmp;        tmp ++;    }    if(n % 2)    {        lim[n/2 + 1].l = n/2 + 1;        lim[n/2 + 1].r = n/2 + 1;    }    tmp = 0;    for(LL i = n;i > n - n/2;i --)    {        lim[i].l = 1 + tmp;        lim[i].r = n - tmp;        tmp ++;    }    tmp = n - 1;    LL pre1 = 1,pre2 = n;    L[1] = pre1;R[1] = pre2;    LL temp = 1;    U[1] = L[1] + 3 * (n - temp) + n - temp - 1;    U[n] = R[1];    temp += 2;    for(LL i = 2;i <= n/2;i ++)    {        L[i] = pre1 + 4 * tmp;        R[i] = pre2 + 4 * tmp - 2;        U[i] = L[i] + 3 * (n - temp) + n - temp - 1;        U[n - i + 1] = R[i];        pre1 = L[i];        pre2 = R[i];        tmp -= 2;        temp += 2;    }    if(n%2)    {        L[n/2 + 1] = n*n;        R[n/2 + 1] = n*n;        U[n/2 + 1] = n*n;        D[n/2 + 1] = n*n;    }    pre1 = 1 + 3 * (n - 1);pre2 = 1 + 2 * (n - 1);    LL tmp1 = 2;    LL tmp2 = 3;    L[n] = pre1;R[n] = pre2;    D[n] = L[n];    for(LL i = n - 1;i > n - n/2;i --)    {        L[i] = pre1 + (n - tmp1) * 2 + (n - tmp2) * 2;        R[i] = L[i] - (n - (n - i) * 2) + 1;        D[n - i + 1] = L[i];        D[i] = R[i];        pre1 = L[i];        pre2 = R[i];        tmp1 += 2;        tmp2 += 2;    }    tmp = 0;    for(LL i = 1;i <= n/2;i ++)    {        h[i].u = 1 + tmp + 1;        h[i].d = n - tmp;        tmp ++;    }    if(n % 2)    {        h[n/2 + 1].u = n/2 + 1;        h[n/2 + 1].d = n/2 + 1;    }    tmp = 0;    for(LL i = n;i > n - n/2;i --)    {        h[i].u = 1 + tmp;        h[i].d = n - tmp;        tmp ++;    }    LL a,b;    for(LL i = 1;i <= k;i ++)    {        scanf("%lld%lld",&a,&b);        printf("%lld\n",find(a,b));    }    return 0;}
原创粉丝点击