2021统一省选 A卷 day1解析

2024-05-11 00:58
文章标签 统一 解析 2021 day1 省选

本文主要是介绍2021统一省选 A卷 day1解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题面,就参照洛谷的吧。

  1. 卡牌游戏
  2. 矩阵游戏
  3. 图函数

重点看思维过程。

卡牌游戏

  1. 爆搜的话,过前两个点没问题。枚举要翻牌的数量m,然后从n张中翻m张,直接统计最大最小值。

  2. 考虑到卡牌是按照正面数值由小到大排序的,设c[]数组,将a[]和b[]存入c[],然后由小到大排序。枚举最小值minn为c[i],最大值maxn为c[j],这两个值是不可更改的,现在转为判定性问题,注意minn和maxn不能是同一张牌的,要判别一下。那么正面数值在这个区域的,是不用翻牌的。对于正面数据a[]来说,假设最小值minn的下标为i,最大值maxn的下标为j。如下:
    在这里插入图片描述
    那么区间[i,j]是不需要翻牌的。区间[1,i-1]和[j+1,n]是需要翻牌的。最后看确定的最小值和最大值的下标是否在翻牌区域,如果不在翻牌区域,需要m减1或者减2,有几个不在翻牌区域,就减几个。然后只要满足:翻牌数量小于等于m和翻牌区间的最值在minn和maxn之间,就是合法解。。用ST算法维护区间最大值和区间最小值即可。整体复杂度是O(n^2)的。可以过前4个点。

  3. 以上思路稍加调整就可以过第5~6个点。虽然n值较大,达到了5e5,但是m值最大1000。因此枚举的时候,直接枚举前半段翻牌的长度为x,则后半段翻牌的长度最大为m-x。其余同思路2。整体复杂度是O(m^2)。

  4. 为了加速上述的判定,可以用二分法,就是二分答案。这个题目的答案具有单调性,可以转为判定性问题。假设极值为x,现在假定最小值为minn,那么最大值maxn为minn+x。最大和最小值都得是卡牌上的数值。ai值小于minn的部分需要翻牌,而且得保证翻出的牌的最值在minn和maxn之间,ai值大于maxn的也需要翻牌,而且得保证翻出的牌的最值在minn和maxn之间。否则,这组不满足,跳过。
    如何确定最小值minn呢?需要正面和反面的数值一起,设数组c[],依次存入a[]和b[],然后排序,由小到大,需要记下c[]中的数据在原先数列中的下标。用map就可以。因为2n个数据都不相同,所以不矛盾。在c[]中依次枚举作为最小值。最后看确定的最小值和最大值的下标是否在翻牌区域,如果不在翻牌区域,需要m减1或者减2,有几个不在翻牌区域,就减几个。然后只要满足:翻牌数量小于等于m和翻牌区间的最值在minn和maxn之间,就是合法解。枚举时复杂度O(n),查询最值O(logn),共二分次数O(logn),整体复杂度为O(lognnlogn)。可以过全部点。

矩阵游戏

发现由 b i , j b_{i,j} bi,j倒推出 a i , j a_{i,j} ai,j有很多种方法。比如:对于b[1][1],a[1][1]=a[1][2]=a[2][1]=b[1][1]/4,a[2][2]=b[1][1]/4+b[1][1]%4。其他的位置填的话,只需要再确定两个值就可以了,一个值可以填b[][]/2,另一个值填b[][]/2+b[][]%2。这样倒推出来的是没有限制的a[][]。注意限制是:a[i][j]>=0&&a[i][j]<=1e6。我们发现对于某一列,如果从上到下依次加减相同的值,不影响正确性。比如:+x,-x,+x,-x,……,也可以从减开始,比如:-x,+x,-x,+x,……。对于某一行,也是这样。

下面的问题就是如何由得到的一个随机矩阵,通过某种方法转化为合法矩阵。

对于n,m<=3和m=2的情况,感觉应该可以暴力过,但是想不到好的方法。因为按照上面的思路,如何将随机矩阵转化为合法矩阵,总要用到差分约束,也不是暴力做法。直接考虑全部数据规模。

对于奇数行,在行上的改变从加开始,对于偶数行,从减开始。

对于奇数列,在列上的变化从减开始,对于偶数列,从加开始。

在这里插入图片描述
对于某个位置,要经过行上的和列上的变化。这些变化要同时满足所有位置,得列不等式方程组。比如对于(1,1),需要满足: a [ 1 ] [ 1 ] + x 1 − y 1 > = 0 a[1][1]+x1-y1 >= 0 a[1][1]+x1y1>=0 && a [ 1 ] [ 1 ] + x 1 − y 1 < = 1 e 6 a[1][1]+x1-y1 <= 1e6 a[1][1]+x1y1<=1e6。所有的位置都要满足上述类似的要求。

这就最终能化成类似这样的不等式:a<=x1-x2<=b,这个不等式可以拆成:x1<=x2+b和x2<=x1+(-a)。典型的差分约束系统,用最短路解就可以了。总共是n+m个点,n*m条边。spfa可以过。

图函数

几乎每次大考中都会有这种重新定义的题目,一般比较绕,但是跟着样例模拟一遍,就能大致明白它的套路。

n<=10的前4个点,可以直接模拟过。判断两个点是否连通,可以用dfs搜。链式前向星存图,用vis[]对每条边打标记,删除某条边,就是vis置为0。

以下有点长,但不难理解,耐心阅读。

再具体考虑。对于图G,对于点u,判断点v是否能和点u构成点对,那么点v应该满足什么条件呢?首先要明确的是点u和点u能构成点对,然后消去自身,因此v<u。v->u和u->v之间的点满足什么条件呢?之间的点都是>v的。假设v->u和u->v之间存在点x,而且x<=v。那么x->u和u->x之间也是连通的,这样x及其边要被消去,因此等到枚举到v时,x已经不存在了。假设矛盾。

明白这一点的话,也就没必要真正地删除边了,只需要做一些转换。对于任意的图G,有两点v和u,v<u,如果v->u和u->v之间的点都是>v的,那么u和v构成点对。本题求的分别是原图G的点对数,删除一条边的点对数,删除两条边的点对数,……,删除m条边的点对数。真的要一个图一个图的去求吗?肯定不会。应该能想到,这些m+1个图,会有某种连续性。

假设上述对应的图分别为G0,G1,G2,……,Gm。有两点v和u,v<u。v->u和u->v某条路径上的边的最小值为i,也就是说v->u和u->v的路径至少会到删除第i次边的时候才会被破坏。也就是说点u和v,对于图G0,G1,G2,……,Gi都是点对。v和u之间双联通的路径会只有一条吗?也许不会,所以要求出v和u之间所有路径边的最小值的最大值。因为我们希望u和v能产生更多的贡献,所以要最大值。设数组f[i][j]用来记录合法点对i和j之间的边的编号的最小值的最大值,那么上述u和v对答案的贡献就可以用min(f[u][v],f[v][u])来表示。

设数组g[i]表示第i条边对其前面的图的贡献,前面的图指的是:G0,G1,……,Gi-1。想求第i个图总共有多少点对,只要求出第i条边后面的边对它的贡献即可,也就是后缀和。

现在难点就是如何求这个f[i][j]?可以用floyed。首先要明白:对于floyed,在最外层循环到k时,dis[i][j]最短路径上除了i和j两点,路径上的其他结点编号都小于等于k。我们在学习最小环问题的时候讨论过这个问题。

在这里插入图片描述
以下是最小环问题的算法。

在这里插入图片描述
我们要计算f[i][j],假设i<j,要求是i->j和j->i之间的点都是>j的,如何保证在floyed的过程中f[i][j]的点满足这个条件?只要将松弛点k从大到小枚举就搞定了!这样在做到f[i][j]时,上面的点除了i和j外都是大于j的。

可参考以下代码,1000的规模的floyed开o2,居然能过。

#include<cstdio>
using namespace std;
int n,m,x,y,f[1010][1010],g[200010],ans[200010];
inline int min(int x,int y){return x<y?x:y;}
inline int max(int x,int y){return x>y?x:y;}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++) scanf("%d%d",&x,&y),f[x][y]=i; for(int k=n;k>=1;k--)for(int i=1;i<=n;i++)if(f[i][k]){if (i>k){for(int j=1;j<k;j++)f[i][j]=max(f[i][j],min(f[i][k],f[k][j]));}else{for(int j=1;j<=n;j++) f[i][j]=max(f[i][j],min(f[i][k],f[k][j]));}}for (int i=1;i<=n;i++)for (int j=i+1;j<=n;j++)g[min(f[i][j],f[j][i])]++;ans[m+1]=n;for(int i=m;i>=1;i--)ans[i]=ans[i+1]+g[i];for(int i=1;i<=m+1;i++)printf("%d ",ans[i]);return 0;
}

备注:代码转载自洛谷“永恒之眼”的博客。

这篇关于2021统一省选 A卷 day1解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978063

相关文章

解析 XML 和 INI

XML 1.TinyXML库 TinyXML是一个C++的XML解析库  使用介绍: https://www.cnblogs.com/mythou/archive/2011/11/27/2265169.html    使用的时候,只要把 tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.

tf.split()函数解析

API原型(TensorFlow 1.8.0): tf.split(     value,     num_or_size_splits,     axis=0,     num=None,     name='split' ) 这个函数是用来切割张量的。输入切割的张量和参数,返回切割的结果。  value传入的就是需要切割的张量。  这个函数有两种切割的方式: 以三个维度的张量为例,比如说一

vue3项目将所有访问后端springboot的接口统一管理带跨域

vue3项目将所有访问后端springboot的接口统一管理带跨域 一、前言1.安装Axios2.创建Axios实例3.创建API服务文件4.在组件中使用API服务 二、跨域三、总结 一、前言 在Vue 3项目中,统一管理所有访问后端Spring Boot接口的最佳实践是创建一个专门的API服务层。这可以让你的代码更加模块化、可维护和集中管理。你可以使用Axios库作为HTT

陀螺仪LSM6DSV16X与AI集成(8)----MotionFX库解析空间坐标

陀螺仪LSM6DSV16X与AI集成.8--MotionFX库解析空间坐标 概述视频教学样品申请源码下载开启CRC串口设置开启X-CUBE-MEMS1设置加速度和角速度量程速率选择设置FIFO速率设置FIFO时间戳批处理速率配置过滤链初始化定义MotionFX文件卡尔曼滤波算法主程序执行流程lsm6dsv16x_motion_fx_determin欧拉角简介演示 概述 本文将探讨

【文末附gpt升级秘笈】腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑

腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑 一、引言 随着人工智能技术的飞速发展,自然语言处理(NLP)和机器学习(ML)在各行各业的应用日益广泛。其中,AI搜索解析能力作为信息检索和知识抽取的核心技术,受到了广泛的关注和研究。腾讯作为互联网行业的领军企业,其在AI领域的探索和创新一直走在前列。近日,腾讯旗下的AI大模型应用——腾讯元宝,迎来了1.1.7版本的升级,新版本在AI搜

消息认证码解析

1. 什么是消息认证码         消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC。         消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为MAC值。         根据任意长度的消息输出固定长度的数据,这一点和单向散列函数很类似

问题1,PE文件转到内存中出现解析PE不正确的问题

1,使用fopen(FileName, “r”) r的方式读取文件到内存,此时就可能存在问题了,r以只读方式,有时候不表示字符的有可能就不读了,那么内存中就不会是完整的原始文件。所以此时要采用rb,二进制读取的方式。 bool ReadFileToMem(char* FileName, char**buf) { FILE* f; f = fopen(FileName, “rb”); if

[大师C语言(第三十六篇)]C语言信号处理:深入解析与实战

引言 在计算机科学中,信号是一种软件中断,它允许进程之间或进程与内核之间进行通信。信号处理是操作系统中的一个重要概念,它允许程序对各种事件做出响应,例如用户中断、硬件异常和系统调用。C语言作为一门接近硬件的编程语言,提供了强大的信号处理能力。本文将深入探讨C语言信号处理的技术和方法,帮助读者掌握C语言处理信号的高级技巧。 第一部分:C语言信号处理基础 1.1 信号的概念 在Unix-lik

免费内网穿透工具 ,快解析内网穿透解决方案

在IPv4公网IP严重不足的环境下,内网穿透技术越来越多的被人们所使用,使用内网穿透技术的好处有很多。 1:无需公网ip 物以稀为贵,由于可用的公网IP地址越来越少,价格也是水涨船高,一个固定公网IP一年的成本要上万,而使用内网穿透技术则不需要公网IP的支持。 2:提高安全性 使用内网穿透技术,无需在路由器映射端口,我们知道黑客通常会使用端口扫描来寻找攻击对象,不映射端口能大大提高服务器的安全

混合密码系统解析

1. 概述         混合密码系统(hybrid cryptosystem)是将对称密码和非对称密码的优势相结合的方法。一般情况下,将两种不同的方式相结合的做法就称为混合(hybrid)。用混合动力汽车来类比的话,就相当于是一种将发动机(对称密码)和电动机(非对称密码)相结合的系统。         混合密码系统中会先用快速的对称密码来对消息进行加密,这样消息就被转换为了密文从而也就保证