Codeforces Round#500 (Div. 2) [based on EJOI]

比赛传送门

A. Piles With Stones

看sum1是否大于sum2即可

1
2
3
4
5
6
7
8
9
10
11
12
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans1,ans2;

int main(){
scanf("%d",&n);
for (int i=1,x;i<=n;i++) scanf("%d",&x),ans1+=x;
for (int i=1,x;i<=n;i++) scanf("%d",&x),ans2+=x;
return puts(ans1<ans2?"No":"Yes"),0;
}

B. And

答案只可能是0,1,2,-1

依次判断即可

注意\(a_i \& x\)可能为0,贡献了两发WA……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<cstdio>

const int maxn=100005;
int n,x,a[maxn],num[2][maxn];
int main(){
scanf("%d%d",&n,&x);
for (int i=1;i<=n;i++) scanf("%d",&a[i]),num[0][a[i]]++,num[1][a[i]&x]++;
for (int i=0;i<=100000;i++)
if (num[0][i]>1) return puts("0"),0;
for (int i=1;i<=n;i++){
num[0][a[i]]--;
if (num[0][a[i]&x]) return puts("1"),0;
num[0][a[i]]++;
}
for (int i=0;i<=100000;i++)
if (num[1][i]>1) return puts("2"),0;
return puts("-1"),0;
}

C. Photo of The Sky

考虑把所有数字排序,第一个和最后一个一定是x/y坐标的最大/最小值

如果第一个和最后一个都是x坐标,枚举一段连续的n个作为y坐标即可

如果分属x/y坐标,显然前n个是x坐标,后n个是y坐标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;

const int maxn=200005;
int n,N,a[maxn];
int main(){
scanf("%d",&n);N=2*n;
for (int i=1;i<=N;i++) scanf("%d",&a[i]);
sort(a+1,a+1+N);
ll ans=((ll)a[n]-a[1])*(a[N]-a[n+1]);
for (int i=2;i<=n;i++)
ans=min(ans,((ll)a[N]-a[1])*(a[i+n-1]-a[i]));
printf("%lld",ans);
return 0;
}

D. Chemical table

看这里

E. Hills

看这里