https://vijos.org/p/1900 (题目链接)

题意

  给出一个01环,问最少经过多少次相邻互换使得所有的0聚在一坨,所有的1聚在一坨。

Solution

  源自:LCF Solution

  一般环上的问题都要把序列复制一遍,然后转成了序列上的问题。这道也不例外。

  经过观察后我们“显然”可以得到一个结论:对于最优解,定有断点使得所有的交换都不经过这个点。因为如果所有相邻的位置都交换了一次,相邻的位置都交换了一次那么这些操作并没有改变这个环的形态,也就是没有任何作用完全可以直接去掉。(然而LCF讲题翻车,这个证明显然是错误的,在不同的时间交换两个相邻的位置最终态并不会一样→_→。然而我也会证,只是感觉很正确)

  于是,我们就可以枚举断点,然后就转变为了一个序列了。我们的目的就变成了使0全部靠边。然后可以预处理出每个0移动到左边界需要多少步,右边界需要多少步。发现对于一个序列,肯定是存在一条分界线使得左边一部分0往左靠,右边一部分0往右靠,当断点顺时针移动的时候,分界点显然不会逆时针移动。于是这玩意儿是有单调性的,弄一个单调指针扫一扫就可以了。

细节

  数组开大两倍

代码

// vijos1900
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 1e18
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=2000010;
int a[maxn],sum[maxn];
char ch[maxn]; int main() {
int T;scanf("%d",&T);
for (int cas=1;cas<=T;cas++) {
scanf("%s",ch+1);
int n=strlen(ch+1);
for (int i=1;i<=n;i++) {
if (ch[i]=='B') a[i]=0;
else a[i]=1;
}
for (int i=n+1;i<=n*2;i++) a[i]=a[i-n];
for (int i=1;i<=n*2;i++) sum[i]=a[i]+sum[i-1];
LL p=1,ans=inf,L=0,R=0,lnum=0,rnum=0;
for (int i=1;i<=n;i++) if (a[i]==0) R+=sum[n]-sum[i-1],rnum++;
for (int s=1;s<=n;s++) {
int t=s+n-1;
if (s!=1) {
if (a[s-1]==0) lnum--;
if (a[s-1]==1) L-=lnum;
if (a[t]==0) rnum++;
if (a[t]==1) R+=rnum;
}
for (p;p<=t+1;p++) if (a[p]==0) {
if (sum[p-1]-sum[s-1]>sum[t]-sum[p]) break;
L+=sum[p-1]-sum[s-1];
R-=sum[t]-sum[p];
lnum++;rnum--;
}
ans=min(ans,L+R);
}
printf("Case #%d: %lld\n",cas,ans);
}
return 0;
}

  

【vijos1900】 学姐吃寿司的更多相关文章

  1. 【暴力】vijos P1897 学姐吃牛排

    判断堆:递归判断每个节点的孩子是否都比其父亲大(小). 判断BST:中序遍历是否有序. #include<cstdio> using namespace std; #define lc ( ...

  2. 嘉馨学姐又双叒叕来吃包子了 QDUOJ 模拟 尺度法

    嘉馨学姐又双叒叕来吃包子了 QDUOJ 模拟 尺度法 点我进入OJ题目详情 题意 给你一串数,让你求长度最长的子串,这个字串满足里面没有重复出现的数字. 解题思路 使用一个标记数组,来标记每个数的第一 ...

  3. cdoj 1328 卿学姐与诡异村庄 Label:并查集 || 二分图染色

    卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  4. Vijos1901 学姐的钱包

    描述 学姐每次出门逛街都要带恰好M元钱, 不过她今天却忘记带钱包了.可怜的doc只好自己凑钱给学姐, 但是他口袋里只有一元钱.好在doc的N位朋友们都特别有钱, 他们答应与doc作一些交换.其中第i位 ...

  5. cdoj 1329 卿学姐与魔法 优先队列

    卿学姐与魔法 Time Limit: 1200/800MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  6. cdoj 1324 卿学姐与公主 线段树裸题

    卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit St ...

  7. vijosP1903学姐的实习工资

    描述 学姐去实习了, 一共实习了N天, 每一天都可以得到实习工资V[i], 这里V[1..N]被看作是整数序列.因为学姐很厉害, 所以V[1..N]是不下降的.也就是说学姐每天的工资只会越来越多, 不 ...

  8. vijos1891 学姐的逛街计划(线性规划)

    P1891学姐的逛街计划 描述 doc 最近太忙了, 每天都有课. 这不怕, doc 可以请假不去上课.偏偏学校又有规定, 任意连续 n 天中, 不得请假超过 k 天. doc 很忧伤, 因为他还要陪 ...

  9. 2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字

    美妙的数字(number.c/.cpp/.pas) 题目描述 黄巨大认为非负整数是美妙的,并且它的数值越小就越美妙.当然0是最美妙的啦. 现在他得到一串非负整数,对于每个数都可以选择先对它做二进制非运 ...

随机推荐

  1. Android 系统稳定性 - ANR(二)(转)

    编写者:李文栋P.S. OpenOffice粘贴过来后格式有些混乱. 1.2 如何分析ANR问题 引起ANR问题的根本原因,总的来说可以归纳为两类: 应用进程自身引起的,例如: 主线程阻塞.挂起.死循 ...

  2. Linux Linux程序练习十六(进程间的通信信号版)

    /* * 题目: * 编写程序,要去实现如下功能: 父进程创建子进程1和子进程2.子进程1向子进程2发送可靠信号,并传送额外数据为子进程1的pid*2; 子进程2接受可靠信号的值,并发送给父进程,父进 ...

  3. .NET 4.0 任务(Task)

    随着 .NET 4.0的到来,她与以前各版本的一个明显差别就是并行功能的增强,以此来适应这个多核的世界.于是引入了一个新概念---任务,作为支持并行运算的重要组成部分,同时,也作为对线程池的一个补充和 ...

  4. 想请问下PDF双面打印时(打印机自动双面打印)为什么反面那页的内容是倒过来的,应该怎么设置?

    用foxit reader 打印pdf 直接设置为双面打印并且一张2页打印,发现正反面刚好倒着来的,其实说的正反面倒着是从左右翻的角度来讲的,如果上下翻会发现刚好是这个顺序的,这个是要在双面打印设置里 ...

  5. 是什么时候开始学习gulp了

    转自:http://www.ydcss.com/archives/18 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重 ...

  6. 从源码角度看finish()方法的执行流程

    1. finish()方法概览 首先我们来看一下finish方法的无参版本的定义: /** * Call this when your activity is done and should be c ...

  7. Java:注解(元数据)

    初识Java注解 所谓的元数据是指用来描述数据的数据,可能刚听到元数据的时候你会有点陌生,其实任何一个使用过struts或者hibernate的开发人员都在不知不觉中使用元数据,更通俗一点来说元数据是 ...

  8. ZeroClipboard / jquery.zclip.min.js跨浏览器复制插件使用中遇到的问题解决

    之前写过一个淘宝优惠券连接PC端转手机端连接的小工具,当时写到将转换好的url复制到剪切板这块时解决了IE和火狐,就是没办法搞定Chrome,知道可以通过flash搞定,但是觉得太麻烦没有仔细研究. ...

  9. Replace Pioneer注册

    以下是目前合法长期使用Replace Pioneer的唯一方法(除了购买之外): Replace Pioneer过期后,会弹出一个注册(Registration)窗口,其中有一个试用选项(Trial ...

  10. [POJ3696]The Luckiest number(数论)

    题目:http://poj.org/problem?id=3696 题意:给你一个数字L,你要求出一个数N,使得N是L的倍数,且N的每位数都必须是8,输出N的位数(如果不存在输出0) 分析: 首先我们 ...