【vijos1900】 学姐吃寿司
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】 学姐吃寿司的更多相关文章
- 【暴力】vijos P1897 学姐吃牛排
判断堆:递归判断每个节点的孩子是否都比其父亲大(小). 判断BST:中序遍历是否有序. #include<cstdio> using namespace std; #define lc ( ...
- 嘉馨学姐又双叒叕来吃包子了 QDUOJ 模拟 尺度法
嘉馨学姐又双叒叕来吃包子了 QDUOJ 模拟 尺度法 点我进入OJ题目详情 题意 给你一串数,让你求长度最长的子串,这个字串满足里面没有重复出现的数字. 解题思路 使用一个标记数组,来标记每个数的第一 ...
- cdoj 1328 卿学姐与诡异村庄 Label:并查集 || 二分图染色
卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- Vijos1901 学姐的钱包
描述 学姐每次出门逛街都要带恰好M元钱, 不过她今天却忘记带钱包了.可怜的doc只好自己凑钱给学姐, 但是他口袋里只有一元钱.好在doc的N位朋友们都特别有钱, 他们答应与doc作一些交换.其中第i位 ...
- cdoj 1329 卿学姐与魔法 优先队列
卿学姐与魔法 Time Limit: 1200/800MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...
- cdoj 1324 卿学姐与公主 线段树裸题
卿学姐与公主 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit St ...
- vijosP1903学姐的实习工资
描述 学姐去实习了, 一共实习了N天, 每一天都可以得到实习工资V[i], 这里V[1..N]被看作是整数序列.因为学姐很厉害, 所以V[1..N]是不下降的.也就是说学姐每天的工资只会越来越多, 不 ...
- vijos1891 学姐的逛街计划(线性规划)
P1891学姐的逛街计划 描述 doc 最近太忙了, 每天都有课. 这不怕, doc 可以请假不去上课.偏偏学校又有规定, 任意连续 n 天中, 不得请假超过 k 天. doc 很忧伤, 因为他还要陪 ...
- 2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字
美妙的数字(number.c/.cpp/.pas) 题目描述 黄巨大认为非负整数是美妙的,并且它的数值越小就越美妙.当然0是最美妙的啦. 现在他得到一串非负整数,对于每个数都可以选择先对它做二进制非运 ...
随机推荐
- PHP高效率写法及原因
1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静态方法的 ...
- 窗口 - dialog - 概述与基本使用
什么是dialog 对话框是一种特殊的窗口,它在顶部有一个工具栏,在底部有一个按钮栏.默认情况下,对话框(dialog)只有一个显示在头部右侧的关闭工具. 用户可以配置对话框行为来显示其他工具(比如: ...
- JavaScript弹出窗口技巧
window.open ('faces/newPage.jsp','newwindow','height=300,width=700, top=50,left=50,toolbar=no,menuba ...
- javascript:查找“跳号”号码
业务背景:航空货运系统中,“货运代理商”会定期从“航空公司”领取一定数量的纸质运单(每张纸上有一个单号),这些单号都是连续的(即:每次可以理解为领取一个“号段”),而且每张单子都要向航空公司交纳一定的 ...
- 跟我学习Storm_Storm简介
Storm是由专业数据分析公司BackType开发的一个分布式实时数据处理软件,可以简单.高效.可靠地处理大量的数据流.Twitter在2011年7月收购该公司,并于2011年9月底正式将Storm项 ...
- servlet乱码问题总结
在学习时servlet乱码问题还是挺严重的,总结一下有三种情况 1.新建HTML页面后浏览出现乱码 2.以post形式请求时出现乱码 3.以get形式请求时出现乱码 让我们一个一个来解决吧 1.新建H ...
- MVC+EF 理解和实现仓储模式和工作单元模式
MVC+EF 理解和实现仓储模式和工作单元模式 原文:Understanding Repository and Unit of Work Pattern and Implementing Generi ...
- AngularJS中实现无限级联动菜单
多级联动菜单是常见的前端组件,比如省份-城市联动.高校-学院-专业联动等等.场景虽然常见,但仔细分析起来要实现一个通用的无限分级联动菜单却不一定像想象的那么简单.比如,我们需要考虑子菜单的加载是同步的 ...
- ul、li模仿ios的TableView实现城市选择
最近项目一个接着一个,之前说的精创环的项目还没做完,今天说先把那个放一下,先做访客系统,销售会见客户之后可以对客户进行一个跟踪记录,原型图也给了,今日头条的频道自定义页面一样. 如果是在IOS上让我来 ...
- JavaScript学习笔记-随滚轮匀速滑动的浮动广告窗动画
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...