codeforces 1300

Codeforces Round #618 (Div. 2)

codeforces 1300_第1张图片

A做的还是不快 卡了一下B 果断开了C 然后回头发现B怎么过的人这么多 就想到了 最后抄板子过了D 一度以为能直接到蓝 熬了两个小时想看颜色变化 顶不死睡了起床发现只涨了100 而且也没有以前有过的涨很多分的congratulation

A

题意:一次操作可以使数组的某个元素自增一次  问最少的操作次数使得数组元素的和与积不为0

        if(sum==0)
        {
            if(zero)
                ans=zero;
            else
                ans=1;
        }
        else
        {
            ans=zero;
            sum+=zero;
            if(sum==0)
                ans++;
        }

 

B

题意:    给定一个长度为2*n的数组 将其划分为两个奇数长度的数组 两部分的中位数之差绝对值最小值

输出排序后中间的两个数之差即可 因为构造出的所有划分方法一定都会大于这个值

 

C

题意: 定义了一种函数f(x,y) 得到x的bit集合减去y的bit集合 求一个数组按照怎样的顺序调用这个函数使得最后的bit集合代表的值最大

找到最高的不重复的bit代表的数字放在第一个即可

 

D

题意: 将一个凸包s的每个点放在原点上 其他点放进t中 最后t围一个凸包 问s和t是否相似

把这三句话都实现了 写成了板子计算几何题 竟然也过了 其实只需要检验s是否为中心对称图形

codeforces 1300_第2张图片

 

E

题意:正整数数组 一次操作是将区间内的数替代为这个区间内的平均数 进行若干次 求能得到的字典序最小的数组

将n个数分成n块 对每一块判断能否与前面的一块合并 能则合并 不能则成为新块 注意这里成为新块后仍然有机会与后面的块合并后再与前面合并 这里wa了挺久

另外官方题解上的凸包做法是将每个数看做(i,s[i])的点 s是前缀和 再把原点放进去 点与点之间的边的斜率代表这个区间的平均数 那么这个点集的下凸包就是字典序最小的方案即答案 白书和笔记不在家 已经不知道graham andrew这些东西都是什么了 回学校补

void slove1()
{
    int p=0;
    for(int i=0;i1&&st[p]

 

你可能感兴趣的:(cf)