这道模拟题出的我毫无脾气2333

最重要的是先要发现操作顺序不影响最后的答案,也就是每次随便挑一个>=2的数进行操作最后总是可以得到同样的数列。

(这个还不太难想qwq)

但是最骚的是接下来的模拟。。。。

我们考虑从左到右消,假设目前在i,1~i-1的已经都消成了0或1。

可以发现无非就是一下几种情况:

1.a[i]<2,不用管它

2.i==1,那么就 a[i+1]+=a[i]/2, a[i] &=1.

3.左边都是1,这样的话推一推会发现,可以将一轮视为 a[1] = 0,a[i]-- ,a[i+1]++

4.左边是1,推一推会发现这样相当于让 最近的一个0右移一位,然后a[i]--, a[i+1]++

5.左边是0,直接算,a[i-1]++,a[i]-=2,a[i+1]++,会减少一个0位置

如果我们用一个栈记录一下从左到右0的位置,那么就可以很方面的做上面的操作了。

接下来是非常炫酷的复杂度分析!

1操作的复杂度是O(N);

2操作的复杂度是 O(1);

3操作的最多次数不到初始所有a[]的和(因为每操作一次总和就--);

4操作可以优化成一次位移最大(也就是要么把a[i]减成<2的,要么把0移到i-1),如果移到i-1然后再结合5操作的话它的次数 = 5操作的次数;否则因为a[i]<1了,扫描线会右移。所以这一部分的总次数 <= 2*n + 3操作的次数。

5操作每次会让栈的大小-1,所以最多次数 <= 3操作的次数 + n。

于是这个算法的复杂度是O(N) 的(并且算复杂度很多地方都是取的极限的情况,所以实际跑起来飞快),非常的优秀 (雾

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=20000005;int a[N],n,s[N],tp;
char S[N];int main(){freopen("simulate.in","r",stdin);freopen("simulate.out","w",stdout);scanf("%s",S+1),n=strlen(S+1);for(int i=1;i<=n;i++) a[i]=S[i]-'0';if(a[1]>=2) a[2]+=a[1]>>1,a[1]&=1;if(!a[1]) s[++tp]=1;for(int i=2,L;i<=n;i++){while(a[i]>=2)if(!tp) a[i+1]++,a[i]--,s[++tp]=1,a[1]=0;else if(s[tp]==i-1) a[i]-=2,a[s[tp]]=1,tp--,a[i+1]++;else{L=i-s[tp]-1;if(a[i]<=L) a[i+1]+=a[i]-1,a[s[tp]]=1,s[tp]+=a[i]-1,a[s[tp]]=0,a[i]=1;else a[i+1]+=L,a[s[tp]]=1,s[tp]+=L,a[s[tp]]=0,a[i]-=L;}if(!a[i]) s[++tp]=i;}for(int i=1;i<=n;i++) putchar(a[i]+'0');return 0;
}

  

转载于:https://www.cnblogs.com/JYYHH/p/9244562.html

[2018湖南省队集训] 6.28 T3 simulate相关推荐

  1. 2017FJ省队集训 游记

    2017FJ省队集训 游记 又是一篇流水账 Day 1 今天是省队集训的第一天.早上骑车去八中,到的时候汗流太多浑身湿透被杨哥哥和runzhe2000 d了,一个说我去游泳了一个说我打球了...流完汗 ...

  2. [2018HN省队集训D8T1] 杀毒软件

    [2018HN省队集训D8T1] 杀毒软件 题意 给定一个 \(m\) 个01串的字典以及一个长度为 \(n\) 的 01? 序列. 对这个序列进行 \(q\) 次操作, 修改某个位置的字符情况以及查 ...

  3. 2018第一次校队集训题解

    问题 A: 豆豆强的蛋糕店 时间限制: 1 Sec  内存限制: 128 MB 提交: 29  解决: 3 [提交] [状态] [讨论版] [命题人:外部导入] [Edit] [TestData] 题 ...

  4. 湖南省第十届蓝狐网络杯大学生计算机程序设计竞赛,2018湖南省第14届大学生计算机程序设计竞赛 C: 时间旅行...

    Description 假设 Bobo 位于时间轴(数轴)上 t0 点,他要使用时间机器回到区间 (0, h] 中. 当 Bobo 位于时间轴上 t 点,同时时间机器有 c 单位燃料时,他可以选择一个 ...

  5. 2018纪中集训游记

    DAY  0 从家出发的时候,阴天了,开始祈祷不要下雨(之后貌似起飞的时候下了大雨,不过当时在云层里只感觉到了一丢丢颠簸?) 飞机给咕咕了半个小时,期间一直在被老头子呵斥不要奶飞机,我一直在叨叨:飞机 ...

  6. FJ省队集训DAY4 T1

    直接上题解 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstr ...

  7. FJ省队集训DAY5 T1

    思路:考试的时候打了LCT,自以为能过,没想到只能过80.. 考完一想:lct的做法点数是100W,就算是nlogn也会T. 讲一下lct的做法把:首先如果一条边连接的两个点都在同一个联通块内,那么这 ...

  8. FJ省队集训DAY3 T1

    思路:我们考虑如果取掉一个部分,那么能影响到最优解的只有离它最近的那两个部分. 因此我们考虑堆维护最小的部分,离散化离散掉区间,然后用线段树维护区间有没有雪,最后用平衡树在线段的左右端点上面维护最小的 ...

  9. 省队集训Day3 tree

    [题目描述] RHL 有一天看到 lmc 在玩一个游戏. "愚蠢的人类哟,what are you doing",RHL 说. "我在玩一个游戏.现在这里有一个有 n 个 ...

最新文章

  1. 句法分析语料:哈尔滨工业大学SemEval、清华大学树库
  2. MySQL中购买的语句,mysql操作语句 - 买灰机自己开的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. hdu 2612(bfs)Find a way
  4. MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等
  5. 使用Maven Archetype生成工程报错的解决
  6. oracle数据库disable,Disable/Enable Oracle Database Vault
  7. VC++多线程工作笔记0001---认识与创建线程
  8. [读书笔记]读《Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法》(一)...
  9. 留存: struts2+jquery+json集成
  10. 千万58招聘人员的选择值得信赖-米苏 58自动循环发帖器
  11. 精心整理Node.js入门---原理篇
  12. Jenkins教程(Windows版)
  13. winpe加载raid_在winpe里添加raid驱动
  14. OPPO开放平台移动应用认领
  15. MacBook常用快捷键总结
  16. html5关键语句,怎样把握文中的关键语句
  17. Cobbler实现系统自动安装和cobbler的web管理实现
  18. 【电脑使用】修改注册表——让有密码的电脑开机自动登录
  19. App开发者必备的运营、原型、UI设计工具整理
  20. 小程序导出数据到excel表,借助云开发后台实现excel数据的保存

热门文章

  1. sklearn——决策树
  2. redis rdb aof区别_Redis 持久化之 RDB 与 AOF 详解
  3. 不动产中心考试计算机测试题,2005年全国计算机二级考试VFP笔试模拟题
  4. 搞懂DEtection TRanformer(DETR)
  5. 基于哈希表的索引堆变形(Hackerrank: QHEAP1)
  6. LeetCode 1175. 质数排列
  7. oss图片跨域问题_图片存储解决方案-阿里云对象存储
  8. java使用原生语句操作mongo_Java 中 MongoDB 使用指南
  9. scrapy使用代理报错keyerror: proxy_爬虫Scrapy框架-Crawlspider链接提取器与规则解析器...
  10. asp.net接受表单验证格式后再提交数据_如何解析 el-form-renderer 表单渲染器1.14.0...