返回顶部

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

  • 题意:RT,给你四个数\(a,b,c,d\),求\(x+y+z=k\)的方案数.

  • 题解:我们可以先枚举\(x\)的值,然后\(x+y\)能取到的范围一定是\([x,x+b]\),也就是说这个区间内每个数都有一个贡献,所以我们可以通过枚举\(a\)并且利用差分来求出\(x+y\)的贡献,然后再复原前缀和,同理再枚举\(x+y\),即枚举\(a+b\)并加上\(c\),来求出\(x+y+z\)的贡献,再复原前缀和,最后枚举\(d\)将每个点的方案数加给答案即可.

  • 代码:

    ll a,b,c,d;
    ll dif[N],difc[N];
    
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        cin>>a>>b>>c>>d;
    
        for(int i=0;i<=a;++i){
            dif[i]++;
            dif[i+b+1]--;
        }
    
        for(int i=1;i<=a+b;++i) dif[i]+=dif[i-1];
    
        for(int i=0;i<=a+b;++i){
            difc[i]+=dif[i];
            difc[i+c+1]-=dif[i];
        }
        for(int i=1;i<=a+b+c;++i) difc[i]+=difc[i-1];
        ll ans=0;
        for(int i=0;i<=d;++i) ans+=difc[i];
    
        cout<<ans<<endl;
    
        return 0;
    }
    
posted @ 2020-11-02 14:46  Rayotaku  阅读(322)  评论(0编辑  收藏  举报