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 }
View Code

 也可以只差分 弄出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 }
View Code

 

posted @ 2020-11-02 16:53  canwinfor  阅读(42)  评论(0)    收藏  举报