codeforces 之 Number of Ways
2014-10-18 16:56
323 查看
题意分析:
就是说给你一串数字,分成三段,每段的数子的和相等,求有多少种分法。用前缀数组和S
,算出来A1=1/3S
,A2=2/3S
,求出当第I个A2出现时,前面已经有多少个A1,就对应有多少种分法。当S
=0,当做特例处理。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
long long s[500005],a;
int main()
{
long long n,i,sum=0;
s[0] = 0;
cin>>n;
for(i=1; i<=n; i++) {
cin>>a;
s[i]=s[i-1]+a;
if(s[i] == 0) sum++;
}
if(s
%3 || n<3) cout<<0<<endl;
else if(s
==0) {
cout<<(sum-1)*(sum-2)/2<<endl;
}
else {
long long s1=s
/3,s2=s
*2/3,ans=0,co=0;
for(i=1; i<=n; i++) {
if(s[i]==s2) ans+=co;
if(s[i]==s1) co++;
}
cout<<ans<<endl;
}
return 0;
}
就是说给你一串数字,分成三段,每段的数子的和相等,求有多少种分法。用前缀数组和S
,算出来A1=1/3S
,A2=2/3S
,求出当第I个A2出现时,前面已经有多少个A1,就对应有多少种分法。当S
=0,当做特例处理。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
long long s[500005],a;
int main()
{
long long n,i,sum=0;
s[0] = 0;
cin>>n;
for(i=1; i<=n; i++) {
cin>>a;
s[i]=s[i-1]+a;
if(s[i] == 0) sum++;
}
if(s
%3 || n<3) cout<<0<<endl;
else if(s
==0) {
cout<<(sum-1)*(sum-2)/2<<endl;
}
else {
long long s1=s
/3,s2=s
*2/3,ans=0,co=0;
for(i=1; i<=n; i++) {
if(s[i]==s2) ans+=co;
if(s[i]==s1) co++;
}
cout<<ans<<endl;
}
return 0;
}
相关文章推荐
- codeforces 466 C Number of Ways
- codeforces 466-C. Number of Ways(前缀和+尺取)
- Codeforces-466C-Number of Ways
- Codeforces - 466C. Number of Ways - 思维、暴力
- codeforces-466C-Number of Ways
- 【CODEFORCES】 C. Number of Ways
- Codeforces 466 C. Number of Ways
- codeforces 660D - Number of Parallelograms
- dp --- Codeforces 245H :Queries for Number of Palindromes
- cf466C Number of Ways
- codeforces 27E - Number With The Given Amount Of Divisors (数论 dfs)
- Codeforces466C Number of Ways
- Codeforces 27E - Number With The Given Amount Of Divisors
- [LeetCode] Number of decoding ways
- Codeforces466C Number of Ways
- CodeForces - 245H - Queries for Number of Palindromes
- codeforce Number of Ways(暴力)
- CodeForces-124A-The number of positions
- [CodeForces-585F]Digits of Number Pi
- 【codeforces 805D】Minimum number of steps