当前位置: 首页 > news >正文

梦熊 CSP—S模拟赛 T2youyou不喜欢夏天

原题链接

题目大意

youyou 有一个大小为 2 × n 的网格,每个格子可能是黑色或者白色。 现在 youyou yy 要在这个网格上玩一个游戏:
youyou 先选取出一个可以为空的 连通块
之后 yy 可以选择最多 m 列,将这些列上下行的格子颜色互换。
定义一个格子集合 S 为一个连通块,当且仅当 S 中任意两个点可以通过集合 S 边相邻 的若干个点连通。youyou 希望最大化最终黑色格子减白色格子的数量,而 yy 希望最小化之。现在 youyou 希望你求出:在双方都采用最优策略的情况下,最终黑色格子减白色格子的数量是多少?

解题思路

考虑 youyou 选出的连通块左右端点被确定为 l , r 。显然,全黑列他会都去选择,全白列他只会选择一个格子,因为这些不受 yy 的影响。考虑一黑一白的列。假如他两个格子都选择,那么贡献为 0, 如果只选择一个黑色的格子,虽然贡献是 1 ,但是可能被 yy
操作变成 1 。于是他有两种策略:所有的一黑一白列我们都选择两个。这样 yy 没办法操作。
x 个一黑一白列选择一个格子,其余选择两个。这样 yy 可以操作。
发现若 youyou 选择策略二为优,当且仅当至少有 2 m 个一黑一白列他选择了一个格子。否则,我们可以将这些列选择两个格子,显然连通块仍连通,对答案的贡献为 0 ;而原来对答案的贡献为 x 2 m < 0 。因此,youyou 的策略二,可以视作在 不考虑操作 的情况下选出一个连通块。我们只需求这个连通块的最大权值最后减去2m ,这一部分可以用 dp 实现。youyou 的策略一是经典最大子段和问题,也可以使用 dp 实现。
时间复杂度 O(n)。
暴力代码(80pts)
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
long long g[3][N],c;
long long ans=-2100000000,ans2=-21000000;
long long dp[N][4],f[N];
char s[3][N];
//dp[i][0]表示截止到第i列时选上面一格的最大1-0数量,dp[i][1]表示截止到第i列时选下面一格的最大1-0数量,dp[i][2]表示第i列两格都选的最大1-0数量 
int main(){int T;cin>>c>>T;while(T--){int n,m;cin>>n>>m;ans=0;ans2=0;for(int i=1;i<=n;i++)dp[i][0]=dp[i][1]=dp[i][2]=f[i]=0;cin>>(s[1]+1)>>(s[2]+1);for(int i=1;i<=2;i++){for(int j=1;j<=n;j++){if(s[i][j]=='1')g[i][j]=1;else g[i][j]=-1;//cout<<g[i][j]<<" ";}//cout<<endl;      	}//最大子段和思想 for(int i=1;i<=n;i++){long long x=g[1][i]+g[2][i];if(x==-2)x=-1;f[i]=max(f[i-1]+x,x);ans=max(f[i],ans);//cout<<"f["<<i<<"]="<<f[i]<<" ";}//cout<<endl;//cout<<"dp["<<1<<"][0]="<<dp[1][0]<<" dp["<<1<<"][1]="<<dp[1][1]<<" dp["<<1<<"][2]="<<dp[1][2]<<endl;for(int i=1;i<=n;i++){dp[i][0]=max(max(dp[i-1][0]+g[1][i],dp[i-1][2]+g[1][i]),g[1][i]); dp[i][1]=max(max(dp[i-1][1]+g[2][i],dp[i-1][2]+g[2][i]),g[2][i]); dp[i][2]=max( max( max(dp[i-1][2]+g[1][i]+g[2][i],dp[i-1][0]+g[1][i]+g[2][i]) , dp[i-1][1]+g[1][i]+g[2][i] ), g[1][i]+g[2][i]);ans2=max( max(dp[n][0],max(dp[n][1],dp[n][2]) ) ,ans2);//cout<<"dp["<<i<<"][0]="<<dp[i][0]<<" dp["<<i<<"][1]="<<dp[i][1]<<" dp["<<i<<"][2]="<<dp[i][2]<<endl;}ans=max(ans,ans2-m*2);cout<<ans<<endl;//m*2原因:若交换一个0和一个1则0的数量加1,1的数量减1,则总体数量就会减2 }return 0;
}


http://www.mrgr.cn/news/56009.html

相关文章:

  • 【中危】Oracle TNS Listener SID 可以被猜测
  • C++ 11标准——Class类(1)
  • OpenR框架深度解读 - OpenAI启发的首个开源项目提升大型语言模型推理能力
  • Redis入门:在Java程序中高效使用Redis
  • 优化分页查询
  • Java 中的【初始化块】
  • 蒙提霍尔问题
  • Claude Financial Data Analyst:基于Claude的金融数据分析工具!免费开源!
  • Java项目-基于springboot框架的校园医疗保险管理系统项目实战(附源码+文档)
  • element-时间选择器单独写两个时间选择器并按照规则进行置灰选择,精确到时分秒
  • 阿里云的 ALB (Application Load Balancer) 然后到 nginx 和具体服务时,如果超过 60 秒请求失败
  • 电子仪表计量检测产生误差的原因有哪些?数据误差原因分析
  • 【小白学机器学习19】统计基础:什么是定量分析,量化的4个层级,因果关系分类等
  • set笔记
  • HTTP错误代码解决详解
  • 雅迪控股营收、净利润和毛利下滑:销量大幅减少,屡屡抽查不合格
  • 如何成功报考PMP:5个必备步骤
  • 小型内衣裤洗衣机哪个牌子好?揭晓五款巅峰热门机型,精心挑选
  • 双十一有哪些值得买的东西?2024年最全双十一好物推荐榜单来了!
  • 宠物用品电商网站:SpringBoot框架设计与开发
  • 基于SpringBoot+Vue的网上超市系统的设计与实现(带文档)
  • 计算机保研/考研资料分享
  • 右上角的钩自存elemntui样式
  • MedSAM微调版,自动生成 Prompt 嵌入实现图像分割!
  • 集成平台,互联互通平台,企业大数据平台建设方案,技术方案(Word原件 )
  • 最优化理论-最优化1