codeforces D. Array Division
俺这题写得好傻逼q..qaq...>_<
第一个点是,想法是如果存在一个ai,往前移动后存在解,假设插入的地方是sum[ans]
那么应该有 sum[ans]+ai==tot-sum[ans]-ai
整理一下得到 sum[ans]*2+2*ai==tot;
如果ai移到的是后面,也同理
得到2*sum[ans]-2*a[i]==tot
枚举ai,然后二分找一下这样的sum[ans]存不存在就好
..but!
在写公式的时候我没有判断ans<i或者ans>i(必须这样,否则情况其实是非法的)
然后就被一组大数据卡住了,并且自己 死 活 找 不 出 bug
请好好写好条件、。
然后当然也不能ans==i 啦,否则会多加,少加什么的。
#学长说我写代码的逻辑还不够好,问就是bugde得不够多,代码写得不够多,下手后想得不够清楚,唔,加油加油(^ ^ )
#include<bits/stdc++.h> using namespace std; long long sum[int(1e5)+7],a[int(1e5)+7]; int main() { //freopen("lys.in","r",stdin); int n; cin>>n; sum[0]=0; long long tot=0; for(int i=1;i<=n;i++) { cin>>a[i];sum[i]=sum[i-1]+a[i]; tot+=a[i]; } if(n==1) { cout<<"NO";return 0; } if(tot%2==1) { cout<<"NO";return 0; } long long d=tot/2; for(int i=1;i<=n;i++) { if(sum[i]==tot/2) { cout<<"YES"<<endl; return 0; } int l=1,r=n,ans; while(l<=r){ int mid=(l+r)/2; if(2*sum[mid]+2*a[i]>=tot) { r=mid-1; ans=mid; } else l=mid+1; } if(2*sum[ans]+2*a[i]==tot&&i>ans) { cout<<"YES"<<endl; return 0; } l=1;r=n; while(l<=r){ int mid=(l+r)/2; if(2*sum[mid]-2*a[i]>=tot) { ans=mid; r=mid-1; } else l=mid+1; } if(2*sum[ans]-2*a[i]==tot&&i<ans) { cout<<"YES"; return 0; } } cout<<"NO"; return 0; }