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;
}

 

posted @ 2022-07-18 16:07  liyishui  阅读(18)  评论(0编辑  收藏  举报