场次链接
这场题目较水。
A、Anu Has a Function
题目链接
题意 定义一个f(x,y)函数,为x|y-y,然后给你n个数,求
f
(
f
(
…
…
f
(
f
(
a
1
,
a
2
)
a
3
)
…
…
a
n
−
1
)
a
n
)
f(f(……f(f(a_1,a_2)a_3)……a_{n-1})a_n)
f(f(……f(f(a1,a2)a3)……an−1)an),你可以任意调换a数组的顺序,求答案最大时的a数组顺序。
数据范围
1
≤
n
≤
1
e
5
1\leq n\leq 1e5
1≤n≤1e5,
0
≤
a
i
≤
1
e
9
0\leq a_i \leq 1e9
0≤ai≤1e9
解:首先先看f函数,x|y-y,可以发现就是将x中y为1的二进制变成0,然后根据他要求的这个 相当于就是从
a
1
a_1
a1中将其他所有数二进制中为1的位置变成0。所以将所有数的二进制位进行统计,找到数量为1并且最大的那一个位置,找到那个数放在
a
1
a_1
a1,其他任意放置即可。
复杂度
O
(
32
∗
n
)
O(32*n)
O(32∗n)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100005];
int vis[100005];
int tmp[32];
void work()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
for(int j=0;j<=31;j++){
if((a[i]>>j)&1){
tmp[j]++;
}
}
}
int f=-1;
for(int j=31;j>=0;j--){
if(tmp[j]==1){
f=j;
break;
}
}
if(f==-1){
for(int i=1;i<=n;i++){
printf("%lld ",a[i]);
}
printf("\n");
}else{
for(int i=1;i<=n;i++){
if((a[i]>>f)&1){
printf("%lld ",a[i]);
vis[i]=1;
}
}
for(int i=1;i<=n;i++){
if(!vis[i]){
printf("%lld ",a[i]);
}
}
printf("\n");
}
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T=1;
//scanf("%d",&T);
//cin>>T;
while(T--){
work();
}
}
B、Aerodynamic
题目链接
给你一个凸多边形,然后问该多边形在原点移动(即原点在该多边形里或多边形边上)所形成的图形是否与该多边形相似。
解:题意很难理解,但是样例很简单,3个样例说明了中心对称的图形才满足该条件,判断中心对称即可。
复杂度
O
(
n
)
O(n)
O(n)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll x[100005],y[100005];
ll tmpx[100005],tmpy[100005];
void work()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld%lld",&x[i],&y[i]);
}
x[n+1]=x[1];
y[n+1]=y[1];
if(n%2!=0){
printf("NO\n");
}else{
for(int i=1;i<=n;i++){
tmpx[i]=x[i+1]-x[i];
tmpy[i]=y[i+1]-y[i];
}
for(int i=1;i<=n/2;i++){
if(tmpx[i]!=-tmpx[i+n/2]||tmpy[i]!=-tmpy[i+n/2]){
printf("NO\n");
return;
}
}
printf("YES\n");
}
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T=1;
//scanf("%d",&T);
//cin>>T;
while(T--){
work();
}
}
C、Water Balance
题目链接
给你N个数,你可以执行任意次操作,每次操作可以选定一系列连续的数使他们的值进行平均,问最后可以得到的最小的序列。
解:将数据放到一个类似于队列的数组中,每加进去一个数,跑一下是否能使前面变小的循环即可。
复杂度
O
(
n
)
O(n)
O(n)
自己代码太丑(主程序写了60多行),抄一下集训队大佬的。
#include<bits/stdc++.h>
#define rep(i,x,y) for(auto i=(x);i<=(y);++i)
#define dep(i,x,y) for(auto i=(x);i>=(y);--i)
#define fr first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int>pii;
const int N=1e6+10;
double h[N];int sz[N];
int main(){int n,t=0;
scanf("%d",&n);
rep(i,1,n){int x;
scanf("%d",&x);
h[++t]=x;sz[t]=1;
while(t>1&&h[t]<=h[t-1]){
h[t-1]=(h[t]*sz[t]+h[t-1]*sz[t-1])/(sz[t]+sz[t-1]);
sz[t-1]+=sz[t];--t;
}
}
rep(i,1,t){
rep(j,1,sz[i])printf("%.11lf\n",h[i]);
}
}