文章目录

  • (据说是)鏼爷神题
    • Day1
      • T1 回文切割(pal)
      • T2 模(mod)
    • Day2
      • T1 数列(sequence)
      • T2 子集和(subsetsum)
      • T3 棋盘(board)
    • Day3
      • T1 海龟(turtle)
    • Day4
      • T2 欧拉回路(euler)
  • (据说是)吴凯路爷爷神题
    • Day4
      • T2 挣钱(trade)
    • Day5
      • T2 马拉松路径(path)

(据说是)鏼爷神题

Day1

T1 回文切割(pal)

题目大意: 给定一个长为nnn(nnn是偶数)的01串sss,我们要反转里面的几位,使得这个01串能由若干偶数长度的回文串连接而成,反转第iii位的代价是wiw_iwi​,求最小代价。n≤2000n\le 2000n≤2000。时限2s2s2s。
做法: 本题需要用到DP。
显然有区间型DP的思路,令f(i)f(i)f(i)为使长为iii的前缀满足条件的最小代价,则有:
f(i)=min⁡{f(j)+w(j+1,i)}f(i)=\min\{f(j)+w(j+1,i)\}f(i)=min{f(j)+w(j+1,i)}
现在的问题就是如何求w(l,r)w(l,r)w(l,r):使[l,r][l,r][l,r]一段为回文串的最小代价。
显然偶回文串一定有一个对称轴,在中间的两个数之间。为了让它们回文,那么应该使第lll位和第rrr位相等,第l+1l+1l+1位和第r−1r-1r−1位相等…那么最小代价就是,如果对应的两个位置当前不等,就要更改其中代价较小的一个。但是,如果我们固定lll,枚举rrr来计算,会发现非常难算,需要O(n3)O(n^3)O(n3),但如果改成枚举对称轴计算就会非常简单了,时间复杂度为O(n2)O(n^2)O(n2),DP的复杂度也是O(n2)O(n^2)O(n2),我们就解决了这一题。

T2 模(mod)

题目大意: 给定一个集合SSS,内含nnn个非负整数aia_iai​,qqq个询问,每次询问给出一个质数ppp和r(0≤r<p)r(0\le r<p)r(0≤r<p),询问集合SSS有多少个子集,使得子集内元素的乘积对ppp取模的结果是rrr。空集乘积算作111。q≤5,n≤35,p≤109q\le 5,n\le 35,p\le 10^9q≤5,n≤35,p≤109。时限4s4s4s。
做法: 本题需要用到折半+map+逆元。
由于询问数很小,可以直接当作多组数据处理。如果看到了部分分的话,50分的范围是n≤18n\le 18n≤18,这显然就可以二进制枚举暴力计算了。而全部的数据范围是n≤35n\le 35n≤35,这就提示了我们利用折半的思想,把集合拆成两个大小分别为171717和181818的集合。对于大小为181818的集合,暴力枚举,在map中存储乘积模ppp为bbb的子集的个数。然后再枚举大小为171717的集合中的子集,假设这个子集的乘积模ppp为aaa,我们要求出所有满足ab≡r(modp)ab\equiv r(\mod p)ab≡r(modp)的bbb来累加答案。显然,因为ppp是质数,所以满足要求的bbb有且仅有111个,直接算出aaa的逆元再乘rrr就是了,直接在map中查找即可。于是时间复杂度为O(217⋅(18+log⁡p))O(2^{17}\cdot (18+\log p))O(217⋅(18+logp)),可以通过此题。

Day2

T1 数列(sequence)

题目大意: qqq次询问,每次给定a,b,c,da,b,c,da,b,c,d,求以下数列:x0=c,xi=axi−1+bx_0=c,x_i=ax_{i-1}+bx0​=c,xi​=axi−1​+b中,编号最小的≥d\ge d≥d的一项的编号,如果不存在输出−1-1−1。q≤5000,∣a∣,∣b∣,∣c∣,∣d∣≤109q\le 5000,|a|,|b|,|c|,|d|\le 10^9q≤5000,∣a∣,∣b∣,∣c∣,∣d∣≤109。
做法: 本题需要用到分类讨论。
分类讨论神题。根据正常高中数学推理,得到数列的通项公式:xi=(c+ba−1)⋅ai−ba−1(a≠1)x_i=(c+\frac{b}{a-1})\cdot a^i-\frac{b}{a-1}(a\ne 1)xi​=(c+a−1b​)⋅ai−a−1b​(a​=1),数列有四种可能的增长情况:循环(a=0,−1)(a=0,-1)(a=0,−1),单调增,单调减,或者上下波动(a<−1a<-1a<−1)。其他的就直接计算或者二分即可,最麻烦的情况是上下波动,它会呈现奇数项单调增,偶数项单调减(或者相反)的状态,再分类讨论一下二分即可。
(什么毒瘤题啊…完全不想动手写…)

T2 子集和(subsetsum)

题目大意: 给定一个数列AAA,定义一个数列AAA是好的,当且仅当对于所有1≤t≤∑Ai1\le t\le \sum A_i1≤t≤∑Ai​,都存在一个子集S⊆AS\subseteq AS⊆A,使得t=∑Sit=\sum S_it=∑Si​。问数列AAA有多少个非空的子数列(不一定连续,所以一共有2n−12^n-12n−1个)是好的。n,Ai≤5000n,A_i\le 5000n,Ai​≤5000。时限2s2s2s。
做法: 本题需要用到DP。
考虑贪心地判断一个数列是不是好的。由于我写过FJOI神秘数那题,因此思路很明显:先将数列从小到大排序,如果存在一个AiA_iAi​,使得Ai>1+∑j=1i−1AjA_i> 1+\sum_{j=1}^{i-1}A_jAi​>1+∑j=1i−1​Aj​,则数列就不是好的,如果不存在这样的AiA_iAi​,数列就是好的。简单证明一下就是,在到这样的AiA_iAi​之前,数列都是好的,但是加入AiA_iAi​后,(∑j=1i−1Aj,Ai)(\sum_{j=1}^{i-1}A_j,A_i)(∑j=1i−1​Aj​,Ai​)这一段开区间就无法表示了,而又因为后面的AxA_xAx​都比AiA_iAi​大,因此这一段开区间永远都不可能被表示出来了,所以数列就不是好的,否则它就是好的。
这样一来,我们显然把整个数列从小到大排序,然后令f(i,j)f(i,j)f(i,j)为最大的元素为AiA_iAi​的元素和为jjj的好的子数列数目,有:
f(i,j)=∑k=1i−1∑p+1≥jf(k,p)f(i,j)=\sum_{k=1}^{i-1}\sum_{p+1\ge j}f(k,p)f(i,j)=∑k=1i−1​∑p+1≥j​f(k,p)
显然当j>Anj>A_nj>An​时,具体的jjj值已经没有意义了(因为它可以被算作任何后面元素的贡献了),这时候直接令j=An+1j=A_n+1j=An​+1即可。于是用前缀和优化就可以做到O(nAn)O(nA_n)O(nAn​)的时间复杂度了。

T3 棋盘(board)

题目大意: 一个n×mn\times mn×m的棋盘,上面一些格子已经被涂成红色或黑色,现在要给其他的格子涂上红色或黑色,使得任意位于同一行或同一列的三个连续格子不被涂上相同的颜色,求方案数。n,m≤11n,m\le 11n,m≤11。时限5s5s5s。
做法: 本题需要用到状压DP。
容易想到按行状压DP,但是状态数看上去海量,直接暴做复杂度不可算,因此我们要精简状态。
首先从每一行的状态入手。暴力枚举的话,它会有2m2^m2m个状态。但鉴于可能有很多状态是不满足连续三格不涂同一颜色的条件的,我们考虑预处理排除掉不满足这个条件的状态。那么在合法状态中,颜色肯定是由长为111或222的连续段形成的,对于一种划分方案,有222种涂色方式(第一段涂红色或黑色),而这样的划分方案数是一个经典的问题,答案是斐波那契数列的第mmm项(前两项为1,21,21,2时),F11=144F_{11}=144F11​=144,因此合法的状态数最多有288288288个,比211=20482^{11}=2048211=2048少了很多。
又因为每行的状态只有288288288个,而DP时只要考虑上面两行的状态即可判断是否满足条件,因此DP的时间复杂度应该是O(n⋅2883⋅m)O(n\cdot 288^3\cdot m)O(n⋅2883⋅m),算出来有3e93e93e9这么大,肯定过不了。我们发现问题在于判定条件合法一次是O(m)O(m)O(m)的,能不能更快呢?这时候就要用位运算来强凑了。
首先一个问题是,如何快速判断当前状态在某些位上等于某些数?令当前状态为xxx,为了提取出固定的位,我们定义一个数yyy为,如果某一位被限制,这一位就是111,否则就是000,这样一个数,那么xandyx\space and \space yx and y就是xxx被提取出的那些位的数了。而zzz定义为如果某一位被限制,这一位就是被限制要成为的数,否则就是000,这样一个数,那么当且仅当xandyx\space and \space yx and y和zzz完全相同时,条件被满足,于是异或一下判断是不是000即可。
然后一个问题是,有了连续三行的状态x,y,zx,y,zx,y,z,如何判断存不存在某一位上全是000或者111?注意到,如果一位全是000或111,那么这一位上三个数andandand和ororor的结果应该是相同的,否则就不同,因此我们将xandyandzx\space and \space y\space and\space zx and y and z和xoryorzx\space or \space y\space or\space zx or y or z异或起来,如果它等于2m−12^m-12m−1(也就是全是111),就说明不存在某一位上全是000或111。
这样我们就可以O(1)O(1)O(1)(计算机中的)判断条件是否满足了,那么优化过的复杂度经过计算是2.6e82.6e82.6e8,5s5s5s的时间限制下也许能过,有时间写写试试吧…

Day3

T1 海龟(turtle)

题目大意: 在一个网格图上,有一只海龟要顺次经过nnn个整点,行走的过程是走直线,问行走过程中一共经过多少个整点,重复经过不重复计算。n,x,y≤1000n,x,y\le 1000n,x,y≤1000。
做法: 本题需要用到找规律+模拟。
我们找到一个规律:在两个整点(x1,y1),(x2,y2)(x_1,y_1),(x_2,y_2)(x1​,y1​),(x2​,y2​)之间的线段上,有gcd(∣x1−x2∣,∣y1−y2∣)+1gcd(|x_1-x_2|,|y_1-y_2|)+1gcd(∣x1​−x2​∣,∣y1​−y2​∣)+1个整点,它们的坐标是(x1+k⋅x2−x1gcd(∣x1−x2∣,∣y1−y2∣),y1+k⋅y2−y1gcd(∣x1−x2∣,∣y1−y2∣))(x_1+k\cdot \frac{x_2-x_1}{gcd(|x_1-x_2|,|y_1-y_2|)},y_1+k\cdot \frac{y_2-y_1}{gcd(|x_1-x_2|,|y_1-y_2|)} )(x1​+k⋅gcd(∣x1​−x2​∣,∣y1​−y2​∣)x2​−x1​​,y1​+k⋅gcd(∣x1​−x2​∣,∣y1​−y2​∣)y2​−y1​​)。显然每次行走O(max⁡x)O(\max x)O(maxx)枚举kkk对点标记,最后O(max⁡x⋅max⁡y)O(\max x\cdot \max y)O(maxx⋅maxy)统计即可。

Day4

T2 欧拉回路(euler)

题目大意: 有nnn个点,点iii和点jjj之间有边当且仅当(i−j)⋅(ai−aj)>0(i-j)\cdot (a_i-a_j)>0(i−j)⋅(ai​−aj​)>0,问连出的图存不存在欧拉回路。n≤105,T≤10n\le 10^5,T\le 10n≤105,T≤10。时限2s2s2s。
做法: 本题需要用到图论结论+树状数组。
根据图论的结论,一个图存在欧拉回路,当且仅当图中每个点的度数是偶数,并且图连通。求每个点的度数应该简单了,直接求它左边有多少个比它小的,右边有多少个比它大的即可,用树状数组+离散化做到O(nlog⁡n)O(n\log n)O(nlogn)。关键是如何判连通。
我们先证明一个引理:对于连续排列的三个连通块A,B,CA,B,CA,B,C,不存在A,CA,CA,C连通,但A,BA,BA,B和B,CB,CB,C间都没有边的情况。显然,根据A,CA,CA,C连通,说明AAA中存在一个元素比CCC中的某元素小,也就说明min⁡(A)<max⁡(C)\min(A)<\max(C)min(A)<max(C),而A,BA,BA,B和B,CB,CB,C间没有边,可以同样地看成min⁡(A)≥max⁡(B),min⁡(B)≥max⁡(C)\min(A)\ge \max(B),\min(B)\ge \max(C)min(A)≥max(B),min(B)≥max(C),那么min⁡(A)≥max⁡(C)\min(A)\ge \max(C)min(A)≥max(C),所以这两个条件矛盾,因此结论成立。这也就意味着,如果图不连通的话,则必定存在一个分界点iii,使得min⁡{aj∣j≤i}≥max⁡{aj∣j>i}\min\{a_j|j\le i\}\ge \max\{a_j|j>i\}min{aj​∣j≤i}≥max{aj​∣j>i},直接O(n)O(n)O(n)判定即可,这样我们就解决了这一题。

(据说是)吴凯路爷爷神题

Day4

T2 挣钱(trade)

题目大意: nnn个城市连成树状图,边有长度,现在要倒卖一种物品,这种物品在城市iii的价格为aia_iai​,选择一个城市购买一件这种物品,再走到另一个城市卖掉,走过一条长度为xxx的边花费为xxx,求一次能得到的最大收益。n≤105n\le 10^5n≤105。
做法: 本题需要用到树形DP。
考虑枚举路径的LCA:vvv,如何计算过这一点的路径的最大价值呢?令disidis_idisi​为点iii到vvv的距离,那么答案就是子树中ai−disia_i-dis_iai​−disi​的最大值加上−ai−disi-a_i-dis_i−ai​−disi​的最大值,这些显然都可以用树形DP很自然地维护出来。现在有的同学有疑问了,如果满足这两个最大值的两个点在vvv的同一个儿子的子树中怎么办呢?当然你想去重也可以去重,但这里因为如果它路径有重,那它肯定没有LCA在另一个点的情况时优,所以我们可以直接不管去重。这样就可以O(n)O(n)O(n)解决这一题了。

Day5

T2 马拉松路径(path)

题目大意: 给定一张带边权无向连通图,给定一个CCC个点的点集,要从里面选两个不同的点作为起点和终点,求最短路的最小值。C≤n≤105,m≤105C\le n\le 10^5,m\le 10^5C≤n≤105,m≤105。时限3s3s3s。
做法: 本题需要用到最短路+二进制分组。
神仙题。
如果是规定了起点集合和终点集合,直接建超级源点和超级汇点做即可。但是这个题给的CCC个点都可能作为起点或终点,还限制同一个点不能同时为起点或终点。直接枚举起点,每次做单源最短路,这和暴力没什么区别,我们需要更加优美地枚举所有可能的情况。
注意到两个点不同,一定代表着它们编号的二进制表示中,存在某一位不同。因此我们对每一个二进制位分组,是000的分为起点集合,是111的分为终点集合,这样就可以保证起点和终点集合不同,而这样O(log⁡n)O(\log n)O(logn)次最短路做下来一定会包含所有起点和终点的情况,这样就可以O(nlog⁡2n)O(n\log^2n)O(nlog2n)计算出答案了。

(据说是)鏼爷和吴凯路爷爷出的NOIP模拟神题集锦相关推荐

  1. 金风科技执行副总裁吴凯:智慧能源就在我们面前

    金风科技执行副总裁吴凯 [数据猿导读]金风科技执行副总裁吴凯谈到智慧能源时说,未来的能源应该是可负担的,可靠的,可持续的,是便捷的,便宜的,高效的,对社会产生正面的影响,对所有利益相关体产生价值.这个 ...

  2. 《Miss Talk》第03期:对话学霸君吴凯

    本期嘉宾:学霸君1对1技术VP 吴凯 吴凯,中科院软件工程硕士,2018年加入学霸君,任学霸君1对1技术VP,主要负责上课客户端.后台crm系统.师资系统等多个业务.曾在多家大型互联网公司担任总监及以 ...

  3. 《Miss Talk》第03期:对话学霸君 吴凯

    本期嘉宾:学霸君1对1技术VP 吴凯 吴凯,中科院软件工程硕士,2018年加入学霸君,任学霸君1对1技术VP,主要负责上课客户端.后台crm系统.师资系统等多个业务.曾在多家大型互联网公司担任总监及以 ...

  4. 90题细品吴恩达《机器学习》,感受被刷题支配的恐惧

    点击蓝字关注我,有干货领取! 最近翻译了吴恩达<机器学习>课程的配套题库.课程系列本身多有名多经典我就不赘述啦~ 主要是我发现,现在市面上基本都是课程和编程题的翻译版,很少有人翻译测验(q ...

  5. 【系统分析师之路】计算机组成原理章节错题集锦

    [系统分析师之路]计算机组成原理章节错题集锦 [系分章节错题集第01题:红色] 01.在计算机系统中,对构成内存的半导体存储器进行自检的方法有许多种,其中对( )一般采用对其内容求累加和进行自检的方法 ...

  6. 浙江理工大学 我的编程之路 零基础学C/C++ 200题 标程/题解

    浙江理工大学 我的编程之路 零基础学C/C++ 200题 标程/题解 OJ地址:http://47.96.116.66/index.php 标程/题解GitHub:https://github.com ...

  7. 【系统分析师之路】企业信息化章节错题集锦

    [系统分析师之路]企业信息化章节错题集锦 [系分章节错题集第01题:红色] 01.在现代化管理中,信息论已成为与系统论.控制论等相并列的现代科学主要方法论之一.信息具有多种基本属性,其中( )是信息的 ...

  8. 浙江理工大学c语言作业网站,浙江理工大学 我的编程之路 零基础学C/C++ 200题 标程/题解...

    浙江理工大学 我的编程之路 零基础学C/C++ 200题 标程/题解 OJ地址:http://47.96.116.66/index.php 标程/题解GitHub:https://github.com ...

  9. 【系统分析师之路】系统分析师下午案例模拟题(2021版)

    [系统分析师之路]系统分析师下午案例模拟题(2021版) 系统分析师下午案例分析模拟题 [系统分析师之路]系统分析师下午案例模拟题(2021版) 系统分析师下午案例模拟题一 系统分析师下午案例模拟题二 ...

  10. 【系统分析师之路】系统安全章节错题集锦

    [系统分析师之路]系统安全章节错题集锦 [系分章节错题集第01题:红色] 01.下面病毒中,属于蠕虫病毒的是( ). A.CIH病毒 B.特洛伊木马 C.罗密欧与朱丽叶病毒 D.Melissa病毒 解 ...

最新文章

  1. 【动画1】UIView动画
  2. py2与py3的区别
  3. PMBOK学习笔记二-项目管理过程
  4. SQL---JDBC基础6步
  5. 合并DateFrame之—— append()
  6. spring cloud 微服务相关信息
  7. 有人羡慕过自由职业吗?
  8. [Spark]Spark RDD 指南二 初始化
  9. HTML5 Web SQL 数据库
  10. GOM引擎版本为什么玩家会自动掉线或闪退?
  11. python如何计算等额本息还款_银行等额本息还款算法
  12. OSChina 周三乱弹 ——人生四人行,一男两女是夫妻,还有一个单身狗
  13. 《论文阅读》FroDO: From Detections to 3D Objects
  14. window.open打开子窗口回调父窗口函数
  15. iptables结合ipset禁止国外IP进行访问
  16. chan相关的知识点
  17. 赋能建筑建材企业物流网络内外联通,B2B交易管理系统打造行业智慧供应链
  18. springboot美食分享系统 毕业设计-附源码612231
  19. c语言intrins函数,【转载】KEIL C 头文件INTRINS.H中的几个函数说明
  20. 导出Excel功能代码

热门文章

  1. wpf 监听退出事件_如何监听WPF的WebBrowser控件弹出新窗口的事件
  2. 直接将ADB授权写入到手机的方法(手机需要有root权限)
  3. JAVA ZIP解压出现不可预料的压缩文件末端
  4. NOI 十连测 Zbox loves stack
  5. 堆、栈,队列,栈,树的个人理解和记录
  6. L2D1 linux下deb包管理及常用shell命令
  7. 后渗透权限维持的方法
  8. hds linux 识别盘符,HDS HDLM让集群两边认到的盘符一样
  9. router跳转外部链接
  10. 基于单片机的自行车里程监测系统的设计(自行车码表)