Codeforces Round #618 (Div. 1)

场次链接
这场题目较水。
在这里插入图片描述
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)an1)an),你可以任意调换a数组的顺序,求答案最大时的a数组顺序。
数据范围 1 ≤ n ≤ 1 e 5 1\leq n\leq 1e5 1n1e5, 0 ≤ a i ≤ 1 e 9 0\leq a_i \leq 1e9 0ai1e9
解:首先先看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(32n)

#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]);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值