avatar
文章
166
标签
111
分类
5

首页
分类
友链
说说
Doraemon's Blog
搜索
首页
分类
友链
说说

Doraemon's Blog

数位DP
发表于2021-08-01|算法|数位DP
数位DP 解决的是求一段区间中满足一定条件的数的数量,形式固定 数位DP模板123456789101112131415161718192021int num[100],dp[100][...];int dfs(int pos,int ...,bool limit) { if(pos==0) return ; if(!limit && dp[pos][...]!=-1) return dp[pos][...]; int up=limit?num[pos]:9; int sum=0; for(int i=0; i<=up; i++) { if(...) sum+=dfs(pos-1,...,limit && (i==up)); } if(!limit) dp[pos][...]=sum; return sum;}//ps 如果有前导0就可以加一个 lead,一开始传1,然后后面就传lead&&(i==0)就可以了int work(int x) { int len=0; while( ...
半平面交
发表于2021-07-29|算法|计算几何
半平面交用于求几个凸包围成的面积 一条直线可以将平面分为两部分,我们取左半部分,右半部分舍弃,那么所有的直线围成的左半部分的面积的交集就是半平面交。 算法流程首先把所有线首先按照角度从小到大排序,角度相同就按照线从左到右排序,排序后用一个双端队列来维护,每次新进来一条边,判断这条边是否在队列的队尾两条边的交点左边,如果是,就把队尾元素pop出去,如此往复,队头也是如此,所有边遍历完后还要用队头去维护队尾,用队尾去维护队头 线点123456struct point{ double x,y;}pt[MAXN];struct line{ point a,b;}L[MAXN]; 函数思想很简单,但是实现很复杂,一点点错误满盘皆输,这8个函数非常有用 1234567891011121314151617181920212223242526272829point operator-(point a,point b){ //重载运算符 return {a.x-b.x,a.y-b.y};}double cross(po ...
判断是否存在一条线经过所有线段
发表于2021-07-26|计算几何
ACWING 如果一条直线经过了所有线段,那么把这条直线旋转之后,边界就是卡在两个线段的端点处 那么就可以遍历每两个端点,判断这两个端点组成的直线是否穿过了所有的线段,如果是,则存在,不是继续找,找不到就不存在 如何判断一条直线是否经过了所有点呢?挨个判断这条线是否穿过线段 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970#include <bits/stdc++.h>//#pragma G++ optimize(2)//#pragma G++ optimize(3,"Ofast","inline")#define debug freopen("in.txt","r",stdin); freopen("out.txt","w",stdout)# ...
可持久化01字典树
发表于2021-05-11|算法|可持久化系列
可持久化01字典树 作用:实现区间查询异或最大 时复:插入和查询都是O(logn) 算法流程先开一个内存池,动态开点,每次插入一个数都建一个根节点,从根节点拉出一条链,链上的节点一边连向上一个版本的节点,一边连向新插入的点,再开一个num数组表示每一个节点经过了几次,查询时当高版本的num值大于低版本的num值时表示在这个区间内有对应的值,走到最后直接返回即可 P4735 最大异或和 题意给定有初始值的n个数,m此操作,每次可以选择插入一个数或者查询一个区间内和给定的数异或最大是多少? 题解 代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970#include <bits/stdc++.h>#define ios ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)using namespace std;const i ...
01字典树
发表于2021-05-07|算法|01字典树
01字典树 01字典树: 解决最大异或问题 和字典树一样,只不过每一个节点的值不再是字符而是01,一个数从高位到低位对应于字典树从根到叶子,一个数二进制有多少位,就应该建几层树,包含根节点的那个编号0 树上的每一个点都有各自的编号,节点有两条边,分别是0和1,开空间时应该多开40倍左右 HDU4825 Xor Sum题目链接 这道题数据有点水,说是不超过2^32^,其实连int都没有爆,应该开33层(包含根节点),但是实际上32层就可以,代码是开了33层 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667#include <bits/stdc++.h>//#pragma G++ optimize(2)//#pragma G++ optimize(3,"Ofast","inline")#define debug freopen(" ...
15. 三数之和
发表于2021-05-07|算法|01字典树
先排序,两层for循环,二分寻找-(nums[i]+nums[j]),用map去重 时复:O(n2logn) 算上常数差不多9e8左右 刚好超时 寻找能优化的地方 因为排过序了,如果-(nums[i]+nums[j])<nums[j]就没必要找了,加上这句正好卡过去 123456789101112131415161718192021222324252627282930313233343536373839struct node { int a, b, c; bool operator<(const node &o) const { return a == o.a ? (b == o.b ? (c < o.c) : b < o.b) : a < o.a; } node(int ta, int tb, int tc):a(ta),b(tb),c(tc){ };};map<node, bool> vis;class Solution ...
117. 填充每个节点的下一个右侧节点指针 II
发表于2021-05-07|算法|01字典树
117. 填充每个节点的下一个右侧节点指针 II 题目有点类似于层序线索化,就是在层序遍历的基础上魔改一下,使得可以获得当前遍历到第几层的信息。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465/*// Definition for a Node.class Node {public: int val; Node* left; Node* right; Node* next; Node() : val(0), left(NULL), right(NULL), next(NULL) {} Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {} Node(int _val, Node* _left, Node* _right, N ...
11. 盛最多水的容器
发表于2021-05-07|算法|01字典树
11. 盛最多水的容器 题目所求即为最大面积,面积=(较短边*两线段距离),答案即为max{以每一条线段作为较短边的最大面积},当较短边确定时,两线段距离越长越好,因此考虑双指针从两端向内进行移动 考虑以下状态: 两指针在两端时,对于较短边而言,以此线段为较短边的最大面积就是线段长度乘以两指针位置之差,因此较短边对应的指针就可以向前或向后移动了。 移动后的状态又是以上状态。 因此每次较短边指针移动 12345678910111213141516class Solution { public: int maxArea(vector<int>& height) { int i = 0, j = height.size() - 1, res = 0; while(i < j) { res = max(res, min(height[i], height[j])*(j-i)); if(height[i] > height[j]) j -- ...
572. 另一棵树的子树
发表于2021-05-07|算法|01字典树
572. 另一棵树的子树 解法一、暴力遍历每一个子树,比较子树是否相同 时复:O(s * t) 1234567891011121314151617181920212223242526272829303132333435363738/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; ...
Typora使用配置
发表于2021-05-07|算法|01字典树
取消拼写检查默认会检查拼写错误,并在下方给予红线提示。 偏好设置->拼写检查->不使用拼写检查 取消自动保存偏好设置->自动保存 取消自动检查更新图像上传路径偏好设置->图像->插入图像时->复制到指定路径->设置图片保存路径 开启markdown扩展语法偏好设置->markdown->markdown扩展语法 代码块显示行号偏好设置->markdown->代码块
1…789…17
avatar
Doraemon
记录成长经历
文章
166
标签
111
分类
5
Follow Me
公告
纵岁月在笔尖洇开深浅,初心始终是砚台上那方不涸的墨。
最新文章
强化学习入门
强化学习入门2025-11-08
进程上下文到底是什么东西?
进程上下文到底是什么东西?2025-10-02
协程食用指南
协程食用指南2025-10-01
利用 Redis 实现分布式锁
利用 Redis 实现分布式锁2025-09-27
分布式 ID 的生成方案
分布式 ID 的生成方案2025-09-20
最新评论
正在加载中...
分类
  • 技术8
  • 生活5
  • 算法89
  • 记录23
  • 题目36
标签
线程池 线段树+欧拉函数 win10 二进制 进程上下文 动态规划 bitset优化 python 竞赛 小游戏 dfs 爬虫 可持续化并查集 算法 双端队列+BFS 刷题日记 事务隔离 数据结构 操作系统 tarjan 期望 数位DP GC 强化学习 字典树 遗传算法 迭代加深 基础数学 Oceanbase hexo 树链剖分 kmeans 离散化差分 JVM内存模型 sql语法 进程与线程 数论 基础算法练习 种类并查集 质因子分解
归档
  • 十一月 20251
  • 十月 20252
  • 九月 20255
  • 三月 20252
  • 二月 20255
  • 一月 20251
  • 九月 20243
  • 八月 20242
网站资讯
文章数目 :
166
已运行时间 :
本站总字数 :
260.2k
本站访客数 :
本站总访问量 :
最后更新时间 :
©2020 - 2025 By Doraemon
框架 Hexo|主题 Butterfly
Hi, welcome to my blog!
搜索
数据库加载中