HZOJ 寿司
这题也是挺神仙的,现在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 寿司的更多相关文章
- 【BZOJ-4197】寿司晚宴 状压DP
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 694 Solved: 440[Submit][Status] ...
- [BZOJ4197][Noi2015]寿司晚宴
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 412 Solved: 279[Submit][Status] ...
- BZOJ4197[NOI2005]寿司晚宴
Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...
- HYSBZ 4197 寿司晚宴
Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...
- BZOJ 4197: [Noi2015]寿司晚宴( dp )
N^0.5以内的质数只有8个, dp(i, j, k)表示用了前i个大质数(>N^0.5), 2人选的质数(<=N^0.5)集合分别为j, k时的方案数. 转移时考虑当前的大质数p是给哪个 ...
- NOI2015 寿司晚宴
今年NOI确实是在下输了.最近想把当时不会做的题都写一下. 题意 从2到n(500)这些数字中,选若干分给A,若干分给B,满足不存在:A的某个数和B的某个数的GCD不等于1. 对于寿司晚宴这题,标准解 ...
- bzoj 4199 [NOI2015]寿司晚宴
Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...
- 【最大权闭合子图】bzoj4873 [Shoi2017]寿司餐厅
4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 369 Solved: 256[Submit][Status ...
- BZOJ:4873: [Shoi2017]寿司餐厅
4873: [Shoi2017]寿司餐厅 首先很开心在膜你赛的时候做了出来. 看到数据范围,看到不能dp,看到贡献去重后计算,咦,流? 那就容易了,转最大权闭合子图,每个区间建一个点,取了就一定要取他 ...
随机推荐
- properties和 xml配置方式,如何选择
在学习集成log4j的时候,接触到了properties配置 个人感觉不是很好用,但与xml配置都可以完成指定的功能 properties配置文件,风格是一个属性对应于一个值(key = value) ...
- oracle使用dblink跨库查询的例子
本文介绍了oracle数据库使用dblink进行跨库查询的方法,oracle dblink跨库查询教程,需要的朋友参考下. oracle dblink跨库查询 方法一:首先,创建数据库链接: 复制 ...
- ubuntu安装搜狗输入法后无法使用goland的快捷键 ctrl+alt+B
安装了搜狗拼音后,其快捷键ctrl+alt+b会启动软键盘,造成与其他编辑器快捷键的冲突. 为了禁止使用ctrl+alt+b启动软键盘,可以: 1. 在搜狗拼音输入法选择设置 2. 高级设置 3. 高 ...
- IDG资本全球拼图:近10年揽26家独角兽,最敢出手VC再造"VC+"
IDG资本全球拼图:近10年揽26家独角兽,最敢出手VC再造"VC+" 2017-04-01 15:33 两天前,IDG资本合伙人过以宏提出的“VC+”,又有了新的内涵——全球 ...
- React高阶组件 和 Render Props
高阶组件 本质 本质是函数,将组件作为接收参数,返回一个新的组件.HOC本身不是React API,是一种基于React组合的特而形成的设计模式. 解决的问题(作用) 一句话概括:功能的复用,减少代码 ...
- win10下安装mongodb(解压版)
首先到官网下载安装包.(https://www.mongodb.com/download-center#community) 1.创建mongodb目录 2.配置文件mongodb.config 3. ...
- Leetcode914.X of a Kind in a Deck of Cards卡牌分组
给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组: 每组都有 X 张牌. 组内所有的牌上都写着相同的整数. 仅当你可选的 X > ...
- Leetcode674.Longest Continuous Increasing Subsequence最长连续递增序列
给定一个未经排序的整数数组,找到最长且连续的的递增序列. 示例 1: 输入: [1,3,5,4,7] 输出: 3 解释: 最长连续递增序列是 [1,3,5], 长度为3. 尽管 [1,3,5,7] 也 ...
- 【水滴石穿】ReactNativeDemo
这个博主他的功底算是特别棒的了,能够把一些基础的例子,通过精巧的方式布局在一个小的demo里面 很值得我学习 放上博主的链接:https://github.com/jianiuqi/ReactNati ...
- Linux C socket 基于 UDP
/************************************************************************* > File Name: serve ...