ARC132D-Between Two Binary Strings【贪心】

1|0正题

题目链接:https://atcoder.jp/contests/arc132/tasks/arc132_d


1|1题目大意

给出两个恰好有n1m0的字符串s,t,定义两个字符串距离为通过交换两个相邻的字符把一个变成另一个的最小步数。

对于字符串k如果dis(s,k)+dis(k,t)=dis(s,t)那么ks,t之间。

定义一个字符串的权值为相邻的相同字符对数。

求所有在s,t之间的字符串中权值最大是多少。

1n+m3×105


1|2解题思路

先考虑在s,t之间的字符串有什么性质,显然的我们对于求dis(s,t)的时候最优的策略肯定是把s的第i1移动到t的第i1处。

也就是对于两个串中第i1的位置记为x,y,那么就是一个一要从xy,也就是在st之间的字符串第i个一肯定在xy这个范围。

这样我们处理出每个1的合法区间li,ri,显然的liri必定递增,因为交换两个1的顺序必定不划算。所以可以考虑贪心。

不考虑边界的问题,那么我们显然要让1的连续段尽量少,那么从小到大考虑l,r如果能和上一个放一起就放一起,不然就放在r的位置最赚。

然后考虑边界,右边界可以直接判断因为我们肯定是尽量往右放的。左边界的话我们如果l1=1我们就分两种情况考虑,也就是第一个放在左边界和第一个放在r1两种情况取个最大值。

时间复杂度:O(n+m)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #define lowbit(x) (x&-x) using namespace std; const int N=6e5+10; int A,B,m,n,t[N],l[N],r[N],ans,prt; char a[N],b[N]; //void Change(int x,int val){ // while(x<=m){ // t[x]+=val; // x+=lowbit(x); // } // return; //} //int Ask(int x){ // int ans=0; // while(x){ // ans+=t[x]; // x-=lowbit(x); // } // return ans; //} int main() { scanf("%d%d",&A,&B);m=A+B; scanf("%s",a+1); scanf("%s",b+1); for(int i=1;i<=m;i++) if(a[i]=='1')l[++n]=i; n=0; for(int i=1;i<=m;i++) if(b[i]=='1')r[++n]=i; for(int i=1;i<=n;i++){ if(l[i]>r[i])swap(l[i],r[i]); } int last=-1; for(int i=1;i<=n;i++){ if(l[i]<=last+1)last++; else ans++,last=r[i]; } ans=ans*2; if(last!=m)ans++; prt=m-ans; if(l[1]==1){ last=1;ans=1; for(int i=2;i<=n;i++){ if(l[i]<=last+1)last++; else ans+=2,last=r[i]; } if(last!=m)ans++; ans=m-ans; prt=max(prt,ans); } printf("%d\n",prt); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15735415.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(138)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示