我正在编写一段代码,我必须执行2的除法。下面的代码行给出了正确的输出
ans = ans + ((long long)cnt * (cnt-1))/2;
然而,当我将其更改为
时ans = ans + ((long long)cnt * (cnt-1)) >> 1;
上面的代码有什么问题
在我的设置中,值永远不会为负
这是代码
#include<bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);
using namespace std;
int s[1000000];
int main(){_
int t;
cin>>t;
while(t--){
int n,i,z,sum=0,p,cnt=0;
unsigned long long int ans=0;
cin>>n;
for(i=0;i<n;i++){
cin>>z;
sum+=z;
s[i]=sum;
}
sort(s,s+n);
i=0;
while(i<n){
p=s[i];
cnt=0;
while(s[i]==p){
cnt++;
i++;
}
ans=ans+((unsigned long long)cnt*(cnt-1))>>1;
}
cnt=0;
for(int i=0;i<n && s[i]<=0;i++){
if(s[i]==0){
cnt++;
}
}
ans+=cnt;
cout<<ans<<"\n";
}
return 0;
}
输入 1 4 0 1 -1 0
输出为4但是应该是6
此外,代码为高输入提供了Sigsegv错误
1·; = T&LT; = 5
1·; = N&LT = 10 ^ 6
-10&lt; = z&lt; = 10
答案 0 :(得分:6)
运营商>>
的{{3}}不是+
(当然还有/
),因此你写的相当于:
ans = ( ans + ((long long)cnt * (cnt-1)) ) >> 1;
// ^--- note these -------------------^
答案 1 :(得分:1)
对于sigsegv问题,我猜这是i
索引在内循环中某些条件下运行超过s[]
数组末尾的结果:
while(i<n){
p=s[i];
cnt=0;
while(s[i]==p){
cnt++;
i++; // <== I'm not convinced this will always remain less than n
// or less than 1000000 depending on the data set and
// what happens to be in memory after `s[]`
}
ans=ans+((unsigned long long)cnt*(cnt-1))>>1;
}