Easy Equation ###K ###K //K
题目链接:https://ac.nowcoder.com/acm/contest/8688/A
题意:给定x y z k的范围 问x+y+z=k的种类数
思路:只需要求出0~d 每个数有多少种累加即可
先考虑 求a+b 枚举a之后 +b的范围内 的数都可以加1 但是要o(n)处理 所以要用差分数组 注意差分数组不用取n+1位
求出a+b的范围后 再枚举a+b 类似就可以求出a+b+c的范围了 一定要注意a+b 后 每次加的值是dd[i]而不是1了
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define pb push_back 5 const int maxn =1e6+10; 6 const int mod=1e9+7; 7 ll dd[maxn*2]; 8 ll f[maxn*3]; 9 10 11 int main() 12 { 13 ios::sync_with_stdio(false); 14 cin.tie(0); 15 int a,b,c,d; 16 cin>>a>>b>>c>>d; 17 for(int i=0;i<=a;i++) 18 { 19 dd[i]++; 20 dd[i+b+1]--; 21 } 22 for(int i=1;i<=a+b;i++) 23 dd[i]+=dd[i-1]; 24 for(int i=0;i<=a+b;i++) 25 { 26 f[i]+=dd[i]; 27 f[i+c+1]-=dd[i]; 28 } 29 for(int i=1;i<=a+b+c;i++) 30 f[i]+=f[i-1]; 31 ll ans=0; 32 for(int i=0;i<=d;i++) 33 { 34 ans+=f[i]; 35 } 36 cout<<ans<<'\n'; 37 38 39 40 41 42 }
也可以只差分 弄出a+b的范围 然后枚举c的范围
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define pi pair<int,int> 5 #define pb push_back 6 #define fi first 7 #define sc second 8 #define ull unsigned long long 9 const int maxn=3e6+10; 10 const int mod=5000011; 11 12 13 ll ab[maxn],abc[maxn]; 14 15 16 int main() 17 { 18 ios::sync_with_stdio(0); 19 cin.tie(0); 20 int a,b,c,d; 21 cin>>a>>b>>c>>d; 22 for(int i=0;i<=a;i++) 23 { 24 ab[i]+=1; 25 ab[b+i+1]-=1; 26 } 27 for(int i=1;i<=a+b;i++) 28 { 29 ab[i]+=ab[i-1]; 30 } 31 for(int i=1;i<=a+b;i++) 32 { 33 ab[i]+=ab[i-1]; 34 } 35 ll ans=0; 36 for(int i=0;i<=c;i++) 37 { 38 if(i>d) break; 39 ans+=ab[d-i]; 40 } 41 cout<<ans<<'\n'; 42 43 44 }

浙公网安备 33010602011771号