[2018湖南省队集训] 6.28 T3 simulate

这道模拟题出的我毫无脾气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;
}
[2018湖南省队集训] 6.28 T3 simulate的更多相关文章
- [2018湖南省队集训] 6.28 T2 color
毒瘤计数题2333,(小声)k其实可以出到1e9,不过这样求组合数的时候就要记1000种数的1~1000次下降幂(用到的组合数中第一维在1e9级别的只有1000种左右,第二维都是<=1000), ...
- [2018湖南省队集训] 6.24 T1 marshland
题面在这里! 一开始感觉像一个类似二分图的最小割,于是成功跑偏2333333 很容易发现一个关键性质,'L'的两个角落在的偶数格 的行(或者列)的奇偶性一定不同.... 于是我们再把偶数格按照行(或者 ...
- 【考试记录】2018 山东省队集训第一轮D4(雾)
T1题意: 给你一个$n\times m$的矩阵$B$,求它能由最少多少个形如两个向量之积$(n\times 1)\times(1\times m)$的矩阵相加得到. 题解: 考虑上界,最多需要$mi ...
- FJ省队集训最终测试 T3
思路:状态压缩dp,f[i][j[[k]代表i行j列这个格子,连续的状态为k,这个连续的状态是什么?就是下图 X格子代表我当前走到的地方,而这里的状态就是红色部分,也就是连续的一段n的状态,我们是分每 ...
- 湖南省队集训 Day 2
从这里开始 Problem A 走路 Problem B 游戏 Problem C 有趣的字符串题 暴力分又没骗满sad..... Problem A 走路 $O(n^2)$动态规划是显然的. 更新方 ...
- 【欧拉回路+最小生成树】SD开车@山东2018省队一轮集训day1
目录 [欧拉回路+最小生成树]SD开车@山东2018省队一轮集训day1 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE [欧拉回路+最小生成树]SD开车@ ...
- HN2018省队集训
HN2018省队集训 Day1 今天的题目来自于雅礼的高二学长\(dy0607\). 压缩包下载 密码: 27n7 流水账 震惊!穿着该校校服竟然在四大名校畅通无阻?霸主地位已定? \(7:10\)从 ...
- JS省队集训记
不知不觉省队集训已经结束,离noi也越来越近了呢 论考前实战训练的重要性,让我随便总结一下这几天的考试 Day 1 T1 唉,感觉跟xj测试很像啊?meet in middle,不过这种题不多测是什么 ...
- 2018HN省队集训
HNOI2018省队集训 Day 1 流水账 T1 tree 换根+求\(lca\)+求子树和,一脸bzoj3083遥远的国度的既视感.子树和讨论一下就好了,\(lca\)?也是大力讨论一波. 先写了 ...
随机推荐
- SCU 1029 Humble Numbers (打表处理)
题目链接 题意:素因子中只有2 3 5 7的数称为谦逊的数,1也是谦逊的数,题目中已经给出了前20个谦逊的数.给定数字n,按格式输出第n个谦逊的数. 题解:打表即可,注意打表的技巧就行了. ps:这道 ...
- 两小时快速构建微信小程序
小程序在2017年1月上线之初,被社会极力吹捧,刻意去将其制造为一个“风口”,透支其价值.但是在之后一个月里,石破天惊迅速归为沉寂.媒体又开始过度消费小程序,大谈其鸡肋之处. 个人认为小程序的一个分水 ...
- 制作Solaris系统的USB启动盘
制作方法: 1. wget http://192.168.2.5/surefiler-installer/2011-12-09/devel-2011.12.9.tgz 2. cd /root tar ...
- lnmp、lamp、lnmpa一键安装包(Updated: 2016-4-12)
lnmp.lamp.lnmpa一键安装包(Updated: 2016-4-12) 文章目录 脚本特性 安装步骤 如何添加虚拟主机? 如何删除虚拟主机? 如何管理ftp账号? 数据备份 如何管理服务 ...
- linux安装(Ubuntu)——(二)
centos的安装参考: http://www.runoob.com/linux/linux-install.html Linux 安装(Ubuntu) 虚拟机:虚拟机(Virtual Machine ...
- Python学习笔记 - day14 - Celery异步任务
Celery概述 关于celery的定义,首先来看官方网站: Celery(芹菜) 是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具. 简单来看,是一个基于pyt ...
- Redis错误:jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set
原文链接:http://blog.csdn.net/rchm8519/article/details/48347797 redis.clients.util.Pool.getResource(Pool ...
- mui 选项卡与header文字同步
mui底部tab固定 头部nav可变 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- django “如何”系列5:如何编写自定义存储系统
如果你需要提供一个自定义的文件存储-一个常见的例子便是在远程系统上存储文件-你可以通过定义一个自己的存储类来做这件事情,你将通过一下步骤: 你自定义的存储系统一定是django.core.files. ...
- linux删除乱码文件[转载]
一些乱码文件不可以通过普通的rm命令进行管理.可以通过删除i节点的方式删除. [root@192_168_100_35 musicwap]# ls??,?K?k?ͨa*.?J]?k?Φ??P???Z? ...