[atARC128F]Game against Robot
为了方便,下文中的$n$是原来的$\frac{n}{2}$
当确定排列$\{p_{i}\}$后,将$a_{i}$按照$p_{i}$从大到小排序,那么机器人即会不断选第一个元素
考虑玩家最后选择的$n$个元素,合法当且仅当$\forall 1\le i\le n,$其在前$2i$个元素至多选$i$个元素
必要性:考虑前$i$轮,机器人选的总在前$2i$个元素中,反之也即玩家至多在前$2i$个元素中选$i$个元素
充分性:每一轮,玩家不断选择第一个要选的元素
若这样的策略不合法,必然是某次机器人选了玩家要选的元素,假设第一次出现此情况是第$i$轮,由策略该元素前恰有$i$个玩家要选的元素和$i-1$个玩家不选的元素,也即前$2i$个元素中有$i+1$个元素,矛盾
反之也即等价于在后$2i$个元素中,至少选$i$个元素,考虑下述过程:
维护可重集$S$(初始为空),从大到小枚举$i\in [1,n]$,将$a_{2i-1},a_{2i}$加入$S$,并取出$S$中最大的元素(至少要再额外选一个),那么$n$次所取出的元素和即是答案
回到原问题,也即对$\{a_{i}\}$的所有排列求上述过程的答案和
将答案转化为$\sum_{x\in Z^{+}}$取出元素$\ge x$的次数,而对于一个确定的$x$,将元素按照是否$\ge x$标记为01,此时仅需考虑一个01序列的答案(取1的次数)
记$cnt_{i}$为后$2i$个位置中1的个数,则答案为$\min_{0\le i\le n}(cnt_{i}+n-i)$
对此进行归纳——
考虑第$i$次取元素时,$S$中已加入了$cnt_{i}$个1、取出了$\min_{0\le j<i}(cnt_{j}+(i-1)-j)$个1(记后者为$s$),显然取出1当且仅当$[cnt_{i}>s]$,进而(新)答案即$s+[cnt_{i}>s]$
代入式子,也即求证$\min_{0\le j\le i}(cnt_{j}+i-j)=s+[cnt_{i}>s]$,两者均可转换为$\min(s+1,cnt_{i})$,显然相等,即得证
交换排列和$x$的枚举顺序,问题即变为:求所有长为$2n$且恰有$k$个1的01序列上述答案之和
(其中$k$为$\ge x$的元素个数,由于01内部也是不同的,最后还要乘上$k!(2n-k)!$)
为了方便处理,对问题做以下变形——
将序列翻转并将0变为-1,记$sum_{i}$为前缀和,则答案为$n+\frac{\min_{0\le i\le n}sum_{i}}{2}$
$n$可以直接统计,后者转化为$-\sum_{x_{0}\in Z^{-}}[\min_{0\le i\le n}sum_{2i}\le 2x_{0}]$,并交换序列和$x_{0}$的枚举顺序
分析奇偶性,若$sum_{2i+1}\le 2x_{0}$则$sum_{2i}\le 2x_{0}$,进而不妨转换为$\min_{0\le i\le 2n}sum_{i}\le 2x_{0}$
简单构造,问题即统计从$(0,0)$到$(2n,2k-2n)$,每一步$x$坐标+1、$y$坐标$\pm 1$且与$x=2x_{0}$有公共点的路径数
这是一个经典问题,通过翻转可得答案为$\begin{cases}{2n\choose k}&(x_{0}\ge k-n)\\{2n\choose k-2x_{0}}&(x_{0}<k-n)\end{cases}$
将其累加,总答案为$\begin{cases}\sum_{k<i\le 2n,i\equiv k(mod\ 2)}{2n\choose i}&(k-n\ge 0)\\(n-k){2n\choose k}+\sum_{2n-k<i\le 2n,i\equiv k(mod\ 2)}{2n\choose i}&(k-n<0)\end{cases}$
两者都可以通过简单预处理快速求出,同时$x$的枚举仅需要考虑$x=a_{i}$的取值
时间复杂度为$o(n)$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1000005
4 #define mod 998244353
5 #define ll long long
6 int n,m,ans,a[N],fac[N],inv[N],sum[N];
7 int C(int n,int m){
8 return (ll)fac[n]*inv[m]%mod*inv[n-m]%mod;
9 }
10 int calc(int k){
11 int ans=(ll)n*C(m,k)%mod;
12 if (k>=n)ans=(ans-sum[k+2]+mod)%mod;
13 else ans=(ans-((ll)(n-k)*C(m,k)+sum[m-k+2])%mod+mod)%mod;
14 return (ll)ans*fac[k]%mod*fac[m-k]%mod;
15 }
16 int main(){
17 fac[0]=inv[0]=inv[1]=1;
18 for(int i=1;i<N;i++)fac[i]=(ll)fac[i-1]*i%mod;
19 for(int i=2;i<N;i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
20 for(int i=1;i<N;i++)inv[i]=(ll)inv[i-1]*inv[i]%mod;
21 scanf("%d",&m),n=(m>>1);
22 for(int i=1;i<=m;i++)scanf("%d",&a[i]);
23 sort(a+1,a+m+1);
24 for(int i=m;i;i--)sum[i]=(sum[i+2]+C(m,i))%mod;
25 for(int i=1;i<=m;i++)
26 if ((i==1)||(a[i]!=a[i-1]))ans=(ans+(ll)(a[i]-a[i-1])*calc(m-i+1))%mod;
27 printf("%d\n",ans);
28 return 0;
29 }
[atARC128F]Game against Robot的更多相关文章
- Robot Framework用户手册 (版本:3.0)
版权信息:诺基亚网络和解决中心 本翻译尊重原协议,仅用于个人学习使用 1.开始: 1.1 介绍: Robot Framework是一个基于Python的,为终端测试和验收驱动开发(ATDD)的可扩展的 ...
- selenium webdriver 右键另存为下载文件(结合robot and autoIt)
首先感谢Lakshay Sharma 大神的指导 最近一直在研究selenium webdriver右键菜单,发现selenium webdriver 无法操作浏览器右键菜单,如图 如果我想右键另存为 ...
- RIDE -- Robot Framework setup
RobotFramework 是一款基于python 的可以实现关键字驱动和数据驱动并能够生成比较漂亮的测试报告的一款测试框架 这里使用的环境是 python-2.7.10.amd64.msi RID ...
- [8.2] Robot in a Grid
Imagine a robot sitting on the upper left corner of grid with r rows and c columns. The robot can on ...
- Robot Framework自动化测试 ---视频与教程免费分享
当我第一次使用Robot Framework时,我是拒绝的.我跟老大说,我拒绝其实对于习惯了代码的自由,所以讨厌这种“填表格”式的脚本.老大说,Robot Framework使用简单,类库丰富,还可以 ...
- robot创建桌面图标(转载)
桌面ride图标,安装之后会自动创建(偶尔也会创建失败),创建桌面图标方法如下: 1. 新建快捷方式 在桌面右击鼠标,弹出的菜单选择 新建-快捷方式 ,然后在"请键入对象"的位置输 ...
- Robot Framework 的安装和配置(转载)
Robot Framework 的安装和配置 在使用 RF(Rebot framework)的时候需要 Python 或 Jython 环境,具体可根据自己的需求来确定.本文以在有 Python 的环 ...
- 解决从jenkins打开robot framework报告会提示‘Opening Robot Framework log failed ’的问题
最新的jenkins打开jenkins robot framework报告会提示如下 Verify that you have JavaScript enabled in your browser. ...
- 在centos7中安装Robot Framework
安装前景介绍: 最初,我们是在Windows环境下搭建Robot Framework来对我们的服务进行接口测试的(想知道如何在Windows下安装Robot Framework,可以参考我同事的博客h ...
随机推荐
- keystore password was incorrect
一.问题由来 最近在部署后台系统项目的时候,希望给项目增加一些安全措施,在项目中添加了SSL证书,可是在自己添加完该证书后,测试启动项目立马报错. 报错信息如下: org.springframewor ...
- hdu3507 斜率优化学习笔记(斜率优化+dp)
QWQ菜的真实. 首先来看这个题. 很显然能得到一个朴素的\(dp\)柿子 \[dp[i]=max(dp[i],dp[j]+(sum[i]-sum[j])^2) \] 但是因为\(n\le 50000 ...
- 使用Python写词云数据可视化
词云的应用场景 会议记录 海报制作 PPT制作 生日表白 数据挖掘 情感分析 用户画像 微信聊天记录分析 微博情感分析 Bilibili弹幕情感分析 年终总结 安装本课程所需的Python第三方模块 ...
- FastAPI 学习之路(八)路径参数和数值的校验
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- 实现前后端分离,最好的方案就是SPA(Single Page Application)
从通常意义来讲,说到必须,就是指最佳实践上,实现前后端分离,最好的方案就是SPA.所以才会有 前后端分离=SPA 的近似,忽视了其中的差别.但是,既然有疑问了,我们就来看一下,为什么SPA是实现前后端 ...
- 内网渗透DC-1靶场通关(CTF)
最新博客见我的个人博客地址 DC系列共9个靶场,本次来试玩一下DC-1,共有5个flag,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题. ...
- JVM详解(五)——运行时数据区-方法区
一.概述 1.介绍 <Java虚拟机规范>中明确说明:尽管所有的方法区在逻辑上属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩.但对于HotSpot JVM而言,方法 ...
- pycharm中的terminal和Windows命令提示符有什么区别?二者用pip安装的包是不是位于相同位置?
那要看pycharm使用了什么shell,可以在设置->工具->终端里查看shell path.如果使用的是cmd.exe那就没区别.pycharm终端和Windows命令提示符用pip安 ...
- pycharm 服务器连接及一些问题解决
主要介绍一下如何使用pycharm连接服务器并在服务器上炼丹,并对遇到的一个小问题进行说明. 目录 1,SSH连接 2,linux常用命令 3,配置anaconda 4,运行代码 5,一个常见错误 1 ...
- Scrum Meeting 0429
零.说明 日期:2021-4-29 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成部分后端管理 ...