考试时打的类似$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代价-1
ans+=rr[p]-rr[tail+1];//如果当前为B将B向后移动那么右边所有R代价+1
while(c[++p]!='B'){//当前指针应当指向下一个B
ans+=lb[p]-lb[head];//如果R由左变为了右,那么代价从左边变成右边
ans-=rb[p]-rb[tail+2];
}
}
head++,tail++;
zo=min(zo,ans);
}
cout<<zo<<endl;
}
}

NOIP模拟测试8「寿司」的更多相关文章

  1. NOIP模拟测试30「return·one·magic」

    magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...

  2. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

  3. NOIP模拟测试21「折纸&#183;不等式」

    折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...

  4. NOIP模拟测试18「引子·可爱宝贝精灵·相互再归的鹅妈妈」

    待补 引子 题解 大模拟,注意细节 代码1 #include<bits/stdc++.h> using namespace std; int n,m;char a[1005][1005]; ...

  5. NOIP模拟测试10「大佬·辣鸡·模板」

    大佬 显然假期望 我奇思妙想出了一个式子$f[i]=f[i-1]+\sum\limits_{j=1}^{j<=m} C_{k \times j}^{k}\times w[j]$ 然后一想不对得容 ...

  6. NOIP模拟测试9「随·单·题」

    liu_runda出的题,先$\%\%\%\%\%\%\%\%\%\%\%$为敬 随 考试时没有Qj 然后甚至没做,甚至没交 我不知道我怎么想的 这个题挺难改 你需要用到 循环矩阵快速幂,矩阵快速幂优 ...

  7. 20190803 NOIP模拟测试12「斐波那契(fibonacci)· 数颜色 · 分组 」

    164分 rank11/64 这次考的不算太差,但是并没有多大的可能性反超(只比一小部分人高十几分而已),时间分配还是不均,T2两个半小时,T1半个小时,T3-额十几分钟吧 然额付出总是与回报成反比的 ...

  8. NOIP模拟测试38「金·斯诺·赤」

    金 辗转相减见祖宗 高精 #include<bits/stdc++.h> using namespace std; #define A 2000 #define P 1 #define N ...

  9. NOIP模拟测试28「阴阳·虎·山洞」

    写这几个题解我觉得我就像在按照官方题解抄一样 阴阳 题解 将题目中给的阴阳看作黑色和白色 首先我们观察到最后生成图中某种颜色必须是竖着单调递增或竖着单调递减 类似这样 否则不满足这个条件 但合法染色方 ...

随机推荐

  1. Xshell、Xftp评估过期的解决办法

    介绍一个     FTP客户端-IIS7服务器管理工具作为FTP客户端,它支持批量管理ftp站点.定时上传和定时下载,定时备份,且操作简洁.同时iis7服务器管理工具还是vnc客户端.并且支持批量管理 ...

  2. QQ账号登录测试用例

  3. 【二】Kubernetes 集群部署-kubeadm方式(亲测)

    一.概述 本次部署 Kubernetes 集群是通过 kubeadm 工具来进行部署, kubeadm 是 Kubernetes 官⽅提供的⽤于快速部署 Kubernetes 集群的⼯具,利⽤其来部署 ...

  4. CentOS、RHEL、Asianux、Neokylin、湖南麒麟、BC Linux、普华、EulerOS请参考“1.1 CentOS本地源配置”;

      本文档适用于CentOS.RHEL.Asianux.Neokylin.湖南麒麟.BC Linux.普华.EulerOS.SLES.Ubuntu.Deepin.银河麒麟. CentOS.RHEL.A ...

  5. 删除rpc01

    vim /opt/ltp/runtest/stress.part3 修改/opt/ltp/runtest/stress.part3 删除rpc01: 142 systemctl status gdm ...

  6. Linux进阶之TCP三次握手四次挥手

    TCP(Transfer control protocol)传输控制协议 一.两种传输模式: TCP面向有连接 可靠 常用于点对点 微信 UDP面向无连接 高速 常用于点对面 直播 二.数据方向: 在 ...

  7. C语言中位运算异或“∧”的作用

    1.概念异或运算符"∧"也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即 0∧0=0,0∧1=1, 1^0=1,1∧1=0.运算    ...

  8. 11.16-18 lsci、ipcs、ipcrm:清除ipc相关信息

    lspci:显示所有PCI设备 lspci命令用来显示系统中的所有PCI总线设备或是连接到该总线上的所有设备. lspci命令的参数选项及说明 -v     显示详细信息 -vv    显示更详细的信 ...

  9. C语言规范:C89、C90、C95、C99

    本文转载 [K&R C] 1978 年,Dennis Ritchie 和 Brian Kernighan 合作推出了<The C Programming Language>的第一版 ...

  10. ubuntu下 SVN 服务器搭建及使用

    简化篇 http://blog.csdn.net/Eric_lmy/article/details/51942931 详细篇 1.安装Subversion ServerSubversion serve ...