当前位置: 首页 > news >正文

折半枚举:四数之和为零

题目描述

给定各有N个整数的四个数列A 、B、C、D。要从每个数列中各取1个数。使四个数的和为0。求这样的组合的个数。当一个数列中有多个相同的数字时,把它们作为不同的数字看待。

输入

第一行:每个数列包含的整数个数 N
接下来N行:每行包含四个各自属于数列A、B、C、D的数字

输出

第一行:使四个数和为0的组合个数

样例输入
6
-45   22  42   -16 
-41  -27  56    30
-36   53  -37   77
-36   30  -75  -4626  -38  -10   62
-32  -54  -6    45
样例输出
5
提示

说明:(-45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46),(-32, 30, -75, 77), (-32, -54, 56, 30) 这5个组合和为0。
对于100%的数据,1 <= n <= 4000,|(数字的值)| <= 1,000,000,000

思路分析

直接枚举,时间复杂度为O(n^4),在n≤4000的情况下行不通。

可以折半枚举,数组AB存储所有A[i]+B[j]的和,数组CD存储所有C[i]+D[j]的和。

数组AB与数组CD均按升序排序,便于后续二分查找。

题中明确表示,相同数字作为不同数字看待,遍历数组AB时可以压缩连续相同数字,在数组CD中用二分查找高效计算连续相同数字个数。

代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,ans;
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n;vector<int>a(n),b(n),c(n),d(n);for(int i=0;i<n;i++){cin>>a[i]>>b[i]>>c[i]>>d[i];}vector<int>ab,cd;for(int i=0;i<n;i++){for(int j=0;j<n;j++){ab.push_back(a[i]+b[j]);cd.push_back(c[i]+d[j]);}}sort(ab.begin(),ab.end());sort(cd.begin(),cd.end());int i=0,total=n*n;while(i<total){int x=ab[i],cnt_ab=0;while(i<total&&ab[i]==x){i++;cnt_ab++;}int target=0-x;auto it=lower_bound(cd.begin(),cd.end(),target);auto im=upper_bound(cd.begin(),cd.end(),target);int cnt_cd=im-it;ans+=cnt_ab*cnt_cd;}cout<<ans;return 0;
}

(用long long会内存超限

http://www.lryc.cn/news/611190.html

相关文章:

  • 深入解析数据结构之顺序表
  • 【经验记录贴】在windows系统中启动服务
  • 详细讲述优雅草蜻蜓I即时通讯私有化中xmpp服务中的tigase的角色与作用深度分析-卓伊凡|bigniu
  • 【轮播图】H5端轮播图、横向滑动、划屏效果实现方案——Vue3+CSS position
  • 从开发到售后:Q-Tester基于ODX标准的统一诊断平台
  • 闸机控制系统从设计到实现全解析:第 4 篇:Redis 缓存与分布式锁实现
  • STM32设置GPIO模式
  • Dify工作流三剑客:参数提取、变量赋值与聚合详解
  • Starrocks中的 Query Profile以及explain analyze及trace命令中的区别
  • Linux系统:基础I/O
  • 基于python的二手车价格预测及可视化系统,采用集成学习算法和diango框架
  • [按键精灵]
  • Pytorch基础入门2
  • AlmaLinux8 平替 manylinux_2_28-python 的 GPG密钥管理、安装 cuda sdk
  • gRPC Keepalive 机制详解与最佳实践
  • 微软Dragon Ambient eXperience (DAX) 深度解析
  • Linux 调度器函数sched_*系统调用及示例
  • Java JDBC连接池深度解析与实战指南
  • Transformer的并行计算与长序列处理瓶颈
  • Linux lvm逻辑卷管理
  • 猜数字游戏 Java
  • 【C++】模板深入进阶
  • Java技术栈/面试题合集(13)-网络篇
  • [Linux]学习笔记系列 -- [arm]boot
  • Android 之 Kotlin 和 MVVM 架构的 Android 登录示例
  • 腾讯云对象存储服务COS
  • QtPromise第三方库的介绍和使用
  • 人工智能领域、图欧科技、IMYAI智能助手2025年1月更新月报
  • ubuntu24中部署k8s 1.30.x-底层用docker
  • 相机拍摄的DNG格式照片日期如何修改?你可以用这款工具修改