
二分
ACkingdom
这个人很懒,什么都没有留下
展开
-
Codeforces Round #656 (Div. 3) D. a-Good String(dfs,二分)
题目链接思路:dfs+二分遍历整个字符串,然后每次都跑整个区间来判断需要改变的字母的多少,取最小值。代码:#include<bits/stdc++.h>using namespace std;#define int long long#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);const int N=2e5+7;const double eps=1e-8;const int mod=1e9+7;原创 2020-07-19 23:05:38 · 162 阅读 · 0 评论 -
Codeforces Round #654 (Div. 2)-E1. Asterism(二分,思维)
题目链接题意:假设你有x颗糖果,你面前有n个敌人,第i个敌人有a[i]颗糖果,你可以选择对战的顺序,如果你手里的糖果不比敌人少,那么你胜利并获得一颗糖果,现在我们定义f(x)为你手里有x颗糖果时,你能打败所有对手的方案数,对于给定质数p,如果f(x)与p互质,那么这个x就是符合要求的,现在给定n,p和a[i],问你有多少个x符合条件,并且输出这些x。思路:首先我们要判断x的范围,如果x是>=2000的数,那么所有的敌人他可以随意挑战,f(x)和p肯定不会互质,所以x<=2000,而我们确原创 2020-07-03 20:10:59 · 222 阅读 · 0 评论 -
POJ - 3579-Median(二分套娃)
题目链接题意:给你个数组,求这些数组所有数字之差的绝对值的中位数。数据范围:Xi ≤ 1,000,000,0003 ≤ N ≤ 1,00,000思路:数据很大,所以我们不能暴力hhh,这里要用到一个二分,首先将数组从小到大排序,这个中位数肯定在1到a[n]之间,所以我们首先在1~a[n]之间进行二分查找,那么我们如何判断区间左移还是右移呢?首先我们用小学知识可以计算出差值一共有n*(n-1)/2个,所以如果我们让原数组中的每个数都加上这个中位数,再和其他数相比较,比他大或比他小的数在所有数中应原创 2020-06-07 12:03:40 · 241 阅读 · 0 评论 -
洛谷-AT2827最长上升子序列(dp)
题目链接题意:给定一长度为n的数列,请在不改变原数列顺序的前提下,从中随机的取出一定数量的整数,并使这些整数构成单调上升序列。 输出这类单调上升序列的最大长度。数据范围:1<=n<=1000001<=n<=100000思路:dp代码:正常求LIS的方法应该下面这种:#include<bits/stdc++.h>using namespace std;#define int long long#define IOS ios::sync_with_st原创 2020-05-30 20:48:32 · 428 阅读 · 0 评论 -
Codeforces Round #645 (Div. 2)-D. The Best Vacation(思维,二分,lower_bound,upper_bound)
题目链接题意:我们假设每年有n个月,每个月有a[i]天,你可以连续的拜访你的朋友x天(x<n)以获得开心值,每天所能获得的开心值是该天在这个月中的第几天,求你能够获得的最大开心值是多少。思路:因为开心值是在一个月中顺序递增,那么我们拜访的这些天应该以一个月末结尾,所以我们将两年合并起来(可能会出现本年年末加上次年年尾的情况),枚举每个月的月末,然后二分查找前第x天的日期,最后计算出这x天内的开心值,最后与最大值比较即可,中间利用前缀和思想来减少重复计算。知识点:lower_bound( b原创 2020-05-28 18:53:04 · 343 阅读 · 0 评论 -
Codeforces #642 D. Constructing the Array(dfs,二分)
题目链接题意:给你一个全为零的数组,执行n次操作,第i次操作为:选取一个最大的全为零的子区间(相同长度时取左),将该区间的中间位置的数字变为i,问n次操作后的数组会变成什么样子。思路:取中间值然后每次缩小一半,很明显有二分的性质,所以我们用dfs来二分搜索该数组,搜索时用pair记录子区间长度和中间值,然后将按照搜索的子区间的长度排序,排序后的第i个就是第i次操作的位置,然后将位置不变填入i,然后输出。代码:#include<bits/stdc++.h>using namespac原创 2020-05-15 20:46:44 · 177 阅读 · 0 评论