[bzoj4927][SDOI省队集训2017]diyiti
来源:互联网 发布:xampp mysql mac设置 编辑:程序博客网 时间:2024/06/01 20:57
题目大意
在一个长度为n的数列中找出六个数,使得可以把它们分成四组,每组的和均相等。求方案数。
XJB做
只有1+1+1+3或1+1+2+2两种拆分。
先预处理two[x]表示找出两个数和为x的方案数,以及one[x]表示有多少数是x。
对于1+1+1+3,枚举那个1是x,首先有一个
对于那个3,我们先枚举一个ai,然后对应方案数是two[x-a[i]]。
注意当a[i]+a[i]+a[j]=x时会记重,要减去。
然后还会出现很尴尬得a[i]+a[i]+a[i]=x的情况。
大概讨论下。
对于1+1+2+2也是讨论,突然不想写了请看代码。
#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;typedef long long ll;const int maxn=5000+10,maxd=10000000+10;int a[maxn],one[maxd],two[maxd];bool bz[maxd];int i,j,k,l,t,n,m,x,z;ll w,y,ans;ll C(int n,int m){ if (m==2) return (ll)n*(n-1)/2; else if (m==3) return (ll)n*(n-1)*(n-2)/6;}int main(){ freopen("yist.in","r",stdin);freopen("yist.out","w",stdout); scanf("%d",&n); fo(i,1,n){ scanf("%d",&a[i]); one[a[i]]++; } fo(i,1,n-1) fo(j,i+1,n) if (a[i]+a[j]<=maxd-10) two[a[i]+a[j]]++; fo(i,1,n){ if (bz[a[i]]||one[a[i]]<3) continue; bz[a[i]]=1; x=a[i]; y=0; fo(j,1,n) if (x>=a[j]){ z=0; if (2*a[j]<=x){ z=one[x-2*a[j]]; if (3*a[j]==x) z--; } y+=(ll)(two[x-a[j]]-z); } y/=3; ans+=(ll)C(one[x],3)*y; } fo(i,1,n) bz[a[i]]=0; fo(i,1,n){ if (bz[a[i]]||one[a[i]]<2) continue; bz[a[i]]=1; x=a[i]; y=C(two[x],2); fo(j,1,n) if (x>=a[j]){ z=one[x-a[j]]; if (2*a[j]==x) z--; y-=(ll)C(z,2); } w=0; fo(j,1,n) if (a[j]*2<x) w+=(ll)(one[a[j]]-1)*C(one[x-a[j]],2); w/=2; y-=w; w=0; fo(j,1,n) if (a[j]*2==x) w+=(ll)C(one[a[j]]-1,3)*2; w/=4; y-=w; ans+=(ll)C(one[x],2)*y; } printf("%lld\n",ans);}
阅读全文
0 0
- [bzoj4927][SDOI省队集训2017]diyiti
- [bzoj4928][SDOI省队集训2017]dierti
- [bzoj4930][SDOI省队集训2017]棋盘
- [bzoj4931][SDOI省队集训2017]塔
- [JZOJ5129][SDOI省队集训2017]字符串
- [JZOJ5133][SDOI省队集训2017]重建
- [JZOJ5136][SDOI省队集训2017]重排
- [JZOJ5131][SDOI省队集训2017]距离
- [JZOJ5130][51nod1446][SDOI省队集训2017]苹果树
- [JZOJ5132][SDOI省队集训2017]子序列
- [JZOJ5134][SDOI省队集训2017]三元组
- [JZOJ5135][SDOI省队集训2017]逆序对
- [JZOJ5137][SDOI省队集训2017][bzoj4842]养猫
- 【SDOI省队集训题】棋盘(最小费用流)
- 【SDOI省队集训题】pair(线段树+二分)
- [计数][容斥] LOJ#6065 || BZOJ4927 && 2017 山东一轮集训 Day3. 第一题
- diyiti
- diyiti
- 基数排序
- *有向图强连通分量——Tarjan
- 考研数学笔记 51~55
- 工作总结
- 用python取代netcat第一步
- [bzoj4927][SDOI省队集训2017]diyiti
- 1
- 利用nginx提供网页服务,以及通过反向代理实现负载均衡的实践
- 设计模式简介
- 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
- Java XML 重新整理过的
- 软件工程师必须知道的20个常识
- 2
- 3