第 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; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮