B. Forming Triangles

2024-01-23 20:52
文章标签 triangles forming

本文主要是介绍B. Forming Triangles,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

map

可以理解成一个简单的数组,只是下标可以变成Key,也就是所谓的索引

通过向 map 中插入一个类型为 pair<Key, T> 的值可以达到插入元素的目的,例如

mp.insert(pair<string,int>("Alan",100));

erase(key) 函数会删除键为 key 的 所有 元素。返回值为删除元素的数量。

erase(pos): 删除迭代器为 pos 的元素,要求迭代器必须合法。

erase(first,last): 删除迭代器在 [first,last) 范围内的所有元素。

clear() 函数会清空整个容器。

一般情况下推荐使用 find() 函数来寻找特定键的元素。

#include<bits/stdc++.h>using namespace std;int main()
{int t;cin>>t;while(t--){int n;cin>>n;map<int,int> mp;for(int i=1;i<=n;i++){int x;cin>>x;++mp[x];}long long res=0;int sum=0;for(auto it:mp){long long cnt=it.second;if(cnt>=3)res+=cnt*(cnt-1)*(cnt-2)/6;if(cnt>=2)res+=cnt*(cnt-1)/2*sum;sum+=cnt;}cout<<res<<endl;}return 0;
}

注意该题n的数据范围是3e5

也就是说遍历三层循环求解妥妥超时

刚开始还以为是什么神奇的算法

结果发现是2的次方的问题,假设一条边严格大于另一条边,长度至少是另一条边的两倍,假设有三条边,a,b,c,长度依次递减,并且是严格递减,那么a至少是b的两倍,b至少是c的两倍,那么b+c一定严格小于a,难以构成三角形

假设b不严格大于c,假设b=c,a严格大于b,那么还是不满足要求,因为取一个极端情况,a刚好是 b的两倍,那么b+c=a

所以只有可能出现 a=b>=c,可以使得三条边可以构成三角形

假设三条边都相等,可以使用组合数来求解答案

从所有相等的边里面选3条边可以构成一个三角形,假设该长度的出现次数是7,那么答案就是, C 7 3 C ^3_7 C73,(把数学公式打出来还挺难的,还得学,做题挺难的,还得练)

假设有两条边相等,也就是一个等腰三角形,那么底一定要严格小于腰(不严格小于就是等边三角形,上面已经考虑过了)

假设腰的长度的出现次数等于7, C 7 2 C^2_7 C72表示选择两个相等的腰,然后再乘以严格小于腰的长度的边出现的次数即可

严格小于腰的长度的边的出现的次数用sum来进行保存

因为是从小到大遍历的map里面的元素,所以保证了严格小于

用map的索引表示边的长度,map的第二个变量表示的是该长度的边出现的次数

最后输出答案即可

这篇关于B. Forming Triangles的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/637492

相关文章

Right Triangles

H - Right Triangles Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit  Status  Practice  CodeForces 52B Description You are given a n × m field consistin

hdu 5135 Little Zu Chongzhi's Triangles(计算几何:三角形面积)

给出多条木棍,问你用这些木棍所能组成的多个三角形面积最大和是多少 贪心做,所以先排序,但是遍历的过程中不能从前向后遍历 因为可能会存在4条边取后三条边是最优的类似情况 正解是从后向前遍历,用海伦公式求解 代码如下: /* ***********************************************Author :yinhuaEmail

lightoj 1307 Counting Triangles | 二分/暴力

题意: 给你N条边,问你能组成三角形的方法数。 思路: 判断三条边能否组成三角形,根据任意两条边的和大于第三边。 实际上,在确定A<=B<=C的情况下,只要A+B的和大于C即可认为ABC能组成三角形。 这题可以不用二分,用二分速度反而变慢了。排好序后乱搞就可以了。 AC代码: #include <cstring>#include <cstdlib>#include <cstd

UVA - 585 Triangles

题意:求最大的三角形 思路:先初始化从左到右和从右到左的最大连续的‘-’,然后就是当奇数列的时候找头向下的三角形,偶数的时候相反找 #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 200;char map[

uva 10911 - Forming Quiz Teams(记忆化搜索)

题目链接:10911 - Forming Quiz Teams 题目大意:给出2 * n个选手的坐标, 要求将所有的选手分成n组, 每组两个人, 所有组的两个人之间的距离之和要最小, 输出最小值。 解题思路:网络赛的时候写过类似的题目, 只不过是选4个点做正方形,所以思路很明确,每次选取任意两个点配对,递归搜索,并记录下来。然后我不是用未运算来记录点的状态,而开了个数组,因为位运算

UVA 10911 Forming Quiz Teams(dp + 集合最优配对问题)

4th IIUC Inter-University Programming Contest, 2005 G Forming Quiz Teams Input: standard input Output: standard output Problemsetter: Sohel Hafiz You have been given the job of forming the

UVA 12508 - Triangles in the Grid(计数问题)

12508 - Triangles in the Grid 题目链接 题意:给定一个n∗m格子的矩阵,然后给定A,B,问能找到几个面积在A到B之间的三角形。 思路:枚举每一个子矩阵,然后求[0,A]的个数减去[0,B]的个数就是答案,然后对于每个子矩阵个数很好求为(n−r+1)∗(m−c+1)。关键在于怎么求每个子矩阵的符合个数。 想了好久,参考别人题解才想出来,分3种情况讨论:

LightOJ 1236 Pairs Forming LCM

一道唯一分解的题目。 代码: #include <cstdio>#include <cstring>#include <cmath>#include <iostream>#include <algorithm>using namespace std;#define maxn 10000010typedef long long LL;LL prime[1000000];bool

H - Pairs Forming LCM

题目链接:https://cn.vjudge.net/contest/70017#problem/H 题目大意:给你一个数n,让你在n中找一对a,b两个值且a<b,使得a和b的最大公倍数是n。 题解:唯一分解定理,把每一个a和b分解成以素数为因子的乘积(算数基本定理那样),需要取每一个素数因子的指数最大的那素因子然后相乘,使得到的数为n。 例如a=a1^e1*a2^e2.........ax

【GAMES101】Lecture05 Rasterizaion 1 (Triangles) 光栅化之三角形

目录 0 引言1 MVP后要做什么呢?1.1 MVP是什么1.2 Canonical Cube to Screen 标准立方体到屏幕1.3 Rasterizing Triangles into Pixels 将三角形光栅化为像素 2 Rasterization:Drawing to Raster Display2.1 Polygon Meshes2.2 Triangle Meshes2.3