ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛 A.Easy Equation(差分数组)

2020-11-01 14:31:42  阅读:253  来源: 互联网

标签:每个 int Equation 45 ICPC 枚举 maxn include ll


地址:https://ac.nowcoder.com/acm/contest/8688/A

题意:

给出x,y,z,k的范围a,b,c,d
求能组成多少种x+y+z=k

解析:

这是差分数组推导过程的入口:https://www.cnblogs.com/liyexin/p/11014218.html

考虑先枚举a,得出所有的0~a+b的每个结果的数目。

然后在得知a+b的每个数目的情况下,再得到所有0~a+b+c的每个结果的数目。

实现过程,可以通过差分数组来实现。

先枚举a,那么对于每个a,a+b的范围在a~a+b之间,那么范围内每个结果的数目都要+1,有:f[i]++,f[i+b+1]--

前缀和操作一下,还原数组。

同理,在f[]已知各个a+b的种类情况下,枚举a+b,通过f[]来求0~a+b+c的每个出现次数

前缀和还原。

接下来把p[]加到d即可。

#include<iostream>
#include<cmath>
using namespace std;
#include<map>
typedef long long ll;
const int maxn=1e8;
ll f[maxn],p[maxn];
int main()
{
    ll a,b,c,d;
    cin>>a>>b>>c>>d;
    for(int i=0;i<=a;i++)
    {
        f[i]++;
        f[i+b+1]--;
    }
    for(int i=0;i<=a+b;i++)
        f[i]+=f[i-1];
    for(int i=0;i<=a+b;i++)
    {
        p[i]+=f[i];
        p[i+c+1]-=f[i];
    }
    for(int i=0;i<=a+b+c;i++)
        p[i]+=p[i-1];
    ll all=0;
    for(int i=0;i<=d;i++)
    {
        all+=p[i];
    }
    cout<<all<<endl;
    return 0;
}

记在后面:

比赛前期过程中,队伍陷入了一个误区,总是在思考怎么去掉a+b+c!=d的方法。其实反向思考一下,把所有种类弄出来,想办法记录。取a+b+c==d不就可以了吗?

标签:每个,int,Equation,45,ICPC,枚举,maxn,include,ll
来源: https://www.cnblogs.com/liyexin/p/13909430.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有