Codeforces Global Round 1

Posted guaguastandup

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Global Round 1相关的知识,希望对你有一定的参考价值。

作为tourist的(不忠实)粉丝
今天,我们来分析一下,昨晚,tourist的代码
最近查题解的时候,总感觉有的思路比较复杂,或者不太简洁,所以干脆学习一下tourist的代码,机会难得
毕竟很少和tourist打同一场.....
...
难过
总有一天我也要打div1

技术图片
这一题的第一种思路是tourist这种,十分暴力
技术图片

他直接用了多项式的公式,并且在[0,k-1)的循环里不断对2取余
我的方法是:


#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
const int N=2e5+100;
const int INF = 1e9;

int32_t main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int b, k;
    cin >> b >> k;
    int sum = 0;
    int a[N];
    for (int i = 0; i < k;i++){
        cin >> a[i];
        a[i] = a[i] % 2;
        sum += a[i];
    }
    if(b%2==0){
        if(a[k-1]==1)
            cout << "odd";
        else
        cout << "even";
        //system("pause");
        return 0;
    }
    else{
        if(sum%2==0)
            cout << "even";
        if(sum%2)
            cout << "odd";
    }
    //system("pause");
    return 0;
}

如果b是奇数,那么必须保证系数A相加是偶数,结果才能是偶数
如果b是偶数,那么只要看最后的常数项是奇数还是偶数

B题:
技术图片

这题!!一步之遥我就要写出来了
写题的时候千万要自信,也不要陷在一个思路里面出不来了,这种思维题其实有很多套路可循,而且这种套路其实以前已经遇到过,只是当时没有在意而已

技术图片

如果tourist能在3min内写完的题,码量肯定不大,一定是有某种方法能很快解决的,

拿到B题,我们想到的首先是找出每段之间的距离,最后看看能选几个直接修复1cm的线段,有几个是需要一条较长的线段去修复的

如果把每两个破碎点之间的距离排序,再进行选择,那么得到的值是不对的,因为原有的顺序被打乱了

那么我们可以选择先假设如果只用一条绷带,需要的长度,
这个长度就是
a[n-1]-a[0]+1;

比如说对于数据
4 100 2
20 30 75 80
只用一条绷带,我们的选择是80-20+1=61cm
现在可以用两条,那么我们可以拿走一段不用它
比如说,把一根木条劈成两半,我们只需要砍一刀
一根木条劈成三份,我们需要砍两刀
那么,如果我们现在需要把一根木条砍成k段,那么可以砍k-1刀,也就可以从原本的那一条长绷带中删去k-1个比较长的绷带,之前已经排过序了,直接减就好了
至于在前面的
b.push_back(a[i+1]-a[i]-1);
比如说
对于
20 30 75 80
最大长度为61
现在减去30到75的那一段,长度是75-30-1;
为什么要减1,
因为(30,75)的长度就是75-30-1;
[30,75)的长度是75-30;
[30,75]的长度是75-30+1;
这个就是区间上长度的选取的问题;

C题
技术图片

这个C题,
只是因为在人群中多看了你一眼,我脑壳痛到现在
技术图片

以上是关于Codeforces Global Round 1的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Global Round 1

Codeforces Global Round 1

Codeforces Global Round 1

Codeforces Global Round 1

Codeforces Global Round 19

Codeforces Global Round 1 AParity