ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

牛客练习赛15 C.吉姆的奇思妙想(化简二分+溢出处理)

2020-12-13 22:59:42  阅读:258  来源: 互联网

标签:化简 练习赛 pred ll long 奇思妙想 maxn freq deg


传送门

E i = a i ∗ ∑ 1 < = j < = n & & d e g j < = s ( d e g j 2 ∗ f r e j ) + b i ∗ ∑ 1 < = j < = n & & d e g j > s M ∗ f r e j = ∑ 1 < = j < = n & & d e g j < = s ( ( a i ∗ d e g j 2 − b i ∗ M ) ∗ f r e j ) + ∑ 1 < = j < = n b i ∗ M ∗ f r e j E_i=a_i*\sum\limits_{1<=j<=n\&\&deg_j<=s}(deg_j^2*fre_j)+b_i*\sum\limits_{1<=j<=n\&\&deg_j>s}M*fre_j\\ =\sum\limits_{1<=j<=n\&\&deg_j<=s}((a_i*deg_j^2-b_i*M)*fre_j)+\sum\limits_{1<=j<=n}b_i*M*fre_j\\ Ei​=ai​∗1<=j<=n&&degj​<=s∑​(degj2​∗frej​)+bi​∗1<=j<=n&&degj​>s∑​M∗frej​=1<=j<=n&&degj​<=s∑​((ai​∗degj2​−bi​∗M)∗frej​)+1<=j<=n∑​bi​∗M∗frej​

注意到 ∑ 1 < = j < = n b i ∗ M ∗ f r e j \sum\limits_{1<=j<=n}b_i*M*fre_j 1<=j<=n∑​bi​∗M∗frej​其实是个常数

而 a i ∗ d e g j 2 − b i ∗ M a_i*deg_j^2-b_i*M ai​∗degj2​−bi​∗M随时 j j j的增大而增大

所以只需要把所有令 a i ∗ d e g j 2 − b i ∗ M a_i*deg_j^2-b_i*M ai​∗degj2​−bi​∗M小于零的项找出来即可

找出这个最大的 j j j即可

话是这么说,但做的过程中千万小心爆掉long long

我用的是unsigned long long

所以判断负数只是比较大小关系,这样比较保险

非常坑

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const ll maxn = 2e5+10;
ll m,l,deg[maxn],freq[maxn],pref[maxn],pred[maxn],sqrd[maxn];
int main()
{
	scanf("%llu%llu",&m,&l);
	for(int i=1;i<=l;i++)
	{
		scanf("%llu%llu",&deg[i],&freq[i] );
		pred[i] = pred[i-1]+deg[i]*deg[i]*freq[i];
		sqrd[i] = deg[i]*deg[i];
		pref[i] = pref[i-1]+freq[i];
	}
	int q; cin >> q;
	while( q-- )
	{
		ll a,b; cin >> a >> b;
		ll L = 1, R = l, ans = 0;
		while( R>=L )
		{
			ll mid = L+R>>1;
			if( a*sqrd[mid]<b*m )	L = mid+1,ans = mid;
			else	R = mid-1;
		}
		cout << a*pred[ans]+b*( pref[l]-pref[ans] )*m << endl;
	}
}

标签:化简,练习赛,pred,ll,long,奇思妙想,maxn,freq,deg
来源: https://blog.csdn.net/jziwjxjd/article/details/111146251

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有