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

news2024/11/27 16:35:10

题目

给定长为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;
}

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

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

相关文章

【爬虫实战】2024知乎热榜可视化爬取

项目功能简介&#xff1a; 1.支持配置&#xff1b; 2.单次爬取&#xff1b; 3.循环爬取&#xff1b; 4.爬虫暂停&#xff1b; 5.数据清除&#xff1b; 6.数据保存到csv文件&#xff1b; 7.程序支持打包成exe文件&#xff1b; 8.项目操作说明文档&#xff1b; 9.模块封装到类&a…

全自动网页制作系统流星全自动网页生成系统重构版输入网页信息即可制作

源码优点: 所有模板经过精心审核与修改&#xff0c;完美兼容小屏手机大屏手机&#xff0c;以及各种平板端、电脑端和360浏览器、谷歌浏览器、火狐浏览器等等各大浏览器显示。 免费制作 为用户使用方便考虑&#xff0c;全自动网页制作系统无需繁琐的注册与登入&#xff0c;直接…

大创项目推荐 疫情数据分析与3D可视化 - python 大数据

文章目录 0 前言1 课题背景2 实现效果3 设计原理4 部分代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据全国疫情数据分析与3D可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff0…

AWS CI/CD之二:配置CodeDeploy

问题 前面一篇文章介绍了CodeBuild中构建一个Java的Maven项目。在这个基础上面&#xff0c;我们继续AWS CI/CD工作流构建之路。 1.配置CodePipeline简配版 这里主要是利用CodePipeline配置之前的CodeBuild项目&#xff0c;以便生产出需要部署的jar文件和CodeDeploy需要用到相…

手把手教你薅熊链Berachain测试网空投

Berachain&#xff0c;这名字响当当&#xff01;是基于流动性证明的高性能区块链&#xff0c;结合了Tendermint和流动性共识证明&#xff0c;还采用了Celestia作为DA层。这速度快、成本低、确定性高&#xff0c;简直就是未来的大热门&#xff01;你知道吗&#xff1f;这家公司可…

异步编程Completablefuture使用详解----入门篇

JDK版本&#xff1a;jdk17 IDEA版本&#xff1a;IntelliJ IDEA 2022.1.3 文章目录 一、CompletableFuture是什么&#xff1f;二、为什么要使用CompletableFuture&#xff1f;2.1 工具类准备2.2 Future的局限性2.3 CompletableFuture的优势 三、如何使用CompletableFuture?3.1 …

Web3艺术市场:NFT与数字创作的结合

在数字时代&#xff0c;随着区块链技术的崛起&#xff0c;一种新型数字资产&#xff0c;非同质化代币&#xff08;NFT&#xff09;&#xff0c;正逐渐改变传统艺术市场的格局。这种数字化的艺术品售卖方式成为了Web3艺术市场的代表&#xff0c;推动着数字创作与艺术市场的结合。…

day05_java中的流程控制

概述 在一个程序执行的过程中&#xff0c;各条语句的执行顺序对程序的结果是有直接影响的。所以&#xff0c;我们必须清楚每条语句的执 行流程。而且&#xff0c;很多时候要通过控制语句的执行顺序来实现我们想要的功能。 流程控制语句又分为&#xff1a; 顺序结构 丶分支结构丶…

性能优化-HVX架构简介

来自 「发表于知乎专栏《移动端算法优化》」 本文主要介绍Hexagon DSP的HVX技术&#xff0c;旨在通过简单的语言讲清HVX技术。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开…

vue3 + antd 封装动态表单组件(一)

前置条件&#xff1a; vue版本 v3.3.11 ant-design-vue版本 v4.1.1 创建动态组件配置文件config.js import { Input, Textarea, InputNumber, Select, RadioGroup, CheckboxGroup, DatePicker } from ant-design-vue;// 表单域组件类型 export const componentsMap {Text: …

编译poco库出现的问题及其解决办法

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 使用vs2015编译poco库出现问题&#xff1a;error C3688: invalid literal suffix ‘I64_FMT’; literal operator or literal operator template ‘opera…

大模型:我也会自监督学习~

前言 当下大模型的能力已经很强了&#xff0c;但是将来我们想要的是能力更强的大模型&#xff0c;其最好能够处理各种复杂问题也即强对齐模型。 之前大模型训练的监督信号主要来源于人类反馈&#xff0c;但是如果想要训练一个强对齐模型必然就需要一个对应的强监督信号&#…

第二篇【传奇开心果系列】Vant 开发移动应用:开发常见页面

传奇开心果博文系列 Vant of Vue 开发移动应用示例系列博文博文目录一、常见页面的重要作用二、常见页面介绍三、分别示例代码四、常见页面样式示例代码五、主要知识点总结 Vant of Vue 开发移动应用示例系列博文 博文目录 一、常见页面的重要作用 常见页面在移动应用中扮演…

手把手教你如何快速定位bug,如何编写测试用例,快来观摩......

手把手教你如何快速定位bug,如何编写测试用例,快来观摩......手把手教你如何快速定位bug,如何编写测试用例,快来观摩......作为一名测试人员如果连常见的系统问题都不知道如何分析&#xff0c;频繁将前端人员问题指派给后端人员&#xff0c;后端人员问题指派给前端人员&#xf…

算法第二十一天-丑数

丑数 题目要求 解题思路 首先判断数字是不是为0或者负数&#xff0c;两者均不可能成为丑数&#xff1b; 之后对n进行不断整除&#xff0c;直到无法除尽为止。 简单判断最后的数是不是1即可。 代码 class Solution:def isUgly(self, n: int) -> bool:if n<0:return Fa…

linux perf工具使用

参考文章Linux性能调优之perf使用方法_perf交叉编译-CSDN博客 perf是一款Linux性能分析工具。比如打流性能优化的时候&#xff0c;就能够看到是哪些函数消耗的cpu高 那么linux如何编译perf工具呢&#xff1f; perf工具编译 进入perf目录下linux-3.16/tools/perf make ARCH…

线程状态转换

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程⛺️稳中求进&#xff0c;晒太阳 程状态转换 假设有线程Thread t 情况1 new-->RUNNABLE 当调用t.start()方法时&#xff0c;由new ->RUNNABLE 情况2 RUNNABLE WAITING t…

Spark On Hive配置测试及分布式SQL ThriftServer配置

文章目录 Spark On Hive的原理及配置配置步骤在代码中集成Spark On Hive Spark分布式SQL执行原理及配置配置步骤在代码中集成Spark JDBC ThriftServer 总结 Spark On Hive的原理及配置 Spark本身是一个执行引擎&#xff0c;而没有管理metadate的能力&#xff0c;当我们在执行S…

Redis原理篇(SkipList)

一.概述 本质是双端链表&#xff0c;只不过在正向遍历时可以不一个一个遍历&#xff0c;而是可以跳着遍历。 怎么实现的呢&#xff0c;下面是SkipList源码 二.源码 1. zskiplist 意义&#xff1a;跳表 zskiplist里面有头指针和尾指针&#xff0c;节点数量&#xff0c;最大…

Python自动化测试【selenium面试题】

一、selenium中如何判断元素是否存在&#xff1f; expected_conditions模块提供了16种判断方法&#xff0c;以下方法是判断元素存在DOM中&#xff1a; presence_of_element_located """ An expectation for checking that an element is present on the DOM of…