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,看到贡献去重后计算,咦,流? 那就容易了,转最大权闭合子图,每个区间建一个点,取了就一定要取他 ...
随机推荐
- Spring线程安全的实现机制--ThreadLocal
转载: http://blog.csdn.net/lufeng20/article/details/24314381
- jframe 设置左上角和任务栏的图标
默认就是 改成有意义的,一眼就能看出来功能的,比如一个小蜘蛛 第一个最简单的做法,把图片扔到工程的根目录,但是这样会相当乱,不便于文件管理 ImageIcon icon = new ImageIcon ...
- Python之路,Day3- Python基础(转载Alex)
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...
- Appium_Python_Client介绍
一.Appium_Python_Client介绍 Appium的实用方法都藏在Client的源码里,对于driver和webelement实例,均有对应的元素查找方法(webelement查找的是下面 ...
- 关于java中的异常
java中有时候要写形如下图中的方法抛出异常 之所以要这么写(要在方法声明行写上throws ...)是因为这种 FileNotFoundException 属于编译异常 不属于运行时异常 不会主动抛 ...
- Hystrix线程池配置
Hystrix配置文件配置 断路器: hystrix.command.default.circuitBreaker.requestVolumeThreshold(当在配置时间窗口内达到此数量的失败后, ...
- day18 10.使用ThreadLocal来解决问题
ThreadLocal是一个容器/集合,是一个Map集合.不管你跨多少层,只要你是同一个线程就可以取出来.Service和Dao是同一个线程.Service第一次调用JdbcUtils.getConn ...
- Leetcode19.Remove Nth Node From End of List删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...
- NFS服务器搭建与配置
原文:https://blog.csdn.net/qq_38265137/article/details/83146421 NFS服务简介什么是NFS?NFS就是Network File System ...
- 基于spring-boot的测试桩设计--几种常见的controller
第一种:通过@RequestBody,直接将请求体映射到对象 //@RequestBody @RequestMapping(value = "addUser", method = ...