赛用模板(想法)

  1. 当考虑数组所有子区间的异或时,可以考虑每个二进制位的贡献
  2. 三分一棵树,可能切下两个sum/3,也可能切下sum/3*2。记下所有sum/3的节点,排除存在sum/3儿子的父节点。
  3. 计算冒泡排序次数,树状数组点灯法,从小到大放时,树状数组内已有的数一定比当前数小
  4. 求区间出现偶数次的数的异或,可以分成出现奇数次和偶数次做,Ans=区间所有数^区间内出现过的数
  5. 最大值最小,最小值最大都可以用二分答案的做法
  6. 定数轴上有一点使其他点走到这个点的最小时间,可以二分时间,判断往右最左值和往左最右值是否相交
  7. 两个数组如果要多次进行交换,可以用01标记,交换的时候只需要flag=!flag即可
  8. 多个人走地图有多个终点,那么终点加入队列跑bfs,第一次走到的人那个人最近的终点就是当前点
  9. 当有两个属性的时候,先按照一个属性排序,再做另一个属性。比如摇钱树,按照消失速度排序,这样进来的一定是消失速度最慢的,如果需要就可以直接放到最后了
  10. 在涉及因子,素数之类的东西时可以以因子素数为角度去思考问题
  11. n ! > a n n!>a^n 可以两边取log进行化简
  12. 尺取法:往右延伸,直至这个区间满足要求,之后左端点往右延伸直到不满足要求,如此重复,可以得出最短的满足要求的区间
  13. 数组需要左移右移,或者需要一个数组减去某个数再和另一个数组比较的,或者数组本身为01代表可能与否的,可以用bitset优化
  14. 子区间个数,dp[i]表示前i个中的子区间个数,dp[i+1]=1+dp[i]
  15. 求树上的一段的值也可以用前缀和来预处理,而要在所有值中取一个最符合条件的值,可以按照树的中序遍历入栈,回溯时出栈。如果值是到root的距离,那么这个栈应该是单调栈
  16. 查询区间最值时可以用分块来做,预处理一个块的值,区间更新可以用一个数组来记录对一整个块的更新
  17. 单调栈从前往后维护比较麻烦的时候可以想一下从后往前
  18. 矩阵可以看成图的邻接矩阵
  19. 对于需要用一个物品做代价,却不知道是不是用以后的物品会更优,这个时候可以用优先队列,在非必须的情况下先入队列,等必须的情况下再拿出队列中最优的物品
  20. 涂色,排列,插入问题往往不是按照题目的眼光看待,比如从前往后涂,可能需要从全局的眼光看问题
  21. 多个n维点,两个点A,B这间的距离为(A1-B1)+(A2-B2)+…(An-Bn),求最近两个点距离,那么1001(+ - - +)的最大值加上0110(- + + -)的最大值就是答案
  22. 问在整个图中走到距离,可以分解成每条边的贡献,每条边的走过的次数可以根据边的左半个图和右半个图中的点来算
  23. 树状数组不仅可以求区间和,还可以做区间最值等其他线段树可以做的
  24. 快速查询区间,并且不需要修改,那么用RMQ最好
  25. 当题目给出多个从0开始的区间的时候,可以对区间的右端点进行前缀和操作,就可以得出右端点在特定区间内的区间的数量
  26. 考虑区间内和一个数互质的数,只需要容斥这个数的质因子,最多也就十几个,也就是说,组合起来也就2^10
  27. 大数模int,只需要从前往后一位一位处理,就可以跳过大数
  28. 求装满背包的方案数:dp[i][j]表示前i件物品中,装满j大小背包的方案数
  29. 四则运算时,前一个数不一定越大越好,因为可能乘除一个负数
  30. 一个人在k *a点产生影响,另一个在k *b点产生影响,那么可以到LCM为止的a和b的倍数放入队列,依次取出
  31. 求交集,就是左端点的最右值~右端点的最左值

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/82782944