1600*C. Binary String Copying

https://codeforces.com/problemset/problem/1849/C

Binary String Copying - 洛谷

解析:

对于某个区间x,y,他排序之后,最左侧的连续0和最右侧的连续1是不影响排序结果的。

假设左侧连续a个0,右侧b个1,那么对于 [x,y]排序,和对于[x+a,y-b]排序是一样的。

所以我们记录每个位置最近的右侧1的坐标和最左侧的0的坐标,每次将范围映射到更小的唯一区间里里面即可。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int t,n,m,a[N],l[N],r[N],k;
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		k=0;
		for(int i=1;i<=n;i++){
			scanf("%1d",&a[i]);
			if(a[i]==0) k=i;
			l[i]=k;
		}
		k=n+1;
		for(int i=n;i>=1;i--){
			if(a[i]==1) k=i;
			r[i]=k;
		}
		set<pair<int,int>>res;
		for(int i=1;i<=m;i++){
			int x,y;
			scanf("%d%d",&x,&y);
			x=r[x];
			y=l[y];
			if(x>y) x=1,y=1;
			res.insert({x,y});
		}
		printf("%d\n",res.size());
	}
	return 0;
}
相关推荐
倔强的小石头_1 小时前
【C语言指南】函数指针深度解析
java·c语言·算法
Yasin Chen1 小时前
C# Dictionary源码分析
算法·unity·哈希算法
_Coin_-2 小时前
算法训练营DAY27 第八章 贪心算法 part01
算法·贪心算法
iCxhust5 小时前
c# U盘映像生成工具
开发语言·单片机·c#
许小燚6 小时前
线性表——双向链表
数据结构·链表
yangzhi_emo6 小时前
ES6笔记2
开发语言·前端·javascript
董董灿是个攻城狮6 小时前
5分钟搞懂什么是窗口注意力?
算法
Dann Hiroaki6 小时前
笔记分享: 哈尔滨工业大学CS31002编译原理——02. 语法分析
笔记·算法
emplace_back7 小时前
C# 集合表达式和展开运算符 (..) 详解
开发语言·windows·c#
jz_ddk7 小时前
[学习] C语言数学库函数背后的故事:`double erf(double x)`
c语言·开发语言·学习