题意:输入一个数字n,代表有n行a,b,c,d,求a+b+c+d=0有多少组情况。

思路:先求出前两个数字的所有情况,装在一个数组里面,再去求后两个数字的时候二分查找第一个大于等于这个数的位置和第一个大于这个数的位置相减,得出有多少个答案,累加得出最终答案.

过程: 刚开始写的时候,用的是map把原来的答案存起来,后来发现超时,因为在存数的时候和取数的时候都消耗时间,所以就用容器直接存,二分查找得出答案,结果二分函数又忘了,于是自己尝试着写了一个,就过了。

lower_bound(v.begin(),v.edn(),x)-v.begin;

upper_bound(v.begin(),v.end(),x)-v.begin;

#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
int a[4005],b[4005],c[4005],d[4005],v[16000025];
bool comp(int a,int b)
{
return a<b;
}
int yao(int v[],int len,int t)
{
int l=0,r=len,mid;
while(l<r)
{
mid=(l+r)/2;
if(t<v[mid])
r=mid;
else
l=mid+1;
}
return r;
}
int main()
{
int n;
scanf("%d",&n);
int w=0;
for(int i=1; i<=n; i++)
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
v[w++]=a[i]+b[j];
sort(v,v+w,comp);
int k,kk,t1,t;
long long ans=0;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
t=c[i]+d[j];
t=t*-1;
k=lower_bound(v,v+w,t)-v;
kk=yao(v,w,t);
ans+=(kk-k);
}
printf("%lld\n",ans);
return 0;
}

最新文章

  1. 使用Robomongo 连接MongoDB 3.x 报 Authorization failed 解决办法(转)
  2. 最长递增子序列 O(NlogN)算法
  3. Android课程---日历选择器和时间选择器
  4. compass制作sprite雪碧图
  5. python ljust,rjust,center,zfill对齐使用方法
  6. Linux及安全期中总结
  7. CF 322E - Ciel the Commander 树的点分治
  8. js中元素操作的有关内容与对比
  9. 【Java】Checked、Unchecked Exception
  10. [转]C++实现系统服务暂停、停止、启动
  11. zepto.js的基本介绍与使用
  12. Android----ListView入门知识--各种Adapter配合使用
  13. 如何通过jmeter使用beanshell进行关联
  14. RESTful 个人理解总结
  15. 详解http和https的作用与区别
  16. 大白话说Java泛型:入门、使用、原理
  17. tar压缩文件排除文件夹【原创】
  18. mysql数据库中,如何对json数据类型的值进行修改?通过json_set函数对json字段值进行修改?
  19. web.xml 整合 SpringMVC
  20. oracle 企业管理器及无线网环境下配置方法

热门文章

  1. git还原历史某一版本
  2. USB小白学习之路(4)HID键盘程序
  3. 上周 GitHub 热点速览 vol.09:手撕 LeetCode 一日 star 破两千
  4. webpack 手动创建项目
  5. 前端每日实战:102# 视频演示如何用纯 CSS 创作一个小和尚
  6. chorme浏览器记住密码后input黄色背景处理方法总结(三种)
  7. Java基础--Arrays类
  8. Spring Boot 2.x基础教程:使用MyBatis的XML配置方式
  9. 02 JPA
  10. MATLAB神经网络(7) RBF网络的回归——非线性函数回归的实现