求助七十分求调

P1147 连续自然数和

@[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


| 下一页