为了方便,下文中的$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的更多相关文章

  1. Robot Framework用户手册 (版本:3.0)

    版权信息:诺基亚网络和解决中心 本翻译尊重原协议,仅用于个人学习使用 1.开始: 1.1 介绍: Robot Framework是一个基于Python的,为终端测试和验收驱动开发(ATDD)的可扩展的 ...

  2. selenium webdriver 右键另存为下载文件(结合robot and autoIt)

    首先感谢Lakshay Sharma 大神的指导 最近一直在研究selenium webdriver右键菜单,发现selenium webdriver 无法操作浏览器右键菜单,如图 如果我想右键另存为 ...

  3. RIDE -- Robot Framework setup

    RobotFramework 是一款基于python 的可以实现关键字驱动和数据驱动并能够生成比较漂亮的测试报告的一款测试框架 这里使用的环境是 python-2.7.10.amd64.msi RID ...

  4. [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 ...

  5. Robot Framework自动化测试 ---视频与教程免费分享

    当我第一次使用Robot Framework时,我是拒绝的.我跟老大说,我拒绝其实对于习惯了代码的自由,所以讨厌这种“填表格”式的脚本.老大说,Robot Framework使用简单,类库丰富,还可以 ...

  6. robot创建桌面图标(转载)

    桌面ride图标,安装之后会自动创建(偶尔也会创建失败),创建桌面图标方法如下: 1. 新建快捷方式 在桌面右击鼠标,弹出的菜单选择 新建-快捷方式 ,然后在"请键入对象"的位置输 ...

  7. Robot Framework 的安装和配置(转载)

    Robot Framework 的安装和配置 在使用 RF(Rebot framework)的时候需要 Python 或 Jython 环境,具体可根据自己的需求来确定.本文以在有 Python 的环 ...

  8. 解决从jenkins打开robot framework报告会提示‘Opening Robot Framework log failed ’的问题

    最新的jenkins打开jenkins robot framework报告会提示如下 Verify that you have JavaScript enabled in your browser.  ...

  9. 在centos7中安装Robot Framework

    安装前景介绍: 最初,我们是在Windows环境下搭建Robot Framework来对我们的服务进行接口测试的(想知道如何在Windows下安装Robot Framework,可以参考我同事的博客h ...

随机推荐

  1. PHP审计之class_exists与任意实例化漏洞

    PHP审计之class_exists与任意实例化漏洞 前言 发现PHP的一些漏洞函数挺有意思,跟着七月火师傅的文章来学习. class_exists函数 函数说明 class_exists:(PHP ...

  2. iOS实现XMPP通讯(一)搭建Openfire

    安装Openfire Openfire官网下载地址:https://igniterealtime.org/downloads/ (也是Spark客户端的下载地址) Openfire下载并安装后,打开系 ...

  3. mysql中一半会选择什么样的字段为索引?(含索引创建删除查看公式)

    一.数据量庞大的数据做索引 二.该字段经常出现在where的后面,以条件形式存在,经常被用户搜索的字段 三.很少被增删改的字段,因为增删改后,索引会重新排序 索引的创建 create index 索引 ...

  4. 初入CTF(封神榜第一关)

    注:网址中的%20是空格的意思 1判断是否存在注入点 构造?id=1 and 1=1(不报错) 构造?id=1 and 1=2(报错或者不显示内容) 报错说明and后面的语句被识别 2判断回显字段的长 ...

  5. Java(24)常用API三

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228417.html 博客主页:https://www.cnblogs.com/testero ...

  6. C#特性知识图谱-一、委托

    一. 委托 1.1 委托定义 委托可以看成是一个方法的容器,将某一具体的方法装入后就可以把它当成方法一样调用.一个委托类型的变量可以引用任何一个满足其要求的方法.委托类似于C语言中的函数指针,但并不完 ...

  7. 240.搜索二维矩阵II

    从左下角位置开始搜索 时间复杂度:O(行数+列数). 想法有点像二分法,大了往一个方向找,小了往另一个方向找.由于矩阵横向和纵向都是递增,如果从(0,0)位置开始找,往右和往下都是增大,因此不知道实际 ...

  8. 第四次Scrum Metting

    日期:2021年4月29日 会议主要内容概述:交代近两日工作,进一步细化上次讨论细节,代码合并. 一.进度情况## 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 ...

  9. Beta阶段第二次会议

    时间:2020.5.18 工作进展 姓名 工作 难度 完成度 ltx 1.在开小程序开发文档,学习相关知识 轻 85% xyq 1.完成活动场地申请可视化代码(耗时半天) 中 100% lm 1.设计 ...

  10. [软工作业]-软件案例分析-CSDN

    [软工作业]-软件案例分析-CSDN(app) 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分析 我在这个课程的目标是 ...