连云港公司网站建设,做网站编辑大专可以吗,宜宾市珙县住房城乡建设网站,网站做seo外链刷点题~
1.二分多路归并算法 对于每一个技能#xff0c;我们把它看成一个等差数列#xff0c;我们把所有可能都放到一个集合里#xff0c;排个序#xff0c;取前m个大即可#xff0c;现在考虑优化#xff0c;假如m不是很大#xff0c;我们直接用优先队列即可#xff0…刷点题~
1.二分多路归并算法 对于每一个技能我们把它看成一个等差数列我们把所有可能都放到一个集合里排个序取前m个大即可现在考虑优化假如m不是很大我们直接用优先队列即可但是这里m很大于是我们考虑二分我们二分一下第m位选什么-x那么大于X的m个大于x的m个这里x就有二分性质当我们确定x那么对于每一个等差数列我们可以用O(1)求出来因此复杂度为nlogn。
下面是AC代码
#includebits/stdc.h
using namespace std;
typedef long long LL;
const int N100010;
int n,m;
int a[N],b[N];
bool check(int mid){LL res0;for(int i0;in;i){if(a[i]mid) res(a[i]-mid)/b[i]1;}return resm;
}
int main(){cinnm;for(int i0;in;i) scanf(%d%d,a[i],b[i]);int l0,r1e6;while(lr){int mid(lr1)/2;if(check(mid)) lmid;else rmid-1;}LL res0;LL cnt0;for(int i0;in;i){if(a[i]r){int c(a[i]-r)/b[i]1;int enda[i]-(c-1)*b[i];cntc;//cnt计算了重复的当它m时减去多的Rres(LL)(a[i]end)*c/2;}}coutres-(cnt-m)*r;
}
2. 对于每一个数据我们求出来满足[A/V](下取整B的v的范围然后取交集即可。
我们考虑一下A/V与V的函数图像 因此就可以二分了vminA/VB的最小的VvmaxA/VB-1的最小的V-1当然不用二分用公式也可
下面是公式
A/V在【B,B1内转一下可得V为【A/B,A/(B1))即可。
3.前缀和 我们看最终情况它是中间一段是画的旁边两端是被摧毁的画的长度是n/2的上取整事实上我们可以取到任意的该长度的区间如何证明
首先我们任取该长度的区间我们大致做一下对称 先看看奇数长度对于第一步我们先话中间空余的以后哪一端是要坏的我们选那一段这样子就可以了。
对于偶数长度第一步任取接下来跟奇数一样即可。
因此问题就是求某一区间的最大和这个用前缀和即可