善于拆约束条件+合并相关项+DS维护:0928T2

http://cplusoj.com/d/senior/p/SS230928B

老套路了

考虑枚举0和2

m + j + m i n ( f a m − g a j , f b m − g b j ) \large m+j+min(fa_m-ga_j,fb_m-gb_j) m+j+min(famgaj,fbmgbj)

然后拆一下min,再分情况讨论一下,移项合并相同的

以其中一种情况为例

f a m − g a j ≤ f b m − g b j → f a m − f b m ≤ g a j − g b j \large fa_m-ga_j\le fb_m-gb_j \to fa_m-fb_m\le ga_j-gb_j famgajfbmgbjfamfbmgajgbj

m + f a m + ( − g a j + j ) \large m+fa_m+(-ga_j+j) m+fam+(gaj+j)

后面拿个ds维护即可

#include<bits/stdc++.h>
using namespace std;
//#define int long long
inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'||
ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
//mt19937 rand(time(0));
//mt19937_64 rand(time(0));
//srand(time(0));
#define N 5000010
//#define M
//#define mo
int n, m, i, j, k, T;
int sa[N], fa[N], ga[N], pa0[N], pa2[N]; 
int sb[N], fb[N], gb[N], pb0[N], pb2[N]; 
int ans, mx, p, pm; 
char str[N]; void work(int *s, int *f, int *g, int *p0, int *p1) {fill(s, s+n+1, 0); fill(f, f+n+1, 0); fill(g, g+n+1, 0); fill(p0, p0+n+1, 0); fill(p1, p1+n+1, 0); for(i=1; i<=n; ++i) if(str[i]=='1') s[i]=1; for(i=1; i<=n; ++i) s[i]+=s[i-1]; for(i=1, j=0; i<=n; ++i) if(str[i]=='0') f[++j]=s[i], p0[j]=i; for(i=n, j=0; i>=1; --i) if(str[i]=='2') g[++j]=s[i], p1[j]=i; 
//	reverse(g+1, g+j+1); 
//	reverse(p1+1, p1+j+1); 
}struct Tree_Bin {int cnt[N<<1], i; void mem() {for(i=0; i<(N<<1); ++i) cnt[i]=-1e9; }void add(int op, int x, int y) {x*=op; x+=N; while(x<(N<<1)) cnt[x]=max(cnt[x], y), x+=x&-x; }int que(int op, int x) {x*=op;x+=N;  int ans=-1e9; while(x) ans=max(ans, cnt[x]), x-=x&-x; return ans; }
}Bin1, Bin2;signed main()
{
	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);freopen("b.in", "r", stdin);freopen("b.out", "w", stdout);T=read();while(T--) {ans=0; Bin1.mem(); Bin2.mem(); scanf("%s", str+1); n=strlen(str+1); work(sa, ga, fa, pa0, pa2); scanf("%s", str+1); // only 1work(sb, gb, fb, pb0, pb2); 
//		cout<<"sa : "; for(i=1; i<=n; ++i) printf("%d ", sa[i]); printf("\n"); 
//		cout<<"sb : "; for(i=1; i<=n; ++i) printf("%d ", sb[i]); printf("\n"); 
//		cout<<"pa0 : "; for(i=1; i<=n; ++i) printf("%d ", pa0[i]); printf("\n"); 
//		cout<<"pa2 : "; for(i=1; i<=n; ++i) printf("%d ", pa2[i]); printf("\n"); ans=min(sa[n], sb[n]); for(i=1, mx=m=0; i<=n; ++i) {if(pa0[i] && pb0[i]) {++mx; ans=max(ans, mx+min(sa[n]-sa[pa0[mx]], sb[n]-sb[pb0[mx]])); //only 0 & 1} if(pa2[i] && pb2[i]) ++m; }//at most mx 0 reverse(fa+1, fa+m+1); reverse(pa2+1, pa2+m+1); reverse(fb+1, fb+m+1); reverse(pb2+1, pb2+m+1); //		cout<<"pa2 : "; for(i=1; i<=n; ++i) printf("%d ", pa2[i]); printf("\n"); 
//		cout<<"pb2 : "; for(i=1; i<=n; ++i) printf("%d ", pb2[i]); printf("\n"); pm=m; ans=max(ans, mx); // only 0for(i=1, m=0, j=1; i<=n; ++i) if(pa2[i] && pb2[i]) { ++m; while(j<=mx && pa0[j]<pa2[m] && pb0[j]<pb2[m]) {Bin1.add(-1, ga[j]-gb[j], -ga[j]+j); Bin2.add(1, ga[j]-gb[j], -gb[j]+j); ++j; }
//				printf("(%d[%d] %d)\n", m, pm-m+1, j-1)			; ans=max(ans, pm-m+1+min(sa[pa2[m]], sb[pb2[m]])); // only 1 & 2				p=fa[m]-fb[m]; ans=max(ans, pm-m+1+fa[m]+Bin1.que(-1, p)); ans=max(ans, pm-m+1+fb[m]+Bin2.que(1, p)); }ans=max(ans, m); //only 2
//		printf("%d %d\n", mx, m); printf("%d\n", ans); }return 0;
}

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

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

相关文章

DAMA-DMBOK2重点知识整理CDGA/CDGP——第14章 大数据与数据科学

目录 一、分值分布 二、重点知识梳理 1、引言 1.1 业务驱动因素 1.2 原则 1.3 基本理念 2、活动 2.1 定义大数据战略和业务需求 2.2 选择数据源 2.3 获得和接收数据源 2.4 制定数据假设和方法 2.5 集成和调整数据进行分析 2.6 使用模型探索数据 2.7 部署和监控 …

Linux CentOS7 vim多文件与多窗口操作

窗口是可视化的分割区域。Windows中窗口的概念与linux中基本相同。连接xshell就是在Windows中新建一个窗口。而vim打开一个文件默认创建一个窗口。同时&#xff0c;Vim打开一个文件也就会建立一个缓冲区&#xff0c;打开多个文件就会创建多个缓冲区。 本文讨论vim中打开多个文…

[Java框架] Java常用爬虫框架推荐

Selenium GitHub 截止 2023年9月份 Star数量27.7K Selenium是一款基于浏览器自动化的工具&#xff0c;它可以模拟用户在浏览器上的操作行为&#xff0c;并获取网页上的内容。Selenium支持多种浏览器&#xff0c;可以很好地处理JavaScript生成内容。但是Selenium相较于其他框架而…

【单片机】14-I2C通信之EEPROM

1.EEPROM概念 1.EEPROM 1.1 一些概念 &#xff08;1&#xff09;一些概念&#xff1a;ROM【只读存储器---硬盘】&#xff0c;RAM【随机访问存储器--内存】&#xff0c;PROM【可编程的ROM】&#xff0c;EPROM【可擦除ROM】&#xff0c;EEPROM【电可擦除ROM】 1.2 为什么需要EE…

应用大五人格测试,来做个人职业规划

应用大五人格测试做职业规划&#xff0c;一方面能让大学生清楚知晓自己的性格特征&#xff0c;置身适合怎样的职业&#xff0c;让他们结合自己的兴趣爱好职业走向&#xff0c;进一步了解自己适合做的职业规划。另一方面可以帮助他们结合职业规划来安排人生&#xff0c;一步一个…

Transformer学习-self-attention

这里写自定义目录标题 Self-attentionMulti-head self-attention用self-attention解决其他问题 Self-attention 用Wq、Wk、Wv分别乘输入向量得到q、k、v向量 用每个q向量乘所有的k向量得到对应项的attention&#xff0c;即用每项的query向量去匹配所有的key向量&#xff0c;得…

【进阶C语言】自定义类型

本节内容大致目录如下&#xff1a; 1.结构体 2.位段 3.枚举 4.联合&#xff08;共用体&#xff09; 以上都是C语言中的自定义类型&#xff0c;可以根据我们的需要去定义。 一、结构体 一些基础知识在初阶C语言的时候已经介绍过&#xff0c;在这里粗略概括&#xff1b;重…

代码随想录算法训练营第五十五天 | 动态规划 part 12 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

目录 300.最长递增子序列思路代码 674. 最长连续递增序列思路代码 718. 最长重复子数组思路代码 300.最长递增子序列 Leetcode 思路 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度递推公式&#xff1a;if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1)初…

面试总结之Spring篇

一、AOP 1、什么是AOP 1.1、概述 AOP&#xff08;Aspect-Oriented Programming&#xff09;&#xff1a;面向切面编程&#xff0c;即把一些业务逻辑中的相同代码抽取出来&#xff0c;让业务逻辑更加简练清爽 如果要CRUD写一堆业务&#xff0c;可如何实现业务代码前后进行打印…

计算机竞赛 深度学习驾驶行为状态检测系统(疲劳 抽烟 喝水 玩手机) - opencv python

文章目录 1 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的驾…

WebSocket的那些事(6- RabbitMQ STOMP目的地详解)

目录 一、目的地类型二、Exchange类型目的地三、Queue类型目的地四、AMQ Queue类型目的地五、Topic类型目的地 一、目的地类型 在上节 WebSocket的那些事&#xff08;5-Spring STOMP支持之连接外部消息代理&#xff09;中我们已经简单介绍了各种目的地类型&#xff0c;如下图&…

【强化算法专题一】双指针算法

【强化算法专题一】双指针算法 1.双指针算法--移动零2.双指针算法--复写零3.双指针算法--快乐数4.双指针算法--盛水最多的容器5.双指针算法--有效三角形的个数6.双指针算法--和为s的两个数7.双指针算法--三数之和8.双指针算法--四数之和 1.双指针算法–移动零 算法原理解析----…

java开发岗位面试

java开发岗位面试 技术栈&#xff1a;springboot框架&#xff0b;redis 个人笔试/技术面问题整理 1、SpringBoot有什么组件&#xff1f; 举例说几个&#xff1a; ①auto-configuration组件&#xff1a;核心特征。其约定大于配置思想&#xff0c;赋予了SpringBoot开箱即用的强…

Maven-DskipTests和-Dmaven.test.skip=true的区别

DskipTeststrue和-Dmaven.test.skiptrue的区别 1、 -DskipTeststrue 不执行测试用例&#xff0c;但编译测试用例类生成相应的class文件至target/test-classes下&#xff0c;如&#xff1a; mvn clean package -DskipTeststrue2、 -Dmaven.test.skiptrue 完全忽略测试代码的…

maui 开发AMD CPU踩的坑。

刚换的 amd R7735HS 笔记本&#xff0c;8核16线程&#xff0c;32GB内存。性能得实强悍 。 当需要发布iOS版本时发现&#xff0c;我没有macos &#xff0c;那就安装个vmware 吧。看了一下Apple 要求以后的发布的APP需要以xcode14.3或以后版本开发的版本&#xff0c;但xcode14.3…

oracle 乱码(编码为AMERICAN_AMERICA.US7ASCII)问题解决

案例 &#xff1a;mysql数据同步到oracle 注意&#xff1a; 不要使用navicat&#xff0c;navicat有自己的编码&#xff0c;使用plsql客户端查看数据&#xff0c;plsql客户端与oracle编码保持一致即可 service类 本地用的多数据源 com.baomidou dynamic-datasource-spring-boot…

c++内存对齐

原文在这里。https://blog.csdn.net/WangErice/article/details/103598081 但是内容有错误。我在自己的这里修改并变成红色了。 内存在使用过程并不是单一的依次排列&#xff0c;而是按照某种既定的规则来进行对齐&#xff0c;以方便快速访问.内存的对齐原则有以下三条&#…

深度学习与python theano

文章目录 前言1.人工神经网络2.计算机神经网络3.反向传播4.梯度下降-cost 函数1.一维2.二维3.局部最优4.迁移学习 5. theano-GPU-CPU theano介绍1.安装2.基本用法1.回归2.分类 3.function用法4.shared 变量5.activation function6.Layer层7.regression 回归例子8.classificatio…

【JavaScript】读取本地json文件并绘制表格

本文为避免跨域问题&#xff0c;使用了改造过的本地json文件的方法实现读取json数据并绘制表格。 如果发起http请求获取本地 json文件中数据&#xff0c;需要架设本地服务器&#xff0c;本文不做阐述。 概述 1、json在本地&#xff0c;并不需要从服务器下载。 2、采用jquery…

国庆作业day5

应用层&#xff1a;提供用户与网络应用程序之间的接口。表示层&#xff1a;负责数据的格式转换、加密和解密。会话层&#xff1a;负责建立、管理和终止会话。它提供会话控制和同步&#xff0c;允许应用程序之间建立连接和交换数据。传输层&#xff1a;提供端到端的连接。网络层…