@[shawn3003](/user/401479) @[Caiest_Oier](/user/932169) @[rickyxrc](/user/387961) @[tangweichuan](/user/389737) @[__immccn123__](/user/385633)
by _Mikasa @ 2023-02-27 14:53:35
@[Naruto_](/user/400245) 建议里层循环使用二分来找而不是循环
by Caiest_Oier @ 2023-02-27 15:02:35
@[刘辰雨](/user/524906)
by _Mikasa @ 2023-02-27 15:03:07
@[Naruto_](/user/400245)
```cpp
#include<bits/stdc++.h>
using namespace std;
long long n,a[10000001],pre[10000001],l,r,mid;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
a[i]=i;
}
for(int i=1;i<=n;i++){
pre[i]=a[i]+pre[i-1];
}
for(int i=1;i<=n/2;i++){
l=i+1;
r=n;
while(l<r){
mid=((l+r)>>1);
if(abs(pre[mid]-pre[i-1])==n){
l=mid;
r=mid;
break;
}
if(abs(pre[mid]-pre[i-1])>n){
r=mid-1;
}
else l=mid+1;
}
if(abs(pre[l]-pre[i-1])==n)printf("%lld %lld\n",i,l);
}
return 0;
}
```
AC
by Caiest_Oier @ 2023-02-27 15:07:05
怎么不@我大号直接找小号了?
by Caiest_Oier @ 2023-02-27 15:08:05
@[Caiest_Oier](/user/932169) 有没有用循环的方法
by _Mikasa @ 2023-02-27 15:12:38
@[Naruto_](/user/400245) 有,只用外面一层循环,里面用二次方程求根公式找另一端
by Caiest_Oier @ 2023-02-27 15:15:10
@[Naruto_](/user/400245) 或者也可以用尺取法,随着左端点的增大不断缩小长度,两个做法都是O(n)的
by Caiest_Oier @ 2023-02-27 15:15:57
@[Caiest_Oier](/user/932169) 如果必须用前缀和呢
by _Mikasa @ 2023-02-27 15:23:23
@[Naruto_](/user/400245) 用尺取,尺取要用前缀和
by Caiest_Oier @ 2023-02-27 15:30:26