SDUT3141:Count(哈希)好题

题目:传送门

题目描述

You are given an integer array s[] and are asked to count how many positions a, b, c and d satisfy the condition: s[a] + s[b] + s[c] == s[d].

Note that a, b, c, and d do not need to be distinct.

输入

The first line of input contains an integer T, indicates the cases.

Each of the next T blocks contains an integer n first (0< n ≤1000 ), the length of the array s[], following with n integers representing s[] (0≤ si≤10^6 ).

输出

Output T lines each contains the answer required. You‘d better use ‘long long‘ instead of ‘int‘.

示例输入

4
4
0 0 0 0
2
1 3
4
1 10 100 111
1
3

示例输出

Case #1: 256
Case #2: 1
Case #3: 6
Case #4: 0

这题题意很简单,但是我比赛的时候没有做出来,当时看见几乎所有人都A了痛苦啊,就是一道简单哈希。

题意:给定一个序列,查找所有满足s[a]+s[b]+s[c]=s[d]的abcd的组数,注意,不要求abcd都不同。

分析:n<=1000,很明显O(n^3)的算法是不可能过的。式子可以转化为s[a]+s[b]=s[d]-s[c],然后复杂度就变成了O(n^2),先枚举ab,再枚举cd即可,用数组离散化。注意,因为s[a]+s[b]肯定是>=0,所以可以剪枝掉所有的s[d]-s[c]<0的情况。

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
typedef long long ll;
using namespace std;
int n,a[1010],h[2000010];
ll sum;
int main()
{
    int T;
    scanf("%d",&T);
    for(int z=1;z<=T;z++)
    {
        scanf("%d",&n);
        sum=0;
        memset(h,0,sizeof(h));
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
                if(a[i]-a[j]>=0)
                h[a[i]-a[j]]++;
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
               sum+=h[a[i]+a[j]];
        }
        printf("Case #%d: %lld\n",z,sum);
    }
    return 0;
}
 
时间: 2024-09-29 20:07:31

SDUT3141:Count(哈希)好题的相关文章

codevs哈希水题

1230 多重hash练习一下,不用也可以 // // main.cpp // codeves1230 // // Created by Candy on 9/29/16. // Copyright © 2016 Candy. All rights reserved. // #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace

hdu 1800 字符串哈希 裸题

题意:意思是有若干个飞行员,需要在扫帚上练习飞行,每个飞行员具有不同的等级,且等级高的飞行员可以当等级低的飞行员的老师,且每个飞行员至多有且只有一个老师和学生.具有老师和学生关系的飞行员可以在同一把扫帚上练习,并且这个性质具有传递性.即比如有A,B,C,D,E五个飞行员,且等级是A>B>C>D>E,那么可以使A当B的老师,B当C的老师,E当D的老师,那么A,B,C可以在同一扫帚上练习,D,E在同一把扫帚上练习,这样需要2把扫帚,而如果是A当B的老师,B当C的老师,C当D的老师,D当

【BZOJ5248】【九省联考2018】一双木棋(搜索,哈希)

[BZOJ5248][九省联考2018]一双木棋(搜索,哈希) 题面 BZOJ Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且 这个格子的左侧及上方的所有格子内都有棋子. 棋盘的每个格子上,都写有两个非负整数,从上到下第i行中从左到右第j列的格子上的两个整数记作Aij.Bij.在 游戏结束后,菲菲和牛牛会分别计算自己

基本算法题

//第一题:输出一个整数的每一位. #include <stdio.h> int main() {  int num ;  scanf("%d", &num);  while (num)  {   printf("%d ", num % 10);   num = num / 10;  }  return 0; } //第三题:1到100中一共有多少个数字9. #include <stdio.h> int main() {  int i

字符串哈希专题

layout: post title: 字符串哈希专题 author: "luowentaoaa" catalog: true tags: mathjax: true - 字符串 传送门 A.POJ - 1200 A - Crazy Search 摘要 哈希进制转换 题意 一个字符串分成长度为N的字串.且不同的字符不会超过NC个.问总共有多少个不同的子串 思路 以nc作为进制,把一个子串化为这个进制下的数,再用哈希判断 #include<cstdio> #include&l

LeetCode算法题-Average of Levels in Binary Tree(Java实现)

这是悦乐书的第277次更新,第293篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637).给定一个非空二叉树,以数组的形式返回每一层节点值之和的平均值.例如: 3 / 9 20 / 15 7 输出:[3,14.5,11] 说明:第一层上的节点的平均值为3,第二层上的节点的平均值为14.5,第三层上的节点的平均值为11.因此返回[3,14.5,11]. 注意:节点值的范围在32位有符号整数的范围内. 本次解题使用的开发工具是eclipse,jd

[SPOJ-COT]Count on a tree

[SPOJ-COT]Count on a tree 题面 You are given a tree with N nodes. The tree nodes are numbered from 1 to N. Each node has an integer weight. We will ask you to perform the following operation: u v k : ask for the kth minimum weight on the path from node

数据结构:查找

1.学习总结 1.1查找的思维导图 1.2.查找学体会 (1)理解查找的基本概念,包括静态查找表和动态查找表.内查找和外查找之间的差异以及平均查找长度等. (2)重点掌握线性表上各种查找算法,包括顺序查找.折半查找和分块查找的基本思路.算法实现和查找效率等. (3)掌握各种树表的查找算法,包括二叉排序树.AVL树.B-树和B+树的基本思路.算法实现和查找效率等. (4)掌握哈希表查找技术以及哈希表与其他存储方式的本质区别. (5)灵活运用各种查找方法解决一些综合应用问题. 2.PTA实验作业 2

3097: Hash Killer I

3097: Hash Killer I Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 425  Solved: 157[Submit][Status][Discuss] Description 这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题:给你一个长度为N的字符串S,求有多少个不同的长度为L的子串.子串的定义是S[l].S[l + 1].... S[r]这样连续的一段.两个字符串被认为是不同的

nodejs api 中文文档

文档首页 英文版文档 本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可. Node.js v0.10.18 手册 & 文档 索引 | 在单一页面中浏览 | JSON格式 目录 关于本文档 稳定度 JSON 输出 概述 全局对象 global process console 类: Buffer require() require.resolve() require.cache require.extensions __filename __dirname module e