1. 程式人生 > 實用技巧 >第 45 屆國際大學生程式設計競賽(ICPC)亞洲網上區域賽模擬賽. A.Easy Equation (字首和/差分)

第 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;
    }