[cf1458D]Flip and Reverse
将$s$中的01分别变为$1,-1$,即得到一个序列$a_{i}$(设其长度为$n$,下标范围为$[1,n]$)
对$a_{i}$建立一张有向图,其点集合为$Z$,并对$\forall 0\le k<n$从$\sum_{i=1}^{k}a_{i}$向$\sum_{i=1}^{k+1}a_{i}$连边(允许重边),那么$a_{i}$即对应于其中一条以0为起点的欧拉路
若对区间$[l,r]$操作,记操作后的序列为$a'_{i}$,则有$\sum_{i=l}^{r}a_{i}=0(=\sum_{i=l}^{r}a'_{i})$且$\forall l\le i\le r,a'_{i}=-a_{r-(i-l)}$
根据此性质,简单来分析前缀和的变化:
1.对于$k\not\in [l,r),\sum_{i=1}^{k}a'_{i}=\sum_{i=1}^{k}a_{i}$
2.对于$k\in [l,r),\sum_{i=1}^{k}a'_{i}=\sum_{i=1}^{l-1}a_{i}-\sum_{i=l}^{k}a_{r-(i-l)}=\sum_{i=1}^{r-(k-l)-1}a_{i}$
进一步的,再来分析这条欧拉路的变化,结合前缀和的变化即是将原本从$\sum_{i=1}^{l-1}a_{i}$到$\sum_{i=1}^{r}a_{i}$这一个环(注意两值相同)反转(将所有边变为反向边)并倒序经过
另一方面,显然每一个环(包括非简单环)都可以以此法操作(注意这里的操作是对欧拉路)
换言之,问题即通过这样的操作最小化这条欧拉路的字典序
实际上,问题也可以看作:将图中的边看作无向边后,最小化以0为起点的欧拉路字典序
注意到操作只是反转边的方向,那么得到的欧拉路一定是新问题中的欧拉路
另一方面,即要通过这条欧拉路(通过操作)构造出所有新问题中的欧拉路
对其归纳,若其第一步与这条欧拉路方向不同,分类讨论:
1.若该边仅存在一条(指无向边),那么起点的另一个方向即必然不存在边(否则这不是欧拉路),进而显然方向不会不同
2.若该边存在多条,之后总有一次从该边返回起点,从最初到该位置全部反转后方向即相同
进一步的,将两者第一步均删除后即变为归纳的问题(边数减少),也即得证
而对于这个新问题,可以利用图的特殊性直接贪心:初始$x=0$,每一次优先向$x-1$移动(除非该边仅存在一条且$x$到$x+1$仍有边,此时向$x+1$移动),最终显然字典序最小
时间复杂度为$o(n)$,可以通过


1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 500005
4 int t,n,x,sum,cnt[N<<1];
5 char s[N];
6 int main(){
7 scanf("%d",&t);
8 while (t--){
9 scanf("%s",s+1);
10 n=strlen(s+1),x=sum=n;
11 for(int i=0;i<=(n<<1);i++)cnt[i]=0;
12 for(int i=1;i<=n;i++){
13 if (s[i]=='0')cnt[--sum]++;
14 else cnt[sum++]++;
15 }
16 for(int i=1;i<=n;i++){
17 if ((cnt[x-1]>1)||(!cnt[x])){
18 putchar('0');
19 cnt[--x]--;
20 }
21 else{
22 putchar('1');
23 cnt[x++]--;
24 }
25 }
26 putchar('\n');
27 }
28 return 0;
29 }
[cf1458D]Flip and Reverse的更多相关文章
- CF1458D Flip and Reverse[题解]
Flip and Reverse 题目大意 给定一个 \(01\) 字符串,有机会进行若干次操作,对于每一次操作: 选择该字符串的子串,要求是该子串内包含数量相同的 \(0\) , \(1\) 字符. ...
- 多校联训 DS 专题
CF1039D You Are Given a Tree 容易发现,当 \(k\) 不断增大时,答案不断减小,且 \(k\) 的答案不超过 \(\lfloor\frac {n}{k}\rfloor\) ...
- 小白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》连载四(场景切换)
作为一款真正有使用价值的应用,首先应该至少有两个页面,通过页面的切换来实现更多的交互.比如手机人人网,打开以后先是进入登录页面,登录后会有新鲜事,然后拉开左边的面板,能看到相册.悄悄话.应用之类的其他 ...
- bzoj 2631: tree 动态树+常数优化
2631: tree Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1716 Solved: 576[Submit][Status] Descrip ...
- 白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》串行4(场景变化)
作为一个真正的利用价格值应用,首先,你应该至少有两页,通过切换页面来实现很多其他互动.比如手机人人网,首先,打开后进入登录页面,将有登录后,新的东西.然后拉左侧面板.你可以看到相册.私人信息.像其他应 ...
- css3 翻牌动画
最近做了一个特效,css是从网上找的,地址是这个: CSS3 animate flip下的纸牌翻转效果实例页面 把其中核心的css代码扒出来如下: /* The properties in this ...
- MOG插件(葡萄牙语,略作翻译)
这次记录下MOG大神的插件,自从我发现了这个插件,似乎开启了一个新世界诶~~~ 网址 https://atelierrgss.wordpress.com 1. MOG_YuruYuri.js CARA ...
- WebApp之H5登录注册
代码indexhtml <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...
- 平衡树 & LCT
1. 非旋 Treap(FHQ Treap) 1.1. 算法简介 FHQ Treap 的功能非常强大.它涵盖了 Treap 几乎所有的功能 所以我非常后悔学了 Treap,浪费时间. FHQ 的核心思 ...
随机推荐
- MySQL强人“锁”难《死磕MySQL系列 三》
系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 前言 最近数据库 ...
- 11204备库升级PSU
某系统PSU为11.2.0.4.190115,备库打补丁20年10月份(31537677)由readme可知:1.要求OPatch要求为11.2.0.3.23或之后的版本.2.非rac环境打补丁需要关 ...
- 羽夏闲谈——VSCode 配置 C/C++环境
前言 VSCode是微软发布一款跨平台的源代码编辑器,其拥有强大的功能和丰富的扩展,使之能适合编写许多语言.我的环境是64位Win10,如果是其他系统请自行判断调整.本人根据网上的配置方法在结合本 ...
- WCF服务调用超时错误:套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:05:30”(已解决)
问题: 线上正式环境调用WCF服务正常,但是每次使用本地测试环境调用WCF服务时长就是出现:套接字连接已中止.这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的.本地套接字超 ...
- IDEA Web渲染插件开发(一)— 使用JCEF
目前网上已经有了很多关于IDEA(IntelliJ平台)的插件开发教程了,本人觉得简书上这位作者秋水畏寒的关于插件开发的文章很不错,在我进行插件开发的过程中指导了我很多.但是综合下来看,在IDEA上加 ...
- 用OpenCV显示视频时遇到问题
刚刚接触OpenCV,运行了书上的例程,程序编译没有问题,在视频显示快要结束时遇到了下面的问题,代码在后面 #include "stdafx.h"#include <open ...
- 使用CSS选择器(第二部分)
伪类跟伪元素一样,并不是直接针对文档元素的,而是为你基于某些共同特征选择元素提供方便. 使用结构性伪类选择器 使用结构性伪类选择器能够根据元素在文档中的位置选择元素.这类选择器都有一个冒号字符前缀(: ...
- Python实现九九乘法表
- NX二次开发-调内部函数UGS::UICOMP_enum::set_width(int)更改BlockUI的枚举控件宽度
版本 NX11+VS2013 内容说明 这个内部函数的设置方法,我之前不会,是QQ群里的一位大佬分享出来的. 关于这块,我也百度搜了一下,找到了几个相关的. 1.直接手动修改BlockUI界面 在低版 ...
- Golang通脉之函数
函数是组织好的.可重复使用的.用于执行指定任务的代码块. Go语言中支持函数.匿名函数和闭包,并且函数在Go语言中属于"一等公民". 函数定义 Go语言中定义函数使用func关键字 ...