博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 257D
阅读量:4311 次
发布时间:2019-06-06

本文共 1173 字,大约阅读时间需要 3 分钟。

题意略。

思路:这个题目最重要的是那个不等式 a[i] <= a[i+1] <= 2 * a[i]  ,你会发现0 <= a[i+1]  -  a[i] <= a[i],令x = a[i+1] - a[i],那么对于a[i-1]来说,

当x = 0时,abs(x - a[i-1])== a[i - 1];当x = a[i]时,abs(x - a[i - 1])== a[i - 1]。也就是说,abs(x - a[i - 1]) <= a[i - 1]。

从n到1来遍历,我们总是令x = abs(x - a[i - 1]),到最后,0 <= abs(x - a[1]) <= a[1]也就自然满足了。

当x >= a[i - 1]时,我们应该在a[i - 1]前加 '-';反之,我们应该在x前加 '-'。

这个加'-'的过程,我开始是用树状数组区间修改点查询做的,后来发现TLE。由于加 '-' 是对后面整体和个体加的,我们可以开两个数组,一个记录单点,

一个记录整体,到时候遍历就可以达到O(n)的复杂度了。

详见代码:

#include
#define maxn 100050using namespace std;typedef long long LL;LL a[maxn];int mark[maxn],t[maxn],n;int main(){ scanf("%d",&n); for(int i = 1;i <= n;++i) scanf("%lld",&a[i]); LL x = a[n] - a[n - 1]; mark[n - 1] = -1; for(int i = n - 2;i >= 1;--i){ if(x < a[i]){ x = a[i] - x; t[i + 1] = 1; } else{ x -= a[i]; mark[i] = -1; } } int sum = 0; for(int i = 1;i <= n;++i){ int temp; sum += t[i]; temp = sum + mark[i]; if(temp < 0) temp = 1; printf("%c",(temp & 1) ? '-' : '+'); } printf("\n"); return 0;}

 

转载于:https://www.cnblogs.com/tiberius/p/8504533.html

你可能感兴趣的文章
cocos2dx 3.1从零学习(二)——菜单、场景切换、场景传值
查看>>
百度编辑器动态添加内容及防止过滤样式或其他属性解决办法
查看>>
作业二(1)
查看>>
[原]使用MachOView辅助破解AppStore应用
查看>>
【学习笔记】分类模型的评估
查看>>
使用notepad++远程编辑Linux文档
查看>>
iOS - Actions and Outlets
查看>>
mysql 查询开销
查看>>
notepad++列模式
查看>>
[ios基础]IOS应用程序的生命周期问题
查看>>
python 之tornado 入门
查看>>
U3D的控制
查看>>
js浮点乘除法运算不精确bug
查看>>
成为java高手的25个目标
查看>>
200道物理学难题——001 三只蜗牛
查看>>
构建App首页
查看>>
BZOJ1443: [JSOI2009]游戏Game
查看>>
zookeeper客户端Watcher管理
查看>>
第二代蜂窝移动通信系统概述
查看>>
[转载] IOS 自动布局--先进的自动布局工具箱
查看>>