[链接]:CF978C [分析]:在前缀和数组种二分找到>=询问数的位置,根据位置就好操作了 [代码]: #include<bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; #define ll long long #define ms(a,b) memset(a,b,sizeof(a)) #define rep(i,a,b) for(int i=(a); i<=(b); i++) const int N…
题目链接:Glider Gym-101911B 解题分析:下落的高度一定,是h.在没有气流的地方每秒下落1:所以可以转化为经过无气流地带的时间总长为h. 那么很显然从一个有气流地带的开始,选择下落,那么问题来了,一个一个去试然后一个一个计算他的路径去维护一个最大值吗?未免太过麻烦,所给数据有 那么大. 解题关键:二分+前缀和 二分查找用:lower_bound() int x=lower_bound(a, a+n, val)-a; 其中i返回值为数组元素值大于等于val的第一个下标.相应地,如果…
题目: 写这题花了我一上午时间. 下面是本人(zhangjiuding)的思考过程: 首先想到的是三行,每一行一定要走到. 大概是这样一张图 每一行长度最少为1.即第一行(i -1) >= 1,第二行 (j - i) >= 1,第三行 (n - j) >= 1. 我们要求的就是这条路径上的和. 我们发现只要 i 和 j 固定了,结果就固定了. 如果每次都要重新求和的话时间复杂度肯定不够,所以我这个时候想到了前缀和. 用sum[a][b]表示第a行(总共只有3行)前b个数字的和. 第一行可…
题目: 这题要求大于0的最小字段和,常规O(n)求最大字段和的方法肯定是没法解的. 我的解法是:用sum[i]存前i项的和,也就是前缀和. 这题就变成了求sum[j]-sum[i]的大于0的最小值( j > i ). 我们可以看到直接循环运算量是50000*50000,会超时. 所以我们应该充分利用前缀和的特性. 我们用一个set容器来装sum. 当算到i项时,保证前i-1项已经装入了set中. 我们用二分查找找到第一个比sum[i]小的值,用sum[i]减去这个值来更新答案. 至于二分插入,s…
<二分查找+双指针+前缀和>解决子数组和排序后的区间和 题目重现: 给你一个数组 nums ,它包含 n 个正整数.你需要计算所有非空连续子数组的和,并将它们按升序排序,得到一个新的包含 n * (n + 1) / 2 个数字的数组. 请你返回在新数组中下标为 left 到 right (下标从 1 开始)的所有数字和(包括左右端点).由于答案可能很大,请你将它对 10^9 + 7 取模后返回. 示例 1:输入:nums = [1,2,3,4], n = 4, left = 1, right…
题意: 有N个队伍(1 <= N <= 100,000),每个队伍开始有ai个人[0 <= ai<= 100,000,000],有Q个操作[0<=Q<= 500,000] 操作分为三种,1 A:表示在第A个队列加一个人. 2 X:表示求长度大于等于X队列数量.3 Y:表示所有长度大于等于Y的队列减去一个人. 题解: 把各个队列按长度排序 用差分数列来维护这个数组,这样求每个队列的长度就是求前缀和.每次求长度的复杂度是lgn,因为队列是按长度排序的,所以可以通过二分查找到…
题目描述: Given a list of sorted characters letters containing only lowercase letters, and given a target letter target, find the smallest element in the list that is larger than the given target. Letters also wrap around. For example, if the target is t…
Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11224   Accepted: 4660 Description A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S < 100 000 000) ar…
https://codeforces.com/contest/1119/problem/D 题意 有n个数组,每个数组大小为\(10^{18}+1\)且为等差数列,给出n个数组的\(s[i]\),q次询问,每次询问一个区间[l,r],问所有数组的[l,r]区间一共有多少不同的数 题解 结果只与选择的区间长度len有关,还有和两个数组s[i]的差cha有关 若len<=cha,则没有重复,即\(2*len\) 若len>cha,则前面一个数组可以取满len个,后面的数组只能cha个,即\(cha…
二分查找 正常实现 题解 public int binarySearch(int[] nums, int key) { int l = 0, h = nums.length - 1; while (l <= h) { int m = l + (h - l) / 2; if (nums[m] == key) { return m; } else if (nums[m] > key) { h = m - 1; } else { l = m + 1; } } return -1; } 二分查找也称为…