NOIP模拟测试8「寿司」

考试时打的类似$n^2$暴力,然后炸了只有10分

后来验证我的算法伪了。

题解


 

显然你有一种解法,假设你要在一个B点断开将R分别移向最左 最右,这样只用分别计算B点右面蓝色数量左面蓝色数量就得到了一个ans

这个题有一个很不显然的结论,假设你要将R移向两边时,序列唯一确定时,设pos=(蓝色数量+1)/2,在pos点将R移向左面,右面花费最小(单调性)

因为这个序列是循环的所以我们只要枚举B点断开的位置就可以$n^2$求出最小的ans值

$n^2$显然过不了1000000

现在我们思考$n^2$问题在哪,首先你每次重新计算一次ans额外花费了时间,然后每次都枚举断点又花费了时间

但实际上我们每次循环到下一个这个序列实际上变化很少,只是前面那个字母删去,后面再加一个字母

实际对ans改变也很少

类似于莫队,对于ans+ - 我们可以得到另一个ans

那么我们可以计算出他的改变

首先我们可以得出每次循环到下一B,假设我们目前断点不变,那么所有左边R对ans造成贡献都会减1,所有右边R对ans造成贡献都会加1

然后我们思考下一个断点,假设当前断点显然就是下一个B

然后我们断点移动过程中我们发现有一些R从右面移动到了左面,那么他要移动贡献也从右面blue数量改成了右面贡献,减去左面贡献加上左面的贡献即可

代码


 

#include<bits/stdc++.h>
#define ll long long
#define A 2100000
using namespace std;
ll t,len,n,ans,pos,zo,p;
ll lb[A],rb[A],lr[A],rr[A];
char c[A];
int main()
{
//    freopen("mkd.txt","r",stdin);
//    freopen("wa.txt","w",stdout);scanf("%lld",&t);while(t--){ans=0;zo=ans;lb[0]=rb[0]=lr[0]=rr[0]=0;scanf("%s",c+1);len=strlen(c+1);n=len;pos=-1;for(ll i=1;i<=len;i++){c[n+i]=c[i];}len*=2;rr[len+1]=rb[len+1]=0;for(ll i=1;i<=len;i++){lb[i]=lb[i-1],lr[i]=lr[i-1];if(c[i]=='B')lb[i]++;else lr[i]++;}for(ll i=len;i>=1;i--){rr[i]=rr[i+1],rb[i]=rb[i+1];if(c[i]=='B') rb[i]++;else rr[i]++;}pos=(lb[n]+1)/2;
//        printf("pos=%lld\n",pos);for(ll i=1;i<=n;i++){if(lb[i]==pos){p=i;for(ll j=n;j>i;j--){if(c[j]=='R')ans+=rb[j]-rb[n+1];
//                    printf("rr=%lld rr[n]=%lld\n",rr[j],rr[n+1]);
                }break;}else if(c[i]=='R')ans+=lb[i];}
//        printf("ans=%lld\n",ans);zo=ans;ll head=1,tail=n;while(head<=n){if(c[head]=='B'){    ans-=lr[p]-lr[head-1];//如果当前为B将B向后移动那么左边所有R代价-1ans+=rr[p]-rr[tail+1];//如果当前为B将B向后移动那么右边所有R代价+1while(c[++p]!='B'){//当前指针应当指向下一个Bans+=lb[p]-lb[head];//如果R由左变为了右,那么代价从左边变成右边ans-=rb[p]-rb[tail+2];}}head++,tail++;zo=min(zo,ans);}cout<<zo<<endl;}
}
View Code

 

转载于:https://www.cnblogs.com/znsbc-13/p/11247211.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

glassfish hk2_使用GlassFish 3.1.2.2和Primefaces 3.4的JDBC领域和基于表单的身份验证

glassfish hk2我的博客上最受欢迎的帖子之一是有关JDBC安全领域和带有Primefaces的GlassFish上基于表单的身份验证的简短教程。 在收到有关它不再适用于最新的GlassFish 3.1.2.2的评论后&#xff0c;我认为可能是时候重新访问它并提出更新的版本了。 开始了&#xff1a; 制备 …

NOIP模拟测试8「匹配·回家」

匹配 哈希能A 水到爆炸 回家 事实上我做过一个原题&#xff0c;甚至比这个回家难的多&#xff0c;而且那个题多组询问必经点 然后我做一组询问就打炸了 大约就是删了很多东西&#xff0c;然后自己想的太简单了 直接统计了割点&#xff0c;懒得打lca和树上差分&#xff0c;懒得打…

将CloudWatch Logs与Cloudhub Mule集成

在此博客中&#xff0c;我将解释如何为您的Mule CloudHub应用程序启用AWS Cloudwatch日志 。 AWS提供了Cloudwatch Logs Services&#xff0c;以便您可以更好地管理日志。 它比松散便宜。 由于cloudhub会自动翻转超过100 MB的日志&#xff0c;因此我们需要一种机制来更有效地管…

android网络重试机制,okhttp源码解析(四):重试机制

前言这一篇我们分析okhttp的重试机制&#xff0c;一般如果网络请求失败&#xff0c;我们会考虑连续请求多次&#xff0c;增大网络请求成功的概率&#xff0c;那么okhttp是怎么实现这个功能的呢&#xff1f;正文首先还是回到之前的InterceptorChain&#xff1a;Response getResp…

构造入门

构造死磕 什么是构造 小学中学奥数先用数学解决再编程实现的构造题一般算法无法解决\(NOI\)难度\(PJ-\)代码量坑构造举例 CF743C Vladik and fractions 题目让我们构造一组数字,满足\(\frac{2}{n} \frac{1}{x} \frac{1}{y} \frac{1}{z}\)第一眼看到就想到听老师讲了半天才知…

王成录华为鸿蒙系统,华为手机销量仍在增长!华为王成录:手机会是鸿蒙OS系统的中心...

【天极网手机频道】由于制裁&#xff0c;华为遭到前所未有的断供&#xff0c;外界有不少声音都在担心华为手机出货量将会出现暴跌。不过昨日华为开发者大会举办期间&#xff0c;华为消费者业务软件部总裁王成录表示&#xff0c;华为手机销量仍在增长中。昨天的华为开发者大会&a…

28线程

进程&#xff1a;计算机执行的任务 线程&#xff1a;执行任务中的小任务 多线程 计算机再执行过程中&#xff0c;再同一时间只能让cpu的一个核执行一个进程。进程有多个线程构成&#xff0c;再同一时刻Cpu只能处理一个线程。 引入多线程 当线程被cpu执行时cpu开始工作&#xff…

什么是javax.ws.rs.core.context? [第3部分]

如何使用Context批注 在什么是javax.ws.rs.core.context的第2部分中&#xff1f; 您学习了如何使用Context批注从SecurityContext类的注入实例检索安全信息&#xff0c;以及如何通过ResourceContext实例使用JAX-RS资源类。 在本文中&#xff0c;您将学习如何将Context批注与请…

html 字幕飘动效果,html 滚动字幕 制作滚动字幕效果 参数

制作滚动字幕效果&#xff1a;marquee标签 如下:&#xff1c;MARQUEE directionup height146 οnmοuseοutstart() οnmοuseοverstop() scrollAmount4&#xff1e; &#xff1c;/marquee&#xff1e;参数说明&#xff1a;direction滚动方向&#xff1a;up向上滚动&#xff0…

静态点分治总结

点分治是世界上最好的算法QwQ 点分治可以解决各种树上的边权点权问题&#xff0c;然后如果你发现这个题好像问的特别玄学&#xff0c;lca&#xff0c;树差都做不了&#xff0c;树上动‘龟’更做不了&#xff0c;只能暴力时&#xff0c;这个题大多数情况就是点分治了 点分治的思…

html节点上下移动,关于前端:数组元素上下移动

/*** 上、下挪动* param {number} code 下标* param {number} dir 1上移 0下移*/onMove(code, dir) {let moveComm (curIndex, nextIndex) > {let arr this.commodityInfoarr[curIndex] arr.splice(nextIndex, 1, arr[curIndex])[0]return arr}this.commodityInfo.some((…

mybatis插入数据后返回自增主键ID详解

1.场景介绍: ​ 开发过程中我们经常性的会用到许多的中间表,用于数据之间的对应和关联.这个时候我们关联最多的就是ID,我们在一张表中插入数据后级联增加到关联表中.我们熟知的mybatis在插入数据后返回的是插入成功的条数,那么这个时候我们想要得到相应的这条新增数据的ID,该怎…

spring 属性占位符_Spring属性占位符配置器–一些不太明显的选项

spring 属性占位符Spring的PropertySourcesPlaceholderConfigurer用于从XML或Java Config中定义的Spring bean定义外部化属性。 PlaceholderConfigurer支持的一些选项在文档中并不明显&#xff0c;但很有趣&#xff0c;并且可能有用。 首先&#xff0c;以Spring文档中的示例为…

红包雨效果html,js+css实现红包雨效果

//每一个红包都是相对于父元素定位&#xff0c;通过z-index来设置层级let zIndex 1;function bindEvent() {$redPackage.on(click,.js-RedPackageBox,function() {//拿到每个红包的数据const data $(this).data(txt);}}//生成mix-max的随机数function getRandom(min,max) {re…

Delphi下实现全屏快速找图找色 二、矩阵遍历

二、矩阵遍历  矩阵遍历是一个数据结构方面的问题。假设有一个矩阵Matrix&#xff0c;它共有RowCount行&#xff0c;每行有ColCount列&#xff0c;当利用y表示行数&#xff0c;x表示列数&#xff0c;那么利用Matrix[y,x]就可以访问矩阵中的任意元素。假设有一个1010大小的矩阵…

Eclipse MicroProfile:您需要了解的5件事

针对微服务架构优化企业Java Eclipse MicroProfile计划是在JavaOne 2016上发起的&#xff0c;JavaOne是服务器供应商和Java用户组的创意&#xff0c;目的是解决企业Java微服务领域的缺点。 Java EE的发布速度减慢到无法应对Swift发展的微服务趋势的挑战的程度。 MicroProfile通…

html 选择不能重复,人生,就是一次无法重复的选择(深度好文)

作者&#xff1a;彩云追月欧洲著名的政治家托马斯 莫尔说&#xff1a;“在人生中最艰难的是选择”。漫漫人生路&#xff0c;有无数的选择&#xff0c;不同的选择&#xff0c;可能会决定我们不同的人生道路。下面的故事也许对你有所启迪&#xff1a;一天&#xff0c;几个学生问…

用HTML做软件UI用到的的一些技术

做WEB开发的想把网页做成应用程序的界面&#xff0c;开发应用程序的又想把程序界面做得和WEB一样。本文介绍一下用HTML做软件UI用到的的一些技术。 其实HTML UI也不是什么新鲜事了&#xff0c;Norton Antivirus从几年前的版本就开始用了&#xff0c;vs.net2002中的开始页也用了…

html css导航栏字体图标,HTML+CSS入门之两种图标字体库

本篇教程介绍了HTMLCSS入门之两种图标字体库&#xff0c;希望阅读本篇文章以后大家有所收获&#xff0c;帮助大家HTMLCSS入门。<## 0. 前言比较基础的图标加载&#xff1a;和块元素的背景background: url(./x.png).页面多图标时&#xff0c;使用雪碧图(多个png压缩成一个png…

垃圾收集算法,垃圾收集器_弱,弱,最弱,利用专家参考来管理垃圾收集器

垃圾收集算法,垃圾收集器何时以及何时不使用Java中的专家引用 弱引用&#xff0c;软引用和幻像引用既危险又强大。 如果以错误的方式使用它们&#xff0c;则会破坏JVM性能。 但是&#xff0c;如果使用正确的方法&#xff0c;它们可以大大提高性能和程序清晰度。 弱引用和软引用…