P3470 [POI2008]BBB-BBB【线段树,贪心】

正题

题目链接:https://www.luogu.org/problem/P3470


题目大意

一个+−+-+序列,+++表示111−-表示−1-11sis_isi表示到第iii个的前缀和,要求
q+sn=p且q+si≥0(i∈[1..n])q+s_n=p且q+s_i\geq 0(i\in[1..n])q+sn=pq+si0(i[1..n])

然后有以下操作

  1. 消耗xxx将一位取反
  2. 消耗yyy将最后一位丢到最前面

求最小消耗


解题思路

先不考虑操作2
若已经满足了q+sn=pq+s_n=pq+sn=p,那么答案显然为max{−q−si,0}∗2∗xmax\{-q-s_i,0\}*2*xmax{qsi,0}2x
然后我们考虑那若不同呢,我们考虑将两个可以合并在一起计算
答案就是(max{−q−si,0}2+∣max{−q−si,0}−(q−p+sn)2∣)∗x(\frac{max\{-q-s_i,0\}}{2}+|\frac{max\{-q-s_i,0\}-(q-p+s_n)}{2}|)*x(2max{qsi,0}+2max{qsi,0}(qp+sn))x

上的都可以O(1)O(1)O(1)的时间内计算,所以我们暴力枚举转了多少次

这里的max{−q−si,0}max\{-q-s_i,0\}max{qsi,0}我是用线段树进行维护的,时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+100;
struct Tree_node{int l,r,w,lazy;
};
int n,p,q,x,y,s[N],k,z,ans;
char a[N];
struct Seg_Tree{Tree_node t[N*4];void Build(int x,int l,int r){t[x].l=l;t[x].r=r;if(l==r){t[x].w=s[l];return;}int mid=(l+r)/2;Build(x*2,l,mid);Build(x*2+1,mid+1,r);t[x].w=max(t[x*2].w,t[x*2+1].w);}void DownData(int x){if(!t[x].lazy) return;t[x*2].lazy+=t[x].lazy;t[x*2+1].lazy+=t[x].lazy;t[x*2].w+=t[x].lazy;t[x*2+1].w+=t[x].lazy;t[x].lazy=0;return;}void Change(int x,int l,int r,int val){if(t[x].l==l&&t[x].r==r){t[x].w+=val;t[x].lazy+=val;return;}DownData(x);int mid=(t[x].l+t[x].r)/2;if(r<=mid) Change(x*2,l,r,val);else if(l>mid) Change(x*2+1,l,r,val);else Change(x*2,l,mid,val),Change(x*2+1,mid+1,r,val);}
}Tree;
int main()
{freopen("data.in","r",stdin);freopen("data.out","w",stdout);scanf("%d%d%d%d%d",&n,&p,&q,&x,&y);scanf("%s",a+1);n=strlen(a+1);for(int i=1;i<=n;i++)s[i]=s[i-1]+(a[i]=='+'?-1:1);Tree.Build(1,1,n);k=(q-p+s[n])/2;ans=2e9;for(int i=0;i<n;i++){if(i*y>ans) break;if(k>=0) ans=min(ans,i*y+max(Tree.t[1].w-p-k*2,0)*2*x+abs(k)*x);else ans=min(ans,i*y+max(Tree.t[1].w-p,0)*2*x+max(abs(k)-max(Tree.t[1].w-p,0),0)*x);Tree.Change(1,n-i,n-i,-s[n-i]-z);Tree.Change(1,1,n,(a[n-i]=='+'?-1:1));z+=(a[n-i]=='+'?-1:1);}printf("%d",ans);
}

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

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

相关文章

Java 并发总结——进程与线程

一、进程与线程 &#xff08;1&#xff09;线程与进程 进程是程序在一个数据集合上运行的过程&#xff0c;它是系统进行资源分配和调度的一个独立单位。进程实体由程序段&#xff0c; 数据段 PCB&#xff08;进程控制块&#xff09;组成。 线程可以看做轻量级进程&#xff0c;…

.NET Core使用skiasharp文字头像生成方案(基于docker发布)

一、问题背景目前.NET Core下面针对于图像处理的库微软并没有集成&#xff0c;在.NET FrameWork下我们已经习惯使用System.Drawing类库做简单的图像处理&#xff0c;到了.NET Core下一脸懵逼的我&#xff0c;只能百度谷歌看看有没啥解决方案&#xff0c;好在网上资料也多&#…

jzoj6375-华灵「蝶妄想」【结论题】

正题 题目大意 n∗mn*mn∗m填(((或者)))。求一个方案使得最多的行和列匹配。 解题思路 我们先考虑nnn或mmm为奇数&#xff0c;那么显然奇数的肯定不必配&#xff0c;那么就只需要考虑行或列即可。 若nnn和mmm都为偶数时 我们发现在边边的行列不可能都匹配上&#xff0c;那就…

C# - Span 全面介绍:探索 .NET 新增的重要组成部分

假设要公开特殊化排序例程&#xff0c;以就地对内存数据执行操作。可能要公开需要使用数组的方法&#xff0c;并提供对相应 T[] 执行操作的实现。如果方法的调用方有数组&#xff0c;且希望对整个数组进行排序&#xff0c;这样做就非常合适。但如果调用方只想对部分数组进行排序…

Java 并发总结——AQS

一、AQS Java并发包&#xff08;JUC&#xff09;中提供了很多并发工具&#xff0c;ReentrangLock、Semaphore、CountDownLatch&#xff0c;它们的实现都用到了一个共同的基类——AbstractQueuedSynchronizer&#xff0c;简称AQS。 AQS是一个用来构建锁和同步器的框架&#xf…

P4427-[BJOI2018]求和【LCA】

正题 题目大意:https://www.luogu.org/problem/P4427 题目大意 一棵树&#xff0c;每次给一条路径&#xff0c;求路径上每个点的深度的kkk次方的和。 解题思路 路径上分成两条深度连续的链&#xff0c;所以我们可以先预处理出kkk次方的前缀和。 然后LCALCALCA就好了。 code…

C#中DateTime的缺陷与代替品DateTimeOffset

C#中的DateTime在逻辑上有个非常严重的缺陷&#xff1a;> var d DateTime.Now;> var d2 d.ToUniversalTime();> d d2false> d.Equals(d2);false在C#交互模式中输入以上代码&#xff0c;可以发现尽管一个是本地时间&#xff08;d&#xff09;&#xff0c;一个是U…

Java SSL与TLS客户端证书配置

一、TLS安全概念 &#xff08;1&#xff09;PKI PKI是 Public Key Infrastructure的简称&#xff0c;意思是公钥基础设施。 公钥基础设施是提供公钥加密和数字签名服务的系统或平台&#xff0c;目的是为了管理密钥和证书。通过证书和秘钥来确认通讯双方是否可信任。 &#x…

P3901-数列找不同【模拟】

正题 题目链接:https://www.luogu.org/problem/P3901 题目大意 一个序列AAA&#xff0c;每次询问一个区间求这个区间的数是否各不相同。 解题思路 用lastilast_ilasti​表示前一个与iii相同数的位置。 然后Lastimax{lastj}(j<i)Last_imax\{last_j\}(j<i)Lasti​max{la…

Java RSA私钥的格式pkcs1和pkcs8、PrivateKey转换

&#xff08;&#xff09;一、私钥格式 &#xff08;1&#xff09;pkcs1 格式&#xff1a; -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- &#xff08;2&#xff09;pkcs8 格式&#xff1a; -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KE…

重磅消息-Service Fabric 正式开源

微软的Azure Service Fabric的官方博客在2017.3.24日发布了一篇博客 Service Fabric .NET SDK goes open source &#xff0c;介绍了社区呼声最高的Service Fabric开源的情况以及当前的情况&#xff0c;当时开源了Service Fabric的.NET SDK部分&#xff0c;社区一直在期盼着Ser…

Java 证书pem转KeyStore、jks文件

一、服务端pem转KeyStore CertificateFactory certificateFactory CertificateFactory.getInstance("X.509");FileInputStream caInputStream new FileInputStream(caPath);List<X509Certificate> caList certificateFactory.generateCertificates(caInput…

牛客国庆集训派对day6T A- 2016【矩阵乘法】

正题 题目链接:https://ac.nowcoder.com/acm/contest/1111/A 题目大意 2∗22*22∗2的矩阵AAA&#xff0c;求AnA^nAn 解题思路 我们将其十进制的转化过来&#xff0c;如 A2016(A103)2∗(A10)∗(A)6A^{2016}(A^{10^3})^2*(A^{10})*(A)^6A2016(A103)2∗(A10)∗(A)6 这样时间复杂…

.NET Core 配置Configuration杂谈

前言.NET Core 在配置文件的操作上相对于.NET Framework做了不少改变&#xff0c;今天来聊一聊。关于Configuration的Package都是以Microsoft.Extensions.Configuration开头的支持多种方式的配置&#xff0c;包括内存、Json文件、XML文件等等&#xff0c;今天我们主要用Json格式…

Java Jenkins Api

一、Maven <dependency><groupId>com.cdancy</groupId><artifactId>jenkins-rest</artifactId><version>0.0.20</version> </dependency> github地址&#xff1a;https://github.com/cdancy/jenkins-rest 如果需要最新的代…

秘密:从程序员到领导者的微妙之处

读到一篇关于程序员、领导力和领导者的好文章&#xff0c;翻译过来分享下。借用一句文中的话&#xff1a;“好吧&#xff0c;我只是个程序员&#xff0c;为什么需要领导&#xff1f;” &#xff0c;读完你就知道了。做一个优秀的领导者可能不是大部分程序员会立即认同的东西。许…

牛客国庆集训派对day6TJ-DefenseTower【贪心】

正题 题目链接:https://ac.nowcoder.com/acm/contest/1111/J 题目大意 一棵树&#xff0c;每个点有一个威力值&#xff0c;每次破坏一个点会受到与它相连没有破坏的点的威力值之和的伤害。求破坏所有点的最小伤害。 解题思路 因为是一棵树&#xff0c;所有我们可以看为每条边…

K8S Learning(1)——简介

一、Kubernetes kubernetes&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器——Borg系统的一个开源版本&#xff0c;于2014年9月发布第一个版本&#xff0c;2015年7月发布第一个正式版本。 kubernetes的本质是一组服务…

老衣的微服务实践简要指引2017版

这是老衣在2017年5月份总结的&#xff0c;适用于中小团队跨平台微服务开发的实践指引&#xff08;简化版&#xff09;。若有有不当之处&#xff0c;欢迎指点更正因本文涉及到大量第三方库或工具&#xff0c;详细学习和了解需要参考相关官方文档。若您在使用Mac电脑&#xff0c;…

P2052-[NOI2011]道路修建【树】

正题 题目链接:https://www.luogu.org/problem/P2052 题目大意 一棵树&#xff0c;一条边的价值是长度乘上两端点的数量差。求所有边的边权之和。 解题思路 统计子树大小就可以知道两端的数量差了。 codecodecode #include<cstdio> #include<cstring> #include…