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)
得证。
于是乎间隔着放 0
和 1
。
#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 (线段树)