UVALive
来源:互联网 发布:putty上传文件到linux 编辑:程序博客网 时间:2024/06/01 18:33
简单二分题,前两个数相加为一个数组,后两个数相加为一个数组,然后遍历第一个数组并且二分第二个数组即可。
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=4400;int n,a[4][N],b[N*N],c[N*N];int bSearch1(int _begin, int _end, int e){int mid, left = _begin, right = _end;while(left <= right){mid = (left + right) >> 1;if(c[mid] >= e) right = mid - 1;else left = mid + 1;}return left;}int bSearch2(int _begin, int _end, int e){int mid, left = _begin, right = _end;while(left <= right){mid = (left + right) >> 1;if(c[mid] > e) right = mid - 1;else left = mid + 1;}return right;}int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=0;i<n;i++) { for(int j=0;j<4;j++) { scanf("%d",&a[j][i]); } } int m1=0,m2=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { b[m1++]=a[0][i]+a[1][j]; c[m2++]=a[2][i]+a[3][j]; } sort(c,c+m2); long long ans=0; for(int i=0;i<m1;i++) { int l=bSearch1(0,m2-1,-b[i]); int r=bSearch2(0,m2-1,-b[i]); if(c[l]==-b[i]) { ans+=(long long )r-l+1; } } printf("%lld\n",ans); if(T!=0) printf("\n"); }}/*16-45 22 42 -16-41 -27 56 30-36 53 -37 77-36 30 -75 -4626 -38 -10 62-32 -54 -6 45*/
阅读全文
0 0
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- Java锁——死锁
- 干货
- 再努力一把,走出校园,备战实习
- 端口
- ECMAScript 6 入门
- UVALive
- CF DP练习题
- 最短路
- 存在多个系统临时表空间时,DB2如何选择?
- 单例多例实验;注入打印
- Win32API学习笔记第六章(一)
- C++优先队列详解
- centos7上kvm的安装使用
- 波松瓦酒的分酒趣题