Codeforces - 1080B. Margarite and the best present

发布于 2024-04-16 20:18:02 字数 2100 浏览 25 评论 0

题目大意

给你一个数组,数组元素取值为ai = i * (-1)i,给你两个数 lr ,要你求出 arr[l ~ r] 的和。

解析

  • 方法一: 可以使用等差数列求和公式,先全部看做正数,求出所有看做正数的和,然后减去 2 * 奇数的和 ,但是要分四种情况看 lr 的奇、偶情况;
  • 方法二: 有一个规律,就是前后两个数相加或者是 1 ,或者是 -1 ,然后分情况讨论从奇数开始还是偶数开始即可。
#include <bits/stdc++.h>

typedef long long ll;

// my solution
#if 0
int main(int argc, char const **argv)
{ 
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);    
    ll T, l, r;
    for(std::cin >> T; T--; ){ 
        std::cin >> l >> r;
        // regard as 2 arithmetic progression, regard as all to positive number
        ll sumAll = (l+r)*(r-l+1)/2;
        ll sumNegative;
        if( (l&1) && (r&1) )
            sumNegative = (l+r)*( (r-l)/2 + 1)/2;
        else if( (l&1)==0 && (r&1) )
            sumNegative = (l+1+r)*( (r-(l+1))/2 + 1)/2;
        else if( (l&1) &&  (r&1)==0 ) 
            sumNegative = (l+r-1)*( (r-1-l)/2 + 1)/2;
        else 
            sumNegative = (l+1+r-1)*( (r-1-(l+1))/2 + 1)/2;

        std::cout << sumAll - 2*sumNegative << std::endl;
    }
    return 0;
}
#endif

// best way
int main(int argc, char const **argv)
{ 
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);    
    ll T, l, r;
    for(std::cin >> T; T--; ){ 
        std::cin >> l >> r;
        ll sum, num = r - l + 1; // numbers 
        if(num & 1)  // odd
            sum = num == 1 ? ( l&1 ? -l : l) : ( l&1 ? -l-num/2 : l+num/2); 
        else  // even
            sum = l&1 ? num/2 : -num/2; 
        std::cout << sum << std::endl;
    }
    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

神回复

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

玍銹的英雄夢

文章 0 评论 0

我不会写诗

文章 0 评论 0

十六岁半

文章 0 评论 0

浸婚纱

文章 0 评论 0

qq_kJ6XkX

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文