Codeforces Round 803 (Div. 2) E. PermutationForces II(思维题 位置序列)

题目

给定长为n(n<=2e5)的两个序列a和b,

a为n的一个排列,

b也为n的一个排列,但有一些位置被-1替换了,保证没被替换的位置在[1,n]之间且两两不同

你有一个距离最大限制s,你可以执行n次操作,

第i次操作时(1<=i<=n),

你可以选择满足i<=x<=y<=min(i+s,n)的两个值(x,y),

交换这两个值在a序列里的位置,

你可以选择x=y,也就是意味着可以不操作

现在你可以将b中的每个-1的位置替换上对应的[1,n]内的值,使得b是一个排列,

如果替换成排列之后的序列b,可以由a序列在n次交换后得到,则称b序列是合法的,

问所有合法的b序列的方案数,答案对998244353取模

实际为t(t<=1e3)组样例,保证sumn不超过2e5

思路来源

洛谷题解

CF1698E PermutationForces II Solution - 思考人生中 的博客 - 洛谷博客

题解

首先考虑无解的情况,由于第i次只能交换[i,i+s]内的两个值,

不妨第i次交换,就是使i这个值在b序列中归位

若b[i]需要被归位,且当前占住i位置的值a[i]>b[i]+s,

说明增序考虑到i时,a[i]是被换不走的,此时无解

所以,合法的条件是,对于b[i]不为-1的位置,要求a[i]的值不能超过b[i]+s

b[i]!=-1, max_{i=1}^{n}(a[i]-b[i]) \leq s

有解之后,考虑怎么操作,首先考虑给转换成位置序列

即,若a[i]=j,则令posa[j]=i;若b[i]=j,则令posb[j]=i

举一个例子,即第五个样例

原序列:

n=7,s=4

a: 1 3 6 2 7 4 5

b: 2 5 1 -1 -1 4 -1

转化序列:

posa: 1 4 2 6 7 3 5

posb: -1 1 -1 6 2 -1 -1

对于posb的每一个为-1的位置i,

只有posa序列[1,min(i+s,n)]中,那些值没有在posb中出现过的位置是可取的,

记这个值的个数为cnt,则对于每个posb的-1位置,

有cnt个值是可取的,每取走一个,即令ans*=cnt,cnt-=1

比如,在为posb[1]=-1这个未确定的位置赋值的时候,posb[1]的值,

可以在[1 4 2 6 7],也就是[1,1+s]这个区间里取,但是只能用[4 7]这两个值,

因为1 2 6在posb中出现过,只能换到一一对应的位置去

也就是说,4个-1位置可以用到的值是4 7 3 5,

其中,

posb[1]只能用到[1,5]里的可用位置,即[1 4 2 6 7]里的[4 7],ans*=2

posb[3]可以用到[1,7]里的可用位置,即[1 4 2 6 7 3 5]里的[4 7 3 5],

而其中[4 7]有一个被posb[1]用过,所以ans*=3

类似地,posb[6]和posb[7]都可以用到[1,7]里的可用位置,分别对应ans*=2和ans*=1

所以,ans=2*3*2*1=12

每个前面的不确定位置只能用一个值,前面没有用到的值可以被换下来换到后面, 

所以posb[i]=-1的位置,可以用到[1,min(i+s,n)]的所有可用位置

双指针模拟这个过程即可,复杂度O(n)

代码

#include<iostream>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define scll(a) scanf("%lld",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int N=2e5+10,mod=998244353;
int t,n,s,a[N],b[N],posa[N],posb[N];
bool vis[N];
/*
原序列
n=7 s=4
a: 1 3 6 2 7 4 5
b: 2 5 1 -1 -1 4 -1
转化序列
posa: 1 4 2 6 7 3 5
posb: -1 1 -1 6 2 -1 -1
其中4 7 3 5是可用的-1位置,第一个位置只能用到[1 4 2 6 7]里的可用位置
对于posb的每一个为-1的位置i,只有posa中[1,min(i+s,n)]中,那些值没有在posb中出现过的位置是可取的,记这个值的个数为cnt,则对于每个posb的-1位置,ans*=cnt,cnt-=1
*/
int sol(){
    sci(n),sci(s);
    rep(i,1,n){
        sci(a[i]);
        posa[a[i]]=i;
        posb[i]=-1;
        vis[i]=0;
    }
    rep(i,1,n){
        sci(b[i]);
        if(b[i]==-1)continue;
        posb[b[i]]=i;
        vis[i]=1;
    }
    rep(i,1,n){
        if(b[i]==-1)continue;
        //printf("i:%d a:%d b:%d\n",i,a[i],b[i]);
        if(a[i]-b[i]>s)return 0; //若b[i]需要被归位,且当前占住i位置的值a[i]>b[i]+s,说明增序考虑到i时,a[i]是挪不走的,无解
    }
    int cur=0,ans=1,cnt=0;
    rep(i,1,n){
        while(cur+1<=min(n,i+s)){
            cur++;
            cnt+=(!vis[posa[cur]]);
        }
        //printf("i:%d cur:%d cnt:%d\n",i,cur,cnt);
        if(posb[i]==-1){
            ans=1ll*ans*cnt%mod;
            cnt--;
        }
    }
    return ans;
}
int main(){
    sci(t);
    while(t--){
        pte(sol());
    }
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【现代密码学基础】详解完美安全与不可区分安全

目录 一. 介绍 二. 不可区分性试验 三. 不可区分性与完美安全 四. 例题 五. 小结 一. 介绍 敌手完美不可区分&#xff0c;英文写做perfect adversarial indistinguishability&#xff0c;其中adversarial经常被省略不写&#xff0c;在密码学的论文中经常被简称为IND安全。…

视频增强修复Topaz Video AI

Topaz Video AI是一款强大的视频增强软件&#xff0c;利用人工智能技术对数千个视频进行训练&#xff0c;结合多个输入视频的帧信息来提高素材的分辨率。该软件可将视频的分辨率提高到最高8K&#xff0c;并保持真实的细节和运动一致性。同时&#xff0c;它还能自动修复视频中的…

Linux系统CPU持续飙高,如何排查?

一、检查CPU使用率 首先在Linux系统中检查CPU使用率。可以通过在命令行中输入top或htop命令来查看当前系统中各个进程的CPU使用率。如果CPU使用率大于80%&#xff0c;则可以考虑进行排查。 $ top 二、检查系统负载 另外可以使用uptime命令来查看系统的平均负载情况。 $ upti…

DiffMIC:融合局部和全局分析,基于扩散模型的医学图像分类方法

DiffMIC&#xff1a;基于扩散模型的医学图像分类方法 DiffMIC的核心思想糖尿病视网膜病变分级 网络结构去噪扩散模型&#xff1a;提升特征清晰度双粒度条件引导&#xff08;DCG&#xff09;&#xff1a;融合局部和全局分析条件特定的最大均值差异&#xff08;MMD&#xff09;正…

【Java】JDBC练习

JDBC练习 环境准备 -- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand (-- id 主键id int primary key auto_increment,-- 品牌名称brand_name varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered …

C++设计模式之 模板方法模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 --什么是模板方法模式&#xff08;第18种设计模式&#xff09; 模板方法模式&#xff0…

《Linux高性能服务器编程》笔记02

Linux高性能服务器编程 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第06章 高级I/O函数6.1 pipe函数6.2 dup函数和dup2函数6.3 readv 函数和writev 函数6.4 sendfile 函数6.…

基于SSM的KTV包厢管理系统(有报告)。Javaee项目,ssm项目。

演示视频&#xff1a; 基于SSM的KTV包厢管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过…

软件测试|sqlalchemy一对一关系详解

简介 SQLAlchemy 是一个强大的 Python ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它允许我们将数据库表映射到 Python 对象&#xff0c;并提供了丰富的关系模型来处理不同类型的关系&#xff0c;包括一对一关系。在本文中&#xff0c;我们将深入探讨 SQLAlchemy …

后台管理系统: 数据可视化基础

数据可视化简单理解&#xff0c;就是将数据转换成易于人员辨识和理解的视觉表现形式&#xff0c;如各种 2D 图表、3D 图表、地图、矢量图等等。 例如Excel等等 canvas <canvas> 标签只是图形容器&#xff0c;相当于一个画布&#xff0c;canvas 元素本身是没有绘图能力…

算法常用思路总结

思路 1. 求数组中最大最小值思路代码 2. 计算阶乘思路&#xff1a;代码&#xff1a; 3. 得到数字的每一位思路代码 4. 计算时间类型5. 最大公约数、最小公倍数6. 循环数组的思想题目&#xff1a;猴子选大王代码 补充经典例题1. 复试四则运算题目内容题解 2. 数列求和题目内容题…

安防监控系统EasyCVR平台用户调用设备参数,信息不返回是什么原因?

安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;平台能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台支持设备通过4G、5G、WIFI、有…

限流算法之流量控制的平滑之道:滑动时间窗算法

文章目录 引言简介优点缺点样例样例图样例代码 应用场景结论 引言 在互联网应用中&#xff0c;流量控制是一个重要的组件&#xff0c;用于防止系统过载和保护核心资源。常见的限流算法包括固定窗口算法和滑动时间窗算法。本文将重点介绍滑动时间窗算法&#xff0c;并分析其优缺…

掌握虚拟化:PVE平台安装教程与技术解析

&#x1f31f;&#x1f30c; 欢迎来到知识与创意的殿堂 — 远见阁小民的世界&#xff01;&#x1f680; &#x1f31f;&#x1f9ed; 在这里&#xff0c;我们一起探索技术的奥秘&#xff0c;一起在知识的海洋中遨游。 &#x1f31f;&#x1f9ed; 在这里&#xff0c;每个错误都…

Windows系统下使用docker-compose安装mysql8和mysql5.7

windows环境搭建专栏&#x1f517;点击跳转 win系统环境搭建&#xff08;十四&#xff09;——Windows系统下使用docker安装mysql8和mysql5.7 文章目录 win系统环境搭建&#xff08;十四&#xff09;——Windows系统下使用docker安装mysql8和mysql5.7MySQL81.新建文件夹2.创建…

结构体的使用和结构体指针的定义注意事项

1、使用背景 由于想把不同地方的三个变量数据存放在一个结构体中&#xff0c;并且调用W25QXX_Write((u8*)p,FLASH_SIZE-100,SIZE); //从倒数第100个地址处开始,写入SIZE长度的数据。调用flash写数据函数&#xff0c;其参数为指针地址&#xff0c;于是需要定义一个结构体和指向结…

最小二乘法拟合二维点

方法1&#xff1a;使用np.polyfit()函数进行拟合 import numpy as np import matplotlib.pyplot as plt# 模拟数据 x np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) y np.array([1, 3, 2, 4, 7, 10, 11, 15, 17, 20])# 使用多项式拟合&#xff0c;这里选择二次多项式 coefficie…

C++——函数的定义

1&#xff0c;概述 作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码 一个较大的程序&#xff0c;一般分为若干个程序块&#xff0c;每个模块实现特定的功能。 2&#xff0c;函数的定义 函数的定义一般主要有五个步骤&#xff1a; 1&#xff0c;返回…

macOS修改默认时区显示中国时间

默认时区不是中国,显示时间不是中国时间 打开终端 ,删除旧区,并复制新时区到etcreb sudo -rm -rf /etc/localtime sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 重启系统后时间显示为中国时间

日志记录logging

文章目录 1. logging基础使用1.1 日志的6个级别1.2 logging.basicConfig1.3 案例 2. logging的高级应用2.1 记录器Logger2.2 处理器- Handler2.3 格式器- Formatter2.4 创建关联2.4 案例 3.在项目中的应用3.1 定义全局使用的logger对象3.2 使用案例 参考 1. logging基础使用 1…