首页 > 其他分享 >递增三元组

递增三元组

时间:2024-03-07 10:45:53浏览次数:19  
标签:ch int 递增 long 三元组 getchar

一、题目描述

P8667 [蓝桥杯 2018 省 B] 递增三元组

二、问题简析

题目要求:

\[\begin{split} &1 \leq i,j,k \leq N \\ &A_i < B_j < C_k \end{split} \]

改变一下,得到

\[\begin{cases} A_i < B_j \\ C_k > B_j \end{cases} \]

对于一个确定的 \(B_j\),统计所有 \(< B_j\) 的 \(A_i\) 的数量 cntA,统计所有 \(> B_j\) 的 \(C_k\) 的数量 cntC,对于该 \(B_j\) 解的数量为 cntA * cntC


AC代码

复杂度:\(O(NlogN)\)$

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int quickin(void)
{
	int ret = 0;
	bool flag = false;
	char ch = getchar();
	while (ch < '0' || ch > '9')
	{
		if (ch == '-')    flag = true;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9' && ch != EOF)
	{
		ret = ret * 10 + ch - '0';
		ch = getchar();
	}
	if (flag)    ret = -ret;
	return ret;
}

const int MAX = 1e5 + 3;
int A[MAX], B[MAX], C[MAX], n; 

int main()
{
	#ifdef LOCAL
	freopen("test.in", "r", stdin);
	#endif
	
	n = quickin();
	for (int i = 1; i <= n; i++)
		A[i] = quickin();
	for (int i = 1; i <= n; i++)
		B[i] = quickin();
	for (int i = 1; i <= n; i++)
		C[i] = quickin();
		
	sort(A + 1, A + 1 + n);
	sort(C + 1, C + 1 + n);
	
	ll ans = 0;
	for (int i = 1; i <= n; i++)
	{
		int cntA = lower_bound(A + 1, A + 1 + n, B[i]) - A - 1;
		int cntC = C + n - upper_bound(C + 1, C + 1 + n, B[i]) + 1;
		ans += (ll)cntA * cntC;
	}
	cout << ans << endl;
	
	return 0;
}

标签:ch,int,递增,long,三元组,getchar
From: https://www.cnblogs.com/hoyd/p/18058353

相关文章

  • 代码随想录算法训练营第三十七天 | 738. 单调递增的数字,968.监控二叉树
    968.监控二叉树 已解答困难 相关标签相关企业 给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。 示例1:输入:[0,0,null,0,0]输出:1......
  • 代码随想录算法训练营第三十六天| ● 738.单调递增的数字 ● 968.监控二叉树 ● 总
    单调递增的数字 题目链接:738.单调递增的数字-力扣(LeetCode)思路:从左向右验证是否按位单调递增,如果出现递减的区间,则从该位开始验证该位减1后是否比左边的相邻位大,如果不符合就接着向左寻找这样的位,如果找到了,则将该位前面的位复制到结果中,该位减1加入结果,该位之后的位全部改......
  • day56 动态规划part13 代码随想录算法训练营 674. 最长连续递增序列
    题目:674.最长连续递增序列我的感悟:网速快是不一样!!这个题别看简单,写不出递推公式也白搭理解难点:递推公式,是只跟昨天的比,如果没有,就重新计算!听课笔记:我的代码:classSolution:deffindLengthOfLCIS(self,nums:List[int])->int:dp=[1]*len(nums)......
  • day56 动态规划part13 代码随想录算法训练营 300. 最长递增子序列
    题目:300.最长递增子序列我的感悟:之前做过,都忘记了,这次好好记思路理解难点:dp[i]是由昨天的历史遍历后,得到今天的值 听课笔记:我的代码:classSolution:deflengthOfLIS(self,nums:List[int])->int:#难点是dp的推导公式,#dp[i]是截止到n......
  • 代码随想录算法训练营第二十九天| 491.递增子序列 46.全排列 47.全排列 II
    491.递增子序列题目链接:491.非递减子序列-力扣(LeetCode)思路:一开始一直报访问异常的错误,最后只好参考官网答案,结果竟然是因为我递归参数写错了导致程序一直出问题???(⊙︿⊙)这里去重用的是标记数组,可以用集合unordered_set,但由于本题数据范围比较小,所以我们可以用数组更加高效的......
  • 【算法】关于最长递增子序列(LIS)二分+贪心解法
    前言我们都知道,解决LIS的常规解法为DP,时间复杂度为O(n^2),但是在一些条件苛刻的问题中,通常DP的解法会超时。那么,是否存在一种时间复杂度更优秀的解法呢?答案是肯定的,有一种二分加贪心的解法可以将时间复杂度降低为O(nlogn)。详解如果我们现在要求下面这一组数据的LIS:我们需......
  • (29/60)递增子序列、全排列、全排列Ⅱ
    递归子序列leetcode:491.非递减子序列回溯法思路类似子集Ⅱ,每个元素大于二的节点都放入结果集。在填充path的过程中,检查是否满足非严格递增(是否等于末元素或比它大)。但是由于本题不能排序,之前的去重策略(数组排序,检查nums[i-1]==nums[i]&&used[i-1]==false)要调整......
  • 代码随想录 day56 最长递增子序列 最长连续递增序列 最长重复子数组
    最长递增子序列dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度状态转移方程的含义:位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列+1的最大值。最长连续递增序列dp[i]:以下标i为结尾的连续递增的子序列长度为dp[i]。如果nums[i]>nums[i-1......
  • 递增子序列--连续与不连续
    问题一:最长严格递增子序列的长度题目:给定一个整数数组nums,找到其中最长严格递增子序列的长度。状态定义:dp[i]表示以nums[i]结尾的最长严格递增子序列的长度。状态转移方程对于每个nums[i],遍历其之前的所有元素nums[j](j从0到i-1),如果nums[i]>nums[j],则可以考虑......
  • P8667 [蓝桥杯 2018 省 B] 递增三元组
    二分计数#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;constintN=1e5+5;intn,arr[3][N],base[N];longlongans;int......