这题也是挺神仙的,现在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. Spring线程安全的实现机制--ThreadLocal

    转载: http://blog.csdn.net/lufeng20/article/details/24314381

  2. jframe 设置左上角和任务栏的图标

    默认就是 改成有意义的,一眼就能看出来功能的,比如一个小蜘蛛 第一个最简单的做法,把图片扔到工程的根目录,但是这样会相当乱,不便于文件管理 ImageIcon icon = new ImageIcon ...

  3. Python之路,Day3- Python基础(转载Alex)

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...

  4. Appium_Python_Client介绍

    一.Appium_Python_Client介绍 Appium的实用方法都藏在Client的源码里,对于driver和webelement实例,均有对应的元素查找方法(webelement查找的是下面 ...

  5. 关于java中的异常

    java中有时候要写形如下图中的方法抛出异常 之所以要这么写(要在方法声明行写上throws ...)是因为这种 FileNotFoundException 属于编译异常 不属于运行时异常 不会主动抛 ...

  6. Hystrix线程池配置

    Hystrix配置文件配置 断路器: hystrix.command.default.circuitBreaker.requestVolumeThreshold(当在配置时间窗口内达到此数量的失败后, ...

  7. day18 10.使用ThreadLocal来解决问题

    ThreadLocal是一个容器/集合,是一个Map集合.不管你跨多少层,只要你是同一个线程就可以取出来.Service和Dao是同一个线程.Service第一次调用JdbcUtils.getConn ...

  8. Leetcode19.Remove Nth Node From End of List删除链表的倒数第N个节点

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...

  9. NFS服务器搭建与配置

    原文:https://blog.csdn.net/qq_38265137/article/details/83146421 NFS服务简介什么是NFS?NFS就是Network File System ...

  10. 基于spring-boot的测试桩设计--几种常见的controller

    第一种:通过@RequestBody,直接将请求体映射到对象 //@RequestBody @RequestMapping(value = "addUser", method = ...