[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 的核心思 ...
随机推荐
- MyBatis-Plus——实践篇
MyBatis-Plus--实践篇 MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生.进行数据库操作常用 ...
- Python技法-序列拆分
Python中的任何序列(可迭代的对象)都可以通过赋值操作进行拆分,包括但不限于元组.列表.字符串.文件.迭代器.生成器等. 元组拆分 元组拆分是最为常见的一种拆分,示例如下: p = (4, 5) ...
- div标签的理解
在HTML里面,div标签是一个块状元素,不会和其他元素排列在同一行,会默认和下面的元素换行,但是如果我们需要把几个div标签排在同一行,需要怎么做? 第一种:修改块状元素 源码: <div i ...
- 「JOISC 2020 Day2」变态龙之色 题解
题目传送门 注意 同性必定不同色 必有一个同色异性,且不相互不喜欢 Solution 我们发现,我们问题比较大的就是如何确定性别问题.我们可以一个一个加进去,在原来已经确定了的二分图上增加新的性别关系 ...
- appium操作安卓应用所需要的数据准备
操作系统.系统版本如下所示: desired_caps={} desired_caps["platformName"]="Android" desired_ca ...
- mysql join语句的执行流程是怎么样的
mysql join语句的执行流程是怎么样的 join语句是使用十分频繁的sql语句,同样结果的join语句,写法不同会有非常大的性能差距. select * from t1 straight_joi ...
- PAT (Basic Level) Practice (中文)1017 A除以B (20分)
1017 A除以B (20分) 本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数.你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立. 输入格式: 输入在一 ...
- C语言中while 语句
while的执行顺序 while 循环的执行顺序非常简单,它的格式是: while (表达式) { 语句: } 概念:当表达式为真,则执行下面的语句:语句执行完之后再判断表达式是否为真,如果为真,再次 ...
- 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链
散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...
- linux:桌面切换
永久更改 字符模式:multi-user.target 图形模式:graphical.target systemctl get-default #查看默认模式 systemctl set-defaul ...