数列重排:差点就场切的神仙构造,最后一步想假了,导致我模拟赛荣获 25+5+0 的好成绩!

这题部分分很有启发性,跟着一步一步打基本能想到正解的构造,但也有可能想偏部分分的意思,想假策略。

构造

先看 Subtask 4 的构造,不难发现,当 \(k=0\) 时所有重排都能让所有区间的 \(mex\ge0\),而当 \(k=1\) 时,\(01\) 交替放置,多出的那个放第一位,一定是最优的。

再看 Subtask 5 的构造,显然我们可以先让每个数里的 \(X\) 个先组成循环节,比如 \(012301230123\)。而对于多出 \(1\) 的那些,我们调整循环节内部的顺序,使得多出来接在后面的部分是循环节的一段前缀,比如多出了 \(1,3\),则构造为 \(13201320132013\)。因为这样能保证每 \(m\) 个就一定可以形成一个 $mex\ge m $ 的区间。

最后看 Subtask 6 的构造,对于多出来没有用的数字,我们可以列出一个无比丑陋的二次函数式子,然后就能证明这些多出的数字分成两半,分别放在两边是最优的。就过了这个子任务。

然后我就以为正解就是在 Subtask 5 的基础上加上 Subtask 6 就做完了,荣获 25pts 的高分!

实际上 Subtask 6 的策略是片面的,当两边插的过多的时候,两边带来的贡献可能比插到中间的贡献少,这一点同样可以从 Subtask 4 的构造中得出。

那么我们先考虑插到中间,一个显然的结论是插到循环节中间不如插到两个循环节之间的部分,因此我们来计算插到两个循环节之间(设这个位置为 \(p\),之前已经在这个位置插了 \(c\) 个,插之前序列的长度为 \(l\))的贡献:

  • 当一个区间的左右端点都不在 \(p\) 时,显然对区间的贡献没有影响。
  • 当一个区间的左右端点至少有一个在 \(p\) 上时,这些区间一共有 \(l+1\) 个,减去其中不合法的,一共有 \(l+1-2\times(k-1)-c-1\) 个有贡献。其中 \(2\times(k-1)\) 减去的是那些不完整的循环节,\(c+1\) 是包括自身在内的插入了的位置。总共减去的贡献是 \(2\times(k-1)+c+1\)。

插到两边也是同理,贡献是 \(l+1-(k-1)-c-1\),减去的总贡献是 \((k-1)+c+1\)。

那么显然先插两边是更优的,为了得到临界值,令中间插的 \(c=0\),列出方程:

\[l+1-(k-1)-c-1< l+1-2\times (k-1)-0-1
\]
\[c < 2k-1
\]

因此,我们得出策略:先在两边插 \(2k-2\) 个,然后我们轮流进行中间插和两边插,这样一定能让贡献最大化。

实现

首先定义函数 \(cal(l,r)=\frac{(l+r)(r-l+1)}{2}\),含义是计算 \(l\) 到 \(r\) 的等差数列的和。

设 \(pre\) 为小于 \(k\) 的数的个数,\(suf\) 为大于等于 \(k\) 的数的个数。

对于一个 \(f(k)\),我们进行如下过程求解:

  • 若 \(k=0\),则 \(f(k)=cal(1,n)\),直接结束程序。
  • 先计算所有区间的个数 \(f(k)\gets cal(1,n)\)。
  • 然后减去插入前就不合法的区间(也就是本来 \(mex<k\) 的区间),\(f(k)\gets f(k)-cal(pre-(k-1)+1,pre)\)。
  • 然后先插 \(\min(2k-2 ,suf)\) 个在两边,注意两边要各一半,两边的个数记为 \(lx,rx\),则 \(f(k)\gets f(k)-cal(k,k+lx-1)-cal(k,k+rx-1)\)。
  • 最后将剩下的均匀插入中间和两边,假设中间的位置有 \(j-1\) 个(详见代码),则一共可插入的位置有 \(j+1\) 个。设 \(lst=suf-\min(2k-2 ,suf),z=\left \lfloor \frac{lst}{j+1}\right \rfloor ,y= lst \bmod (j+1)\)。\(z\) 的含义是完整插入的轮数,\(y\) 是最后一轮多插的个数。则 \(f(k)\gets f(k)-cal(2k-1,2k-1+k-1)\times(j+1)-y\times(2k-1+z)\)。

由此计算即可。

时间复杂度 \(O(m)\)。

注意不要爆空间。

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi=pair<int,int>;
const ll mod=998244353;
int pw[10000005],m,l,r,x,f[10000005],suf[10000005],n,a[10000005],ans=0;
ll cal(ll l,ll r)
{
return ((l+r)*(r-l+1)/2)%mod;
}
int main()
{
//freopen("sample.in","r",stdin);
//freopen("sample.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
pw[0]=1;
for(int i=1;i<=10000000;i++)pw[i]=(233ll*pw[i-1])%mod;
cin>>m>>l>>r>>x;
for(int i=0;i<m;i++)
{
char c;
cin>>c;
suf[i]=a[i]=x+c-'0';
n+=suf[i];
}
for(int i=m-1;i>=0;i--)
{
suf[i]+=suf[i+1];
}
f[0]=cal(1,n);
for(int i=1,j=a[0];i<=m;i++)
{
//计算所有区间
ll res=cal(1,n),sufsm=suf[i],presm=n-sufsm;
//减去插入前不合法区间
ll sm1=cal(presm-i+2,presm);
res=((res-sm1)%mod+mod)%mod;
//减去插入左右两端后不合法区间
ll canp=min(2ll*(i-1),sufsm);
ll lx=canp/2,rx=canp-lx;
ll sm2=cal(i,i+lx-1);
ll sm3=cal(i,i+rx-1);
res=((res-sm2)%mod+mod)%mod;
res=((res-sm3)%mod+mod)%mod;
//减去中间和两端交替插入后不合法区间
ll lst=sufsm-canp;
ll z=lst/(j+1),y=lst%(j+1);
ll sm4=1ll*cal(2*i-1,2*i-1+z-1)*(j+1);
ll sm5=1ll*(2*i-1+z)*y;
res=((res-sm4)%mod+mod)%mod;
res=((res-sm5)%mod+mod)%mod;
f[i]=res%mod;
j=min(j,a[i]);
}
for(int i=l;i<=r;i++)ans^=((1ll*pw[i]*f[i])%mod);
cout<<ans;
return 0;
}

Luogu P9055 [集训队互测 2021] 数列重排 题解 [ 紫 ] [ 构造 ] [ 数学 ]的更多相关文章

  1. 【loj2461】【2018集训队互测Day 1】完美的队列

    #2461. 「2018 集训队互测 Day 1」完美的队列 传送门: https://loj.ac/problem/2461 题解: 直接做可能一次操作加入队列同时会弹出很多数字,无法维护:一个操作 ...

  2. 【2018集训队互测】【XSY3372】取石子

    题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...

  3. 洛谷 P4463 - [集训队互测 2012] calc(多项式)

    题面传送门 & 加强版题面传送门 竟然能独立做出 jxd 互测的题(及其加强版),震撼震撼(((故写题解以祭之 首先由于 \(a_1,a_2,\cdots,a_n\) 互不相同,故可以考虑求出 ...

  4. UOJ#191. 【集训队互测2016】Unknown

    题意:维护一个数列,每个元素是个二维向量,每次可以在后面加一个元素或者删除一个元素.给定P(x,y),询问对于[l,r]区间内的元素$S_i$,$S_i \times P$的最大值是多少. 首先简单地 ...

  5. UOJ#191. 【集训队互测2016】Unknown 点分治 分治 整体二分 凸包 计算几何

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ191.html 题目传送门 - UOJ191 题意 自行移步集训队论文2016中罗哲正的论文. 题解 自行 ...

  6. LOJ3069. 「2019 集训队互测 Day 1」整点计数(min_25筛)

    题目链接 https://loj.ac/problem/3069 题解 复数真神奇. 一句话题意:令 \(f(x)\) 表示以原点 \((0, 0)\) 为圆心,半径为 \(x\) 的圆上的整点数量, ...

  7. uoj #190. 【集训队互测2016】消失的源代码 提交答案题

    Test 1: 发现是一个字母表的映射 把 \('a' \to 'z'\) 打进去找出映射就好了QAQ . Test 2: 求助 \(dalao\) 得知的点.. 答案是 : \(2016x^2 + ...

  8. 【集训队互测2015】Robot

    题目描述 http://uoj.ac/problem/88 题解 维护两颗线段树,维护最大值和最小值,因为每次只有单点查询,所以可以直接在区间插入线段就可以了. 注意卡常,不要写STL,用链表把同类修 ...

  9. EZ 2018 05 06 NOIP2018 慈溪中学集训队互测(五)

    享受爆零的快感 老叶本来是让初三的打的,然后我SB的去凑热闹了 TM的T2写炸了(去你妹的优化),T1连-1的分都忘记判了,T3理所当然的不会 光荣革命啊! T1 思维图论题,CHJ dalao给出了 ...

  10. 【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)

    题目 描述 ​ \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径: ​ 一条路径的愉悦值定义为起点和终点编号的\(and\)值 ...

随机推荐

  1. Docker之基础(一)

    接触Docker有很久一段时间, 但是没有好好总结一下, 借此公司项目全面容器化, 记录一下常用的Docker操作 概况: 本次容器化的项目包括PHP+Python项目,PHP是基于php-fpm的基 ...

  2. Codeforces Round 797 (Div

    Codeforces Round 797 (Div. 3) Price Maximization 给定\(n\)个商品(n为偶数),每个商品的重量为\(a_i\),你需要将其两两打包,打包的成本为\( ...

  3. 微服务-SpringBoot

    基础知识 微服务主旨就是将一个大型系统拆分为多个小型服务. 多个服务之间可以是异构的.单体服务在大型项目下很难维护. 智能端点与哑管道:就是消息之间通信只传送消息,而不做校验. SpringCloud ...

  4. 在window 使用 docker 安装redis 踩坑记

    1. 安装REDIS 在安装的时候,使用 docker pull redis 就可以了. 但是 实际上 发现镜像居然拉不下来. 修改了一下 docker 镜像. 配置如下: "registr ...

  5. 一个.NET开源、免费、功能强大的 PDF 处理工具

    前言 在日常工作中PDF文档的处理往往受限于其固有的格式,使得用户在编辑.合并.剪裁等方面面临诸多不便.今天大姚给大家分享一个.NET开源.免费.功能强大的 PDF 处理工具:PDF 补丁丁(PDFP ...

  6. 内存Fuzz和WinAFL

    文章一开始发表在微信公众号 https://mp.weixin.qq.com/s/XSPrmBb44J8BUpKsj0cwGQ 内存Fuzz和WinAFL FoxitReader 软件分析 目前Fuz ...

  7. 渗透测试-前端验签绕过之SHA256+RSA

    本文是高级前端加解密与验签实战的第2篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过SHA256+RSA签名来爆破登录. 绕过 根据提示可以看出这次签名用了SHA2 ...

  8. docker安装Nginx并运行vue3前端

    Docker安装Nginx #获取Nginx docker pull nginx #查端口 netstat -ntlp #建本地目录 mkdir -p /home/nginx/www /home/ng ...

  9. Qt/C++地图高级绘图/指定唯一标识添加删除修改/动态显示和隐藏/支持天地图高德地图百度地图

    一.前言说明 已经有了最基础的接口用来添加覆盖物,而且还有通过进入覆盖物模式动态添加覆盖物的功能,为什么还要来个高级绘图?因为又有新的需求,给钱就搞,一点底线都没有.无论哪个地图厂家,提供的接口都是没 ...

  10. Halo博客+兰空图床搭建保姆级指南

    1. 简介 1.1 依赖的相关软件 Docker.Docker-Compose底层运行环境 Minio底层的存储支持 Mysql关系型数据库 Redis缓存中间件 NginxProxyManager( ...