这题也是挺神仙的,现在O(n)的解法还没打出来,只是用O(nlogn)卡过去了(理论上可以过),sdfz某大佬用三分拿到了65分……

考试连暴力都没打出来……

n2暴力T40:

首先将环拆成链,我们可以O(n)枚举一个点不动,将它左右的点向他靠近,总复杂度O($n^2$).

代码也挺简单,貌似我的代码比别人都短……可能思路有点不一样。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define MAXN 2000010
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define ma(x) memset(x,0,sizeof(x))
using namespace std;
char a[MAXN];
int n,T;
signed main()
{
cin>>T;
while(T--)
{
n=;char te=getchar();
while(te!='B'&&te!='R')te=getchar();
while(te=='B'||te=='R'){a[++n]=te;te=getchar();}
for(int i=n+;i<*n;i++)a[i]=a[i-n];
LL ans=0x7fffffff;
for(int i=;i<=n;i++)
{
LL sum=,nb=,nr=;
for(int j=i+n-;j>=i+n-n/;j--)
if(a[j]==a[i])sum+=i+n-j-nb-,nb++;
for(int j=i+;j<=i+n/;j++)
if(a[j]==a[i])sum+=j-i--nr,nr++;
if(n%==&&a[i+n/]==a[i])sum+=min(n/-nb-,n/-nr-);
ans=min(ans,sum);
}
cout<<ans<<endl;
}
}

nlogn二分:

对于一段序列,一定有一个分界点,将它左边的红色移到左端,右边的红色移到右端使得答案最优,而此时左右另一种颜色各占一半(我觉得有点难以理解),所以这个分界点可以二分查找,加上枚举序列起点总复杂度nlogn。

另外还有一个难点就是O(1)求步数。

预处理出i点左右红色数量rl,rr,蓝色数量bl,br,将i左端红色全不移动到最左端所需步数sl,最右端sr。

可以O(n)扫一边处理出来。

在枚举得到mid之后,就可一O(1)求出当前序列最优答案:

ans=sl[mid]-sl[l-1]-(rl[mid]-rl[l-1])*bl[l-1] + sr[mid+1]-sr[r+1]-(rr[mid+1]-rr[r+1])*br[r+1];

说一下左半部分,右半部分是类似的,sl[mid]-sl[l-1]是将[l,r]中所有红色移到序列最左端所需步数,而我们只需要将其移到枚举的端点的左端,所以要减去后边的东西。

如果把sl[mid]-sl[l-1]按递推式子拆开那么就很好理解了。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define MAXN 2000010
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define ma(x) memset(x,0,sizeof(x))
using namespace std;
char a[MAXN];
int n,T;
LL sl[MAXN],sr[MAXN],rl[MAXN],rr[MAXN],bl[MAXN],br[MAXN];
LL solve(int l,int r)
{
int L=l,R=r,mid,end=(rl[r]-rl[l-])>>;
while(L<=R)
{
mid=(L+R)>>;
if(rl[mid]-rl[l-]==end)break;
if(rl[mid]-rl[l-]>end) R=mid-;
if(rl[mid]-rl[l-]<end) L=mid+;
}
LL ans=sl[mid]-sl[l-]-(rl[mid]-rl[l-])*bl[l-]+sr[mid+]-sr[r+]-(rr[mid+]-rr[r+])*br[r+];
return sl[mid]-sl[l-]-(rl[mid]-rl[l-])*bl[l-]+
sr[mid+]-sr[r+]-(rr[mid+]-rr[r+])*br[r+];
}
signed main()
{
cin>>T;
while(T--)
{
n=;char te=getchar();
while(te!='B'&&te!='R')te=getchar();
while(te=='B'||te=='R'){a[++n]=te;te=getchar();}
for(int i=n+;i<=*n;i++)a[i]=a[i-n];
LL ans=0x7ffffffffffffff; rl[]=bl[]=sl[]=;
for(int i=;i<=n*;i++)
{
rl[i]=rl[i-],bl[i]=bl[i-];
sl[i]=sl[i-];
if(a[i]=='B')bl[i]++;
else rl[i]++,sl[i]+=bl[i];
}
rr[n*+]=br[n*+]=sr[n*+]=;
for(int i=n*;i>=;i--)
{
rr[i]=rr[i+],br[i]=br[i+];
sr[i]=sr[i+];
if(a[i]=='B')br[i]++;
else sr[i]+=br[i],rr[i]++;
}
for(int i=;i<=n;i++)
ans=min(ans,solve(i,i+n-));
cout<<ans<<endl;
}
}

O(n)正解:

用两个单调指针既可实现O(n),代码先留个坑。

HZOJ 寿司的更多相关文章

  1. 【BZOJ-4197】寿司晚宴 状压DP

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 694  Solved: 440[Submit][Status] ...

  2. [BZOJ4197][Noi2015]寿司晚宴

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 412  Solved: 279[Submit][Status] ...

  3. BZOJ4197[NOI2005]寿司晚宴

    Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...

  4. HYSBZ 4197 寿司晚宴

    Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...

  5. BZOJ 4197: [Noi2015]寿司晚宴( dp )

    N^0.5以内的质数只有8个, dp(i, j, k)表示用了前i个大质数(>N^0.5), 2人选的质数(<=N^0.5)集合分别为j, k时的方案数. 转移时考虑当前的大质数p是给哪个 ...

  6. NOI2015 寿司晚宴

    今年NOI确实是在下输了.最近想把当时不会做的题都写一下. 题意 从2到n(500)这些数字中,选若干分给A,若干分给B,满足不存在:A的某个数和B的某个数的GCD不等于1. 对于寿司晚宴这题,标准解 ...

  7. bzoj 4199 [NOI2015]寿司晚宴

    Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...

  8. 【最大权闭合子图】bzoj4873 [Shoi2017]寿司餐厅

    4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 369  Solved: 256[Submit][Status ...

  9. BZOJ:4873: [Shoi2017]寿司餐厅

    4873: [Shoi2017]寿司餐厅 首先很开心在膜你赛的时候做了出来. 看到数据范围,看到不能dp,看到贡献去重后计算,咦,流? 那就容易了,转最大权闭合子图,每个区间建一个点,取了就一定要取他 ...

随机推荐

  1. 2019.7.27 NOIP模拟测试9 反思总结

    先来整理题目 T1题目大意:给出n个数字和一个质数作为模数,一个变量x初始值为1.进行m次操作,每次让x随机乘上n个数中的一个,问m次操作以后x的期望值. 答案一定可以用分数表示,输出分子乘分母逆元的 ...

  2. JavaScript实现无缝滚动 原理详细讲解

    先了解一下对象的几个的属性: innerHTML: 设置或获取位于对象起始和结束标签内的 HTML scrollHeight: 获取对象的滚动高度. scrollLeft: 设置或获取位于对象左边界和 ...

  3. 微信小程序之组件开发中的基础知识

    跟着视频开始小程序的项目的开发,视频中这个小程序已经上线了,可以很好的看着小程序的界面进行开发,昨天看了一下具体的需求,觉得真的细节好多啊,而且其中设计的组件的思想也是很好的,能够很好的实现代码的复用 ...

  4. 编译libusb库

    之前需要安装依赖库 : libudevautomakeautoconflibtool ./bootstrap.sh ./configure --with-pic --prefix=/home/libu ...

  5. Ajax--解析JSON数据与解析XML数据

    一.Ajax解析JSON数据 nav.json(json数据) [ { "link":"http://www.jd.com", "src": ...

  6. PHP的注释规范

    <?php //注释规范 /** *函数的功能 *@param 参数类型 参数名1 参数解析 *@param 参数类型 参数名2 参数解析 *@return 返回值类型 返回值解析 *@auth ...

  7. 如何解决Firefox浏览器地址栏中文搜索速度很慢

    一.插件安装 之前使用Chrome浏览器,习惯在地址栏中直接进行中文搜索.转到Firefox之后,突然发现在地址栏进行中文搜索,访问速度会很慢. 可以使用插件解决这个问题:Omnibar 插件地址:h ...

  8. python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)

    网上有很多同义但不同方式的说法,下面的这个说法比较让你容易理解和接受 与类和实例无绑定关系的function都属于函数(function): 与类和实例有绑定关系的function都属于方法(meth ...

  9. 【CF Manthan, Codefest 17 B】Marvolo Gaunt's Ring

    [链接]h在这里写链接 [题意] 给你n个数字; 让你在其中找出三个数字i,j,k(i<=j<=k); 使得p*a[i]+q*a[j]+r*a[k]最大; [题解] /*     有一个要 ...

  10. JQuery--jQquery控制CSS样式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...