第 45 屆國際大學生程式設計競賽(ICPC)亞洲網上區域賽模擬賽. A.Easy Equation (字首和/差分)
阿新 • • 發佈:2020-11-02
-
題意: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; }