标签:折半 2785 typedef whose int long 4000 枚举 include
原题
题目分析
依题意,直接对a,b,c,d四个数列进行枚举有n4个状态,考虑折半枚举.分别枚举a,b的组合和c,d的组合,则枚举情况可缩小为2*n2个状态.先把c,d的枚举结果排序,然后在枚举a,b的组合过程中,假设枚举的a,b组合为a[i]+b[j],只需要在c,d的组合中找大小为-(a[i]+b[j])的数量即可,这个找的过程可以用二分来优化,最后复杂度为O(n2log(n2)).
代码
1 #include <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <algorithm> 5 #include <utility> 6 #include <ctime> 7 #include <cmath> 8 #include <cstring> 9 #include <string> 10 #include <stack> 11 #include <queue> 12 #include <vector> 13 #include <set> 14 #include <map> 15 16 using namespace std; 17 typedef unsigned long long ULL; 18 typedef long long LL; 19 typedef long double LB; 20 const int INF_INT=0x3f3f3f3f; 21 const LL INF_LL=0x3f3f3f3f3f3f3f3f; 22 23 int a[4000],b[4000],c[4000],d[4000]; 24 int cd[16000000]; 25 26 int main() 27 { 28 // freopen("testdata.in","r",stdin); 29 // freopen("std.out","w",stdout); 30 int N; 31 while(cin>>N) 32 { 33 for(int i=0;i<N;i++) 34 scanf("%d %d %d %d",&a[i],&b[i],&c[i],&d[i]); 35 36 for(int i=0;i<N;i++) 37 for(int j=0;j<N;j++) 38 cd[i*N+j]=c[i]+d[j]; 39 sort(cd,cd+N*N); 40 LL ans=0; 41 for(int i=0;i<N;i++) 42 for(int j=0;j<N;j++) 43 { 44 int t=-(a[i]+b[j]); 45 ans+=upper_bound(cd,cd+N*N,t)-lower_bound(cd,cd+N*N,t); 46 } 47 cout<<ans<<endl; 48 } 49 return 0; 50 }
标签:折半,2785,typedef,whose,int,long,4000,枚举,include 来源: https://www.cnblogs.com/VBEL/p/11755821.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。