首页 > 其他分享 >My experience

My experience

时间:2024-10-22 11:48:51浏览次数:6  
标签:二分 题目 优化 可以 experience 注意 My dp

  1. 不开 long long 见祖宗!

  2. 当题目中一个数字很大时,我们可以枚举另一个值域较小的变量。

  3. 有些状态对于某种情况下是一样的,例如,比中位数大的可以看做同一个数;除元音外的都看做同一辅音……

  4. 多次修改加一次查询可以使用差分来解决,对于需要翻转区间的我们可以使用链表进行存储。链表比数组删除、添加、重新排序等更有优势。

  5. 遇到有些题目正这来不合适,可以反着来。添加就变成了更简单的删除。

  6. 最大值最小可以一眼二分。

  7. 二分是在单调的答案区间内二分答案,使得找到某一个端点 \(x\) ,满足 \([1,x-1]\) 不满足条件, \([x,n]\) 满足,这样就找到了最小值。

  8. 差分只是一种对暴力算法的优化、加速,起到降低时间复杂度的作用,所以有些题目可以先想暴力,再想使用差分优化。

  9. 双指针即枚举某一端点,然后对另一端点进行收缩,即可求得满足条件的区间个数、区间长度最小值,且指针移动方向相同。

  10. 有时候,如果不能使用人人为我的递推,可以换成我为人人的递推。

  11. 遇到有些题目,如果我们不关心具体的数值,而是每个数字之间的大小关系时,我们可以对其进行差分,或者减去第一项,有时候仅仅是知道大小关系时,可以离散化。

  12. 一定要排完序后再求前缀和、差分。

  13. 有时候,使用二进制中 \(0\) 和 \(1\) 来抽象两个数值。

  14. 双向边要开两倍数组!

  15. 调试用的 freopen 注释掉。

  16. 同一快内元素地位是等价的,我们不用在意块内元素的顺序。

  17. 一道题目如果存在多个变量难以下手,可以尝试去枚举其中一个变量,这样就只用维护生下来的变量了。

  18. 比较复杂的动态规划可以先写记忆化搜索,再写动态规划

  19. 要根据数据范围选择对应时间复杂度的算法。例如一道题目有 \(q\) 个询问,每个询问的规模是 \(p_i\),数据范围中有 \(\sum{p_i}\leqslant k\) 并且我们可以接受 \(\Theta(k)\) 的时间复杂度,那么每次询问的时间复杂度就是 \(\Theta(p)\)。

  20. 难想的题目尝试使用 dp 解决,先找出题目中的所有状态,然后列出朴素状态转移方程,然后进行优化。

  21. 遇到题目先思考弱化的问题,然后思考如何优化这个算法。

  22. 某些题目如果没有严谨的证明,不能轻易使用贪心算法,而是尝试使用 DP

  23. 这就是哈希的原理了:判定时构造一个必要不充分条件,但这个“不充分”实际上有非常大非常大的概率充分,以至于不充分性可以忽略不计,从而达到充要判定的效果。读者应当熟悉的字符串哈希,也是同样的原理。

  24. 千万注意背包问题的不可贪心!

  25. unique 之前要 sort

  26. 处理反边 i ^ 1 时,记得 eid 初值为 \(1\)。

  27. \(n\) 个数的 \(mex\) 的范围为 \([0,n-1]\)。

  28. \(cin\) \(cout\) 解绑后不要用 \(puts\) \(scanf\) \(printf\) !!!

  29. 开 \(long long\) 后scanf printf 格式符一定要改成 %lld

  30. 判断double是否与int相等的时候,以及输出保留几位小数的时候+1e-7(避免掉精度 或者 开 lond double 格式化输出为 %Ldint x = sum + eps; if(fabs(sum-x)<=eps)....

  31. 通常取eps的值为:\(10^{-10}\) ~ \(10^{-8}\) 之间。

  32. 位运算不清楚优先级的情况下一定要加括号!

  33. bfs 时的状态要考虑全面(比如逃离地下城身上的的钥匙要用二进制存)

  34. 解绑后不能用getchar()!!!

  35. 定义变量时不要外面定义一个里面定义一个,错调试很难调

  36. 调用函数搞清楚别写错

  37. 对于冒泡排序类找性质的题目,一个点向右移动多少次等价于右边有多少个数可以超过它。

  38. 对于链式前向星的headmemset为-1的时候不要写 memset(head,-1,sizeof(int)*( n+1)),要写就写memset(head,-1,sizeof head);

  39. 字符串追加字符:

    • a = a + c; // \(O(3 \times n)\)
    • a += c; // \(O(1)\)
  40. 判断 ans 以判断是否有解时,应当根据情况和转移方程判断而不是一味地写 if(ans == inf)

  41. 关于UB e.g modify(a[t].l,a[t--].r) 这样写是错的,应为函数传参数没有先后顺序,t-- 应当分开写

  42. 对于不写万能头时,有时候忘记写如#include<vector> 之类编译器上可以运行但交上去就CE,所以要仔细检查,科学完善

  43. 碰到数区间问题无非两个套路:枚举右(左)端点 或 分治 或 数据结构

  44. 两个字符数组如果从下标 \(1\) 开始输入,不要使用 \(strcmp(a,b)\) ,要用的话要将 a[0] = b[0] = '#'

  45. 数学预处理要注意:在所有输入后再处理;注意从 0/1/2 开始推,同时注意初始值

  46. 遇到两个人博弈,求一个人收益的最大值时

    • 考虑只用 \(dfs(i,j)\) 表示 \(i \sim j\) 先手能获得的最大价值。转移的时候想要获得本次操作先手的收益,只需要把价值之和减去后手作为先手的收益。即用 sum[n] - sum[i] - dfs(i + 1, n) 来计算 \(i \sim n\) 先手获得的价值。

    • 计算先后手价值之差,再使用 $min,max $

  47. \(dp\) 的优化

    • 数据结构
    • 决策单调性
    • 继承结果,前缀结果
    • 形式由记搜变为循环,便于优化
  48. 有关 \(exCRT\) 的题目时要注意更据实际情况更正结果(比如 \(0\) 的特殊情况应该变为 \(lcm\))

  49. 经过这个题,我们可以得出关于 \(CDQ\) 维护偏序问题时的两个小技巧。

  50. 对于有交叉关系的偏序式子,可以尝试合并和简化。(实际上本题并没有减少不等式的数量,但是我们把它转化成可以用 CDQ 解决的形式)

  51. 较复杂的不等式优先使用数据结构解决。

  52. xxxxxx 时间点出现在 xxx时间点消失,问若干个时间点的状态 \(\to\) 线段树分治

  53. 对于难以直接求得的问题应当转化,得出可以整合有关信息的式子 \([l,r] 中 x 的第一次出现位置与最后一次出现位置之差 \to ∑ i-pre_{a_i}[pre_{a_i}>=L]\)

  54. 构造:

  55. 对于一条边来讲:

    • 如果最小生成树里所有被修改的边权都被赋成了 \(+\infin\),而它未出现在树中,则证明它不可能出现在 \((l,r)\) 这些询问的最小生成树当中。所以我们仅仅在 (l,r) 的边集中加入最小生成树的树边。
    • 如果最小生成树里所有被修改的边权都被赋成了\(-\infin\)而它未出现在树中,则证明它一定不s会出现 \((l,r)\)这段的区间的最小生成树当中。这样的话我们就可以使用并查集将这些边对应的点缩起来,并且将答案加上这些边的边权。
  56. \(a ? b,c : d,e\) 会被理解为 \((a ? b,c : d),e\) 所以别混着写,写 \(if\) 。

  57. 初始化代码中有用到输入数据的务必要将初始化内容放在输入后!!!

  58. 斜率优化中,不要直接计算\(slope\) 值,应当拆成 \(dx,dy\) 写;注意要保证 \(dx\) 应当是非负数,应为两边同乘负数要变号!

  59. \(eps\) 该加的还是要加,不要觉得无所谓

  60. 斜率优化 \(dx,dy\) 相乘时要注意有没有爆 \(int\)

  61. 斜率优化有时候要边做边二分

  62. 对于数据结构优化 \(dp\),一般有两种形式:

    • 利用数据结构对于先前的最优状态进行选择统计;
    • 将上一阶段 \(dp\) 放入数据结构中,进行转移。
  63. 整体二分遇到不可加贡献,利用可撤销整体二分

  64. 奇环树上 \(dp\) 可以考虑处理完子树再链上 \(dp\) ,也可以直接拆环做 \(dp\)

  65. 处理修改(如离散化)结构体要引用 for(P &s : v)

  66. 数据范围较小的,用暴力;对于具有特殊性质的数据,找规律

  67. 遇到不适合除的时候,记下前缀积和后缀积

  68. 类似概率期望的题目不一定是概率期望,应当结合具体情况,进行分析;

  69. 有向关系+非树图,想到 \(DCC\),\(SCC\)。

  70. 判断两点是否在一个点双里:

    • 维护 \(who\),\(bt[x]\),其中 \(x\) 为割点也要维护;
    • \(bt[a] == bt[b] || who[bt[a]]==b || who[bt[b]] == a\)
  71. 测试图时,可以先用特殊结构的图,比如树、菊花图、链等等。

  72. 注意 #define for_edge 时,里面循环变量改为程序中不会用到的,比如_

  73. 用并查集维护已经处理过的东西,防止多次处理,直接往后跳即可。

  74. 边的先后关系:拓补排序、贪心

  75. 我们有些看似复杂的题目,我们应当分析并提出性质,并进一步证实(证明或用暴力测数据),从而简化题目。

  76. 函数传数组使用的是指针时,memset(dis,0x3f,(n+5)*sizeof(int)),而不能直接写sizeof dis

  77. 一二题一般都是简单题,很少有数据结构。如果有,操作也会比较简单。但是如果是树套树之类,那就是你写错了。

  78. 在做计数类题目的时候不能被其无序性迷惑,一定记住进行某种自定义的排序,使其变得有条理。

  79. 转化模型、寻找性质,以及拆贡献。

  80. 如果你 kmpget_nxt() 结果有问题,多半是没在字符串前面垫一个#

  81. 首先得知道矩阵可以解决这类经典问题:

    给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值

    把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j。令C=AA,那么C(i,j)=ΣA(i,k)A(k,j),实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点)。类似地,C*A的第i行第j列就表示从i到j经过3条边的路径数。同理,如果要求经过k步的路径数,我们只需要二分求出A^k即可。

  82. 矩阵一定要初始化大小和内容(包括重定义运算)

  83. 判断字符串是否相等使用哈希,自然溢出哈希会被卡。

  84. 线性基是一种很奇妙的东西,在求关于异或的东西的时候非常实用。同时,要注意它要与其它一些可以使用异或的数据结构区分,如01trie等。

    它主要的用途有:

      1. 最大/最小/ $k$ 大异或和
      2. 异或和数量
      3. 异或和的和
    

    同时又可以找到“子集”“子序列”等字眼,或者是图论中的某条路径的异或和时,就可以往线性基方向想了。

  85. 斜率优化尽量将 X 和 k 的负号去掉。

  86. 李超树维护区间最值时候记得 min(min(f(res[p],min(R,r)),f(res[p],max(l,L))),ans)

  87. 以后不要直接用 map 做 string 的映射,应当自己弄出 Hash 值

  88. 写双 Hash 防止被卡

  89. 对于一个问题,将其关键信息提取,首先考虑设计 dp 状态

  90. 比较类问题,可以预处理倍增的 Hash,后类似 LCA 地跳

  91. 要去关注到相邻 f 的关系,从而得到上下界之类的性质,用于优化时间复杂度

  92. 对于环上向后填充的一个 trick:有一条边没有人经过,可以断开这里并转换为链上问题

  93. \(16\) 子集枚举;\(20\) 状压,单个转移

  94. 构造排列:

    • 不断插入
    • 当放入合法数时,为了保持排列的性质,改变原来有的数(比如关心相对顺序时,加入\(k\),对于原有 \(\ge k\) 的数都 \(+1\))
  95. 套路删边变加边

  96. 对于这种最终结果依赖于最后一次操作的时候,考虑使用“浮水法”,反转操作顺序,它被操作后就不再变化了,而实际操作顺序就是新操作顺序的逆序。

  97. 点分治要统计以 \(u\) 为起点的路径

  98. 看到 最值+位运算 应当想到按位操作

  99. 树上,对于下方决策会对上方产生影响的,不防用 \(set\) 记录方案集合,上传处理

  100. 先模拟,后体会并思考算法

  101. 对于一些问题,可以转化为多种数学问题思考并解释

  102. 看到区间中位数,想到二分

  103. 对于子树统计,有一重要构造,一子树中有 $ ∑ d_i = (n \cdot 2) - 1$

  104. 对于二维多次处理,可以考虑二维差分(可以在扫过来的过程中边差分边处理)

  105. 对于互相独立的多个二分询问,考虑离线整体二分

  106. 遇到封闭图形求图形内权值和 可以转化为对行最一遍前缀和,然后按顺时针,计算所有向下的边减去所有向上的边就行了。

  107. 带依赖的背包 \(\to\) 树上背包\(\to\) 上下界优化/后序遍历优化

  108. 线段树合并是要注意 \(y\) 在此之后会不会被修改,如果会,每次合并要新开节点,并注意线段树要开大空间

  109. 动态加点

    • 倍增
    • 离线+树剖
  110. 区间 \(dp\) 的优化:开辅助数组统计关键信息,减少枚举。

    C. 火星细菌 - 暑期练习33 - 比赛 - ZLOJ

  111. \(2-SAT\) 枚举限制以模拟无限制情况,不用全部枚举,只要包含所有状态即可。

    F. 游戏 - 暑期练习33 - 比赛 - ZLOJ

  112. 2-SAT前缀优化建图注意边界的建图,不能遗漏!

  113. 矩阵的 trick:

    • 类似转移时若状态可以停留在原地,那么将点向新建的 \(0\) 节点连一条边并在 \(0\) 建自环;
    • 对于同条边不同边权,参见 迷路 的 trick,如果有权值 \(W\) 大于 \(1\) 的边,则将一个点分为 \(W\) 份,设原图第 \(i\) 个点分成的第 \(j\) 份为 \(V_{i,j}\)。则 \(V_{i,j}\) 向 \(V_{i,j+1}\) 连边(\(j<W\));设原图上 \(x\) 到 \(y\) 有一条边权为 \(z\) 的边,则 \(V_{x,z}\) 向 \(V_{y,1}\) 连边。
  114. DAG 删点最长路:处理出以每个节点为起点和终点的最长路,按照拓补顺序不断将在第一堆里的点拿出,并放入第二堆,用可删堆维护两堆之间的 \(f_u+1+g_v\) 的最大值。删点 / 边加查询最长 / 短路

  115. 交互题:1. 分治 2. 二分 3. 增量法

  116. 强制转化的时候长点眼睛!写成 ((__int128)x*y)而不是(__int128)(x*y)!

  117. 对于需要双指针维护不可差分信息(\(gcd\),背包等),考虑维护两个栈,\(l\) 到 \(mid\),\(mid+1\) 到 \(r\),动态维护并定期重构。

  118. 排列的下标与值得对应关系可类比为二分图

  119. 同种元素之间将对距离不变可能是 DP 突破口

  120. 注意写的 add 函数可能有负数!!!

  121. 发现一次函数形式并且要求最值的,可以用李超线段树维护。

  122. 正确的状态有利于发现正解的突破口(即使时间复杂度更劣),应当从体面所给的信息(或找出的性质)出发,特意地被引导到正确的方向。

  123. 注意有取模时要注意模数的大小,有可能两倍会爆int导致答案错误. 同时答案之间如果是加减可以if (ans >= P) ans-=P; 否则要 ans=1LL*ans*X%P

  124. 如果读入数据里有负数不能直接用读入挂,要判负号.

  125. 使用位运算时要注意可能会溢出(如1<<35和1>>35 均会溢出).(实例可见 Topcoder SRM 613 Div2 Level three)

  126. 三目运算符(?:)的优先级很低,甚至低于+、-,尽量少用或加括号.

  127. 部分位运算的优先级较高,如!、~,相当高,然后是*、/,再是+、-,最后是>>、<<,更低的有&、^、|.

  128. 涉及到LCA的问题要注意可能在同一个子树内计算.(CF715E)

  129. 结构体排序的operator一定要这样打:

bool operator < (const node &A)const{
    return ...
}

注意两个const不能掉.

  1. 处理割点时注意根节点的处理,当且仅当获得的搜索树中根节点的儿子不止一个时才算上.
  2. double型,printf()用%f输出,而scanf用%lf来接受输入(POJ3744)
  3. 有关概率dp常常是正推,期望可能是逆推,并且一定要注意到除数不为0,注意特判
  4. EPS可以取1e-9, 往往比较保险,double精度..
  5. Splay在Insert是如果遇到val==x时return的情况注意先splay一遍,更有利于把查找频率大的节点放在根附近达到均摊复杂度的目的
  6. 用Splay解决问题的时候一定要注意删除节点时对sz的影响,初始化节点的时候一定要son[x][0]=son[x][1]=0;
  7. 延迟更新是对节点u 的所有儿子使用的,对于节点p是直接更新的.(注意Splay 的规范性)

标签:二分,题目,优化,可以,experience,注意,My,dp
From: https://www.cnblogs.com/fight-for-humanity/p/18492275

相关文章

  • python爬虫数据存进mysql数据库
    一、安装mysql和mysqlworkbench我已经在电脑上安装了最新的mysql8.2.0,配置好环境变量,在命令提示符中以管理员的身份初始化并成功启动mysql数据库。前期因为以前的mysql没有卸载干净,导致mysql一直无法启动服务。所以一定要保证以前的mysql卸载干净才能重新安装,以前没有安装过......
  • MySQL - [20] 事务
    题记部分 一、什么是ACID(1)Atomicity原子性某个操作,要么全部执行完毕,要么全部回滚。(2)Consistency一致性数据库中的数据全都符合现实世界中的约束,则这些数据就符合一致性。比如性别的约束男or女,人民币勉之不能为负数,出生地址不能为null,参与转账的账户总余额不变;等等。(3......
  • actix-web连接mysql并返回json
    toml[dependencies]actix-web="4"mysql="25.0.0"chrono="0.4"serde={version="1.0",features=["derive"]}rsuseactix_web::{get,post,web,App,HttpServer,Responder,HttpResponse,Error};......
  • mysql的执行逻辑
    本篇章为构建mysql在执行过程中简单的业务流程,为后续的代码优化和面试构建基础。1、首先一条sql在执行时sql会通过网络传送给mysql2、在Mysql收到sql语句后会先在分析器中先判断一下SQL语句有没有语法错误。3、判断完语法之后语法无误,优化器会根据你写的sql判断执行什么索引。(......
  • 信创之达梦数据库(二)mysql迁移
    迁移前准备一、数据库工具在开始目录中可以看到安装后达梦数据库工具  二、创建用户和表空间打开上图的DM管理工具,在输入SYSDBA的口令后,展开如下画面2.1创建索引表空间在表空间右键选择【新建表空间】,填写表空间名和文件路径2.2创建表空间同上。两个表空间有什么......
  • spring mybatis upgrade to mybatisplus 实战小记
    我司压箱底儿的灵工服务商系统,系统框架是spring,持久层是mybatis。最近,将Mybatisplus集成到系统中,以提高开发效率。升级版本:mybatis版本3.2.2,升级到3.5.16Mybatisplus版本:3.5.3mybatis-spring版本1.2.0,升级到3.0.0pagehelper版本:5.3.1【注】mybatis官方提供了Myba......
  • mysql主从复制详细部署
    1、异步复制:这是MySQL默认的复制模式。在这种模式下,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接收并处理。这种模式的优点是实现简单,但缺点是如果主库崩溃,已经提交的事务可能没有传到从库,导致数据不一致。2、全同步复制:在这种模式下,主库执行......
  • MySQL数据库总结 我的学习笔记
    MySQL数据库总结一、数据库相关概念1.数据库2.数据库管理系统3.SQL4.常见的关系型数据库管理系统二、MySQL数据库1.MySQL目录结构2.MySQL数据模型三、SQL1.SQL简介2.SQL通用语法3.SQL分类4.DDL(数据定义)操作数据库操作表MySQL数据类型5.DML(数据操作)添加(insert)修改......
  • Node.js 创建MySql服务
    1.MySql服务1.安装依赖在终端执行如下脚本:npminstallmysql2npminstallcorsnpminstallexpress2.连接数据库并创建获取数据Apijs文件:index.jsconstexpress=require('express');constmysql=require('mysql2');constcors=require('cors');constap......
  • 2024/10/21 日 日志 --》关于Mysql中的数据库连接池 简述笔记整理
    为了保证博客内容的连贯性,我决定把Maven内容单独开辟而不与JDBC相混。以下为数据库连接池的简单描述和笔记整理点击查看代码--数据库连接池--简介:--·数据库连接池是个容器,负责分配、管理数据库连接。--·它允许应用程序重复使用一个现有的数据库连接,而不是再重新建......