题目链接:http://codeforces.com/contest/808/problem/D

题意:有一串长度为n的数组,要求选择一个数字交换它的位置使得这串数能够分成两串连续的和一样的数组。

这个数还可以和自己交换位置。

题解:很显然求一下前缀二分每个数看一下能否插入,再求一下后缀二分每个数看一下能否插入。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int M = 1e5 + 10;
ll a[M] , be[M] , af[M];
bool binsearch(int l , int r , ll sum , ll gg[] , int pos) {
int mid = (l + r) >> 1;
while(l <= r) {
mid = (l + r) >> 1;
if(gg[mid] == sum) {
if(pos == mid) return false;
else return true;
}
if(gg[mid] > sum) r = mid - 1;
if(gg[mid] < sum) l = mid + 1;
}
return false;
}
bool binsearch2(int l , int r , ll sum , ll gg[] , int pos) {
int mid = (l + r) >> 1;
while(l <= r) {
mid = (l + r) >> 1;
if(gg[mid] == sum) {
if(pos == mid) return false;
else return true;
}
if(gg[mid] > sum) l = mid + 1;
if(gg[mid] < sum) r = mid - 1;
}
return false;
}
int main() {
int t;
scanf("%d" , &t);
for(int i = 1 ; i <= t ; i++) {
scanf("%lld" , &a[i]);
}
ll sum = 0;
for(int i = 1 ; i <= t ; i++) {
sum += a[i];
}
if(sum % 2 != 0) {
printf("NO\n");
}
else {
be[0] = 0;
for(int i = 1 ; i <= t ; i++) {
be[i] = be[i - 1] + a[i];
}
af[t + 1] = 0;
for(int i = t ; i >= 1 ; i--) {
af[i] = af[i + 1] + a[i];
}
ll aim = sum / 2;
int flag = 0;
for(int i = 1 ; i <= t ; i++) {
if(be[i] == aim) {flag = 1; break;}
}
for(int i = 1 ; i <= t ; i++) {
if(flag) break;
bool temp = binsearch(0 , i , aim - a[i] , be , i);
if(temp) {flag = 1; break;}
temp = binsearch2(i , t + 1 , aim - a[i] , af , i);
if(temp) {flag = 1; break;}
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}

codeforces 808 D. Array Division(二分)的更多相关文章

  1. Educational Codeforces Round 21 D.Array Division(二分)

    D. Array Division time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  2. Codeforces 482B Interesting Array(线段树)

    题目链接:Codeforces 482B Interesting Array 题目大意:给定一个长度为N的数组,如今有M个限制,每一个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是 ...

  3. Codeforces 1077C Good Array 坑 C

    Codeforces 1077C Good Array https://vjudge.net/problem/CodeForces-1077C 题目: Let's call an array good ...

  4. Array Division 808D

    D. Array Division time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  5. codeforces 482B. Interesting Array【线段树区间更新】

    题目:codeforces 482B. Interesting Array 题意:给你一个值n和m中操作,每种操作就是三个数 l ,r,val. 就是区间l---r上的与的值为val,最后问你原来的数 ...

  6. codeforces 407C Curious Array

    codeforces 407C Curious Array UPD: 我觉得这个做法比较好理解啊 参考题解:https://www.cnblogs.com/ChopsticksAN/p/4908377 ...

  7. codeforces 797 E. Array Queries【dp,暴力】

    题目链接:codeforces 797 E. Array Queries   题意:给你一个长度为n的数组a,和q个询问,每次询问为(p,k),相应的把p转换为p+a[p]+k,直到p > n为 ...

  8. Educational Codeforces Round 21 D - Array Division (前缀和+二分)

    传送门 题意 将n个数划分为两块,最多改变一个数的位置, 问能否使两块和相等 分析 因为我们最多只能移动一个数x,那么要么将该数往前移动,要么往后移动,一开始处理不需要移动的情况 那么遍历sum[i] ...

  9. codeforces 808 E. Selling Souvenirs (dp+二分+思维)

    题目链接:http://codeforces.com/contest/808/problem/E 题意:最多有100000个物品最大能放下300000的背包,每个物品都有权值和重量,为能够带的最大权值 ...

随机推荐

  1. Scala的常用小技巧

    1."RichString.java".stripSuffix(".java") == "RichString" "http:// ...

  2. JVM(二):画骨

    ### 概述 我们首先来认识一下`JVM`的运行时数据区域,如果说`JVM`是一个人,那么运行时数据区域就是这个人的骨架,它支撑着JVM的运行,所以我们先来学习一下运行时数据区域的分类和简单介绍. # ...

  3. 爬虫获取搜狐汽车的配置信息 和swf动态图表的销量数据-------详细教学

    前情提要:需要爬取搜狐汽车的所有配置信息,具体配置对应的参数. 以及在动态图表上的历史销量. 比如: 一汽奥迪旗下Q5L 的<40 TFSI 荣享进取型 国VI >的历史销量和该配置的参数 ...

  4. abc -- 牛客

    题目描述 设a.b.c均是0到9之间的数字,abc.bcc是两个三位数,且有:abc+bcc=532.求满足条件的所有a.b.c的值. 输入描述: 题目没有任何输入. 输出描述: 请输出所有满足题目条 ...

  5. String与new String()的区别

    JVM为了提升性能和减少内存开销,避免字符串的重复创建,维护了一块特殊的内存空间——字符串实例池. String赋值的两种方式. 1.String str = "test"; 以这 ...

  6. (二十一)c#Winform自定义控件-气泡提示

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  7. centos7单机安装kafka,进行生产者消费者测试

    [转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11364852.html   作者:jstarseven    码字挺辛苦的.....  一.k ...

  8. 8.8 day29 异常处理 UDP通信

    异常处理 什么是异常? ​ 程序在运行过程中出现了不可预知的错误 ​ 并且该错误没有对应的处理机制,那么就会以异常的形式表现出来 ​ 造成的影响就是整个程序无法运行 异常的结构 ​ 1.异常的类型 ​ ...

  9. 在使用Lists.transform时,不会直接生成PurchaseOrderVo的集合对象,而是生成一个Function的集合

    但是在使用Lists.transform时,不会直接生成PurchaseOrderVo的集合对象,而是生成一个Function的集合,在循环的时候,会去调用apply 生成一个PurchaseOrde ...

  10. Tomcat源码分析 (八)----- HTTP请求处理过程(一)

    终于进行到Connector的分析阶段了,这也是Tomcat里面最复杂的一块功能了.Connector中文名为连接器,既然是连接器,它肯定会连接某些东西,连接些什么呢? Connector用于接受请求 ...