contest 1004

Posted may-2nd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了contest 1004相关的知识,希望对你有一定的参考价值。

A:每家酒店两侧最多都可以建这个新酒店,将两酒店之间距离不合法的情况减去即可,数组都不用开。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,d,a,s,b;
    cin>>n>>d>>a;
    s=n<<1;
    while(--n)
    {
        b=a;
        cin>>a;
        s-=(a-b<=d<<1)+(a-b<d<<1);
    }
    cout<<s;
    return 0;
}

B:(01) 个数乘积最大?两数和相等,很明显两数越相近乘积越大,这里补一个证明:
设当前两数分别为 (x)(y)(xleq y)
(xy-(x-1)(y+1)=xy-xy-x+y-1=y-x+1>0)
得证。
于是乎间隔着放 01

#include<bits/stdc++.h>
using namespace std;
#define For(i,x,y)for(i=x;i<=y;i++)
int main()
{
    int n,i;
    cin>>n;
    For(i,1,n)putchar((i&1)+'0');
    return 0;
}

C:倒着扫,不考虑两数相同的数对,记录数字种数 (total) 和每种数字之前匹配到的数对个数 (number),第 (i) 个点作为第一个数字的贡献即为 (total-number)。最后记得加上两数相同的数对。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 100005
#define For(i,x,y)for(i=x;i<=y;i++)
#define Down(i,x,y)for(i=x;i>=y;i--)
int tot[N],a[N],c[N];
int main()
{
    ll s;
    int n,i,now,tmp;
    s=now=0;
    scanf("%d",&n);
    For(i,1,n)scanf("%d",&a[i]);
    Down(i,n,1)
    {
        c[a[i]]++;
        if(tot[a[i]])s+=now-tot[a[i]];
        else s+=now++;
        tot[a[i]]=now;
        /*printf("%I64d
",s);*/
    }
    For(i,1,n)
    if(c[i]>1)s++;
    printf("%I64d",s);
    return 0;
}

D:先看出这是曼哈顿距离。假设矩阵无穷大,那么环绕着的数字个数为 (4,8,12...),菱形边长每次加一。所以可以算出第一个越过边界的数字是什么。因为相对位置没有要求,所以这个数字可以看做是 (min(x,y))。暴力枚举 (n,m),因为 (n imes m=t) 所以这是 (sqrt t) 的。自然可以推出这么一个式子 (n+m-x-y) 等于序列中最大的数 (z)。现在我们知道了什么?若 (xleq y),则知道了(n,m,x,z),所以可以算出(y)。然后暴力算出整个矩阵的数进行对比。总复杂度 (mathcal O(tsqrt t))
需要注意的是,(n) 不一定小于等于 (m)(x) 不一定小于等于 (y),否则会 Wa On Test36。

#include<bits/stdc++.h>
using namespace std;
#define N 1000005
#define Max(x,y)(x>y?x:y)
#define For(i,x,y)for(i=x;i<=y;i++)
#define Memc(i,j)memcpy(i,j,sizeof i)
int a[N],b[N];
int read()
{
    int A;
    bool K;
    char C;
    C=A=K=0;
    while(C<'0'||C>'9')K|=C=='-',C=getchar();
    while(C>'/'&&C<':')A=(A<<3)+(A<<1)+(C^48),C=getchar();
    return(K?-A:A);
}
inline void sw_ap(int&_,int&__)
{
    _^=__^=_^=__;
}
int main()
{
    bool rem;
    int t,i,mx=0,n,m,x,y,mn,j;
    t=read();
    For(i,1,t)
    {
        x=read();
        a[x]++;
        mx=Max(mx,x);
    }
    if(a[0]!=1)cout<<-1,exit(0);
    For(i,1,t)
    if(a[i]>i<<2)cout<<-1,exit(0);
    else if(a[i]<i<<2)break;
    mn=i;
    /*cout<<mn<<endl;*/
    For(n,1,t)
    if(!(t%n))
    {
        m=t/n;
        x=mn;
        y=m+n-x-mx;
        /*cout<<n<<' '<<m<<' '<<x<<' '<<y<<endl;*/
        if(x<0||x>n||y>m)continue;
        Memc(b,a);
        rem=0;
        For(i,1,n)
        For(j,1,m)
        {
            a[abs(i-x)+abs(j-y)]--;
            if(a[abs(i-x)+abs(j-y)]<0)
            {
                rem=1;
                break;
            }
            if(rem)break;
        }
        if(!rem)cout<<n<<' '<<m<<endl<<x<<' '<<y,exit(0);
        Memc(a,b);
    }
    cout<<-1;
    return 0;
}

以上是关于contest 1004的主要内容,如果未能解决你的问题,请参考以下文章

hdu6365 2018 Multi-University Training Contest 6 1004 Shoot Game

2020 Multi-University Training Contest 1-1004 Distinct Sub-palindromes

Codeforces 1004F Sonya and Bitwise OR (线段树)

添加超链接时,VBA抛出错误1004

2018 Multi-University Training Contest 4

2019 Multi-University Training Contest 3