- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
反馈题解问题
解题思路
题目要求我们求出下标对?(i,j)?使得ai+aj∈[L,R]?的下标对数量。根据简单的容斥原理可知,设ai+aj≤R?的下标对数量为?y,ai+aj≤L?1?的下标对数量为?xx,则ai+aj∈[L,R]?的下标对数量为?y?x。
问题转化为对于一个给定的数?Z,我们如何求出a?中满足?ai+aj≤Z?的下标对数量。为了解决这个问题,我们可以首先对数组?aa?进行排序。排序后,我们可以使用双指针技巧来遍历数组,并计算满足条件的下标对数量。我们定义两个指针?l和?r,分别表示数组a?中的左右元素下标。初始时,l=1,r=n。
接下来,我们进行如下操作:
如果?a[l]+a[r]Z,说明当前下标对不满足条件,我们需要减小?ai+aj?的值,而数组已经有序,所以我们将?r减一,即?r??。
如果a[l]+a[r]≤Z,说明当前下标对以及之后的所有下标对都满足条件。我们需要计算满足条件的下标对数量,可以通过?r-lr?l?计算。然后我们将?ll?加一,即?l++l++。
我们重复以上操作,直至?lr?不再成立。这样我们就找到了所有满足?ai+aj≤Z?的下标对数量。
时间复杂度:排序的复杂度为?)O(nlogn),双指针的复杂度为?O(n),即整体的复杂度为O(nlogn)。
AC_Code
C++
#includebits/stdc++.h
usingnamespacestd;
typedeflonglongLL;
typedefunsignedlonglonguLL;
typedefpairint,intPII;
#definepb(s)push_back(s)
#definesz(s)((int)s.size())
#definexfirst
#defineysecond
#definems(s,x)memset(s,x,sizeof(s))
#defineall(s)s.begin(),s.end()
constintinf=0x3f3f3f3f;
constintmod=1000000007;
constintN=200010;
intn,L,R;
inta[N];
LLcalc(intv){
intl=1,r=n;
LLans=0;
while(lr){
while(lra[l]+a[r]v){
r--;
}
ans+=r-l;
l++;
}
returnans;
}
voidsolve()
{
cinnLR;
for(inti=1;i=n;++i)cina[i];
sort(a+1,a+n+1);
coutcalc(R)-calc(L-1)\n;
}
intmain()
{
ios_base::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
coutsetiosflags(ios::fixed)setprecision(2);
intt=1;
while(t--)
{
solve();
}
return0;
}
Java
importjava.util.*;
publicclassMain{
staticintN=200010;
staticintn,L,R;
staticint[]a=newint[N];
staticScannersc=newScanner(System.in);
staticlongcalc(intv){
intl=1,r=n;
longans=0;
while(lr){
while(lra[l]+a[r]v){
r--;
}
ans+=r-l;
l++;
}
returnans;
}
staticvoidsolve(){
n=sc.nextI
文档评论(0)