随笔分类 -  HDU

摘要:对满足条件的发票做一遍01背包即可。 const int N = 3e6 + 10; int f[N]; int n; double m; void update(int v) { for(int j = m; j >= v; j--) f[j] = max(f[j], f[j - v] + v 阅读全文
posted @ 2021-06-22 23:38 Dazzling! 阅读(16) 评论(0) 推荐(0) 编辑
摘要:线段树裸题。 单点修改+区间查询。 const int N=2e5+10; struct Node { int l,r; int maxv; }tr[N<<2]; int score[N]; int n,m; void pushup(int u) { tr[u].maxv=max(tr[lc].ma 阅读全文
posted @ 2021-04-17 17:06 Dazzling! 阅读(31) 评论(0) 推荐(0) 编辑
摘要:刷表法。 对于某一个点(i,j)\(\)(i,j)\(\)(i,j)的方案数量。 状态表示: f(i,j):达到点(i,j)的方案数。 状态转移: \[ f(i+x,j+y)+=f(i,j) \\ 其中,x+y \le w[i][ 阅读全文
posted @ 2021-04-17 15:45 Dazzling! 阅读(45) 评论(0) 推荐(0) 编辑
摘要:将单词表中所有单词建立一棵字典树,再利用 cnt数组统计字典树中以每个字母结尾的字符串的个数。因此,在接下来的多次询问中,只需要返回单词最后一个字母对应的cnt数组值即可。 const int N=5e5+10; int trie[N][26],cnt[N],idx; void insert 阅读全文
posted @ 2021-04-17 12:02 Dazzling! 阅读(22) 评论(0) 推荐(0) 编辑
摘要:注意细节。 const int N=1010; char s[N]; int n; int main() { while(~scanf("%s",s)) { n=strlen(s); vector<int> res; int num=0; bool have=false; for(int i=0;i 阅读全文
posted @ 2021-04-05 21:04 Dazzling! 阅读(29) 评论(0) 推荐(0) 编辑
摘要:看到括号匹配当然想到栈了。 int main() { string s; while(cin>>s) { stack<char> stk; for(int i=0;i<s.size();i++) { if(s[i] == '(') stk.push(s[i]); else if(s[i] == ') 阅读全文
posted @ 2021-04-05 18:54 Dazzling! 阅读(27) 评论(0) 推荐(0) 编辑
摘要:有向图判环。 拓扑排序 判断拓扑排序的结果是否包含n个点。 const int N=110; vector<int> g[N]; int din[N]; int n,m; bool topo() { queue<int> q; for(int i=0;i<n;i++) if(din[i] == 阅读全文
posted @ 2021-03-02 17:57 Dazzling! 阅读(42) 评论(0) 推荐(0) 编辑
摘要:拓扑排序水题~。 const int N=510; vector<int> g[N]; vector<int> ans; int din[N]; int n,m; void topo() { priority_queue<int,vector<int>,greater<int>> q; for(in 阅读全文
posted @ 2021-03-02 16:59 Dazzling! 阅读(31) 评论(0) 推荐(0) 编辑
摘要:题意 给定n个点和n*(n-1)/2条边的无向图,求图的最小生成树,其中有些边已经确定(可能是最小生成树的一部分,也可能不是)。 思路 由于已经确定了部分边,在读入数据过程中,如果这条边已经被确定,那我们就用并查集将两点合并;如果这条边还未确定,那么我们将它放进边集数组等待Kruskal算法进行从小 阅读全文
posted @ 2021-03-02 16:34 Dazzling! 阅读(19) 评论(0) 推荐(0) 编辑
摘要:并查集裸题,注意0的特判,此时没有朋友关系,房间里只能留下一个人,其余100000001都要移出去。 const int N=1e7+10; int p[N]; int cnt[N]; int n,m; int find(int x) { if(x != p[x]) p[x]=find(p 阅读全文
posted @ 2021-02-25 13:11 Dazzling! 阅读(27) 评论(0) 推荐(0) 编辑
摘要:本题求一个数包含49的个数,典型数位DP问题。 状态表示:f[len][state]:当前为第len位,当前已统计的数字的状态为state。 其中,state有0,1,2三种值: state == 1,表示上一位为4 state == 2,表示高位已存在49 state == 0,其他情 阅读全文
posted @ 2021-02-21 10:45 Dazzling! 阅读(29) 评论(0) 推荐(0) 编辑
摘要:状态表示: dp[len][sta]表示当前第len位,上一位为last的情况下满足条件的数的个数。 int f[15][10]; int a[15]; int l,r; int dfs(int len,int last,bool limit) { if(!len) return 1; if(!li 阅读全文
posted @ 2021-02-20 23:08 Dazzling! 阅读(25) 评论(0) 推荐(0) 编辑
摘要:题目给出的是中缀表达式,所以要计算它的值主要是两个步骤: 中缀表达式转后缀表达式。 计算后缀表达式。 下面分别讲一下这两步。 中缀表达式转后缀表达式 ①设立一个操作符栈,用以临时存放操作符;设立一个数组或者队列,用以存放后缀表达式。 ②从左至右扫描中缀表达式,如果碰到操作数(注意:操作数可能不止一位 阅读全文
posted @ 2021-02-19 16:26 Dazzling! 阅读(38) 评论(0) 推荐(0) 编辑
摘要:哥德巴赫猜想,注意不要重复统计分解得到的素数对,即(3,7)\(\)(7,3)视为同一对。 const int N=35010; int primes[N],cnt; bool vis[N]; int n; void init(int n) { for(int i=2;i<=n;i++) if 阅读全文
posted @ 2021-02-12 20:34 Dazzling! 阅读(44) 评论(0) 推荐(0) 编辑
摘要:求多个数的lcm,水题~ int n; int gcd(int a,int b) { return b?gcd(b,a%b):a; } int lcm(int a,int b) { return a/gcd(a,b)*b; } int main() { int T; cin>>T; while(T- 阅读全文
posted @ 2021-02-12 12:21 Dazzling! 阅读(31) 评论(0) 推荐(0) 编辑
摘要:贪心基础题。 每种药水的体积是相同的,那么影响浓度的只能是每种药水的浓度,属于集装箱问题。 将药水浓度从小到大排列,然后依次相加求平均值,直到平均值大于所给浓度限制。 const int N=110; int a[N]; int n,v,w; int main() { int T; cin>>T; 阅读全文
posted @ 2021-02-04 00:27 Dazzling! 阅读(40) 评论(0) 推荐(0) 编辑
摘要:贪心水题 ~ 。 按性价比从大到小排序即可。 const int N=1010; PDD a[N]; int n,m; bool cmp(PDD &a, PDD &b) { return a.fi/a.se > b.fi/b.se; } int main() { while(cin>>m>>n) { 阅读全文
posted @ 2021-02-03 23:59 Dazzling! 阅读(37) 评论(0) 推荐(0) 编辑
摘要:状态表示:dp[i]是必须以A[i]结尾的连续序列。 那么只有两种情况: 这个最大和的连续序列只有一个元素,即以A[i]开始,以A[i]结尾。 这个最大和的连续序列有多个元素,即从前面某处A[p]开始(p<i),一直到A[i]结尾。 对第一种情况,最大和就是A[i]本身。 对第二种情况,最大和是dp 阅读全文
posted @ 2021-02-01 19:43 Dazzling! 阅读(51) 评论(0) 推荐(0) 编辑
摘要:注意是要求最大化高度(运输量),而不是最小化路径长度。 于是二分高度,判断只走高度不超过mid的边的情况下,到达终点的最短距离。若不能抵达终点则返回false。 最后输出答案时要先check()出最优解再输出。 const int N=1010; struct Node { int v,h,c; 阅读全文
posted @ 2020-12-20 17:20 Dazzling! 阅读(58) 评论(0) 推荐(0) 编辑
摘要:LCS简单变形 状态表示:f(i)1i中最长上升子序列的和值。 状态转移: f(i)=\begin a[1],i = 1\max(f(k)+a[i]),1≤k<i && a[i]>a[k] \end const int N=1010; int f[N]; int a[N]; 阅读全文
posted @ 2020-12-19 20:53 Dazzling! 阅读(45) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示