![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
题解
myvanilla1
这个作者很懒,什么都没留下…
展开
-
ICPC上海 M-Gitignore 字典树 贪心
思路:将可删除的串标记上1,不可删除的串标记上0。通过dfs得到答案,遇到1直接++,遇到0则访问子树。#include <bits/stdc++.h>using namespace std;int n,m,tot,method[2050];map<string,int> trie[2050];char str[2050];queue<string> q;void init(){ for(int i=0;i<=tot;i++){原创 2021-06-03 09:30:09 · 133 阅读 · 0 评论 -
HDU2457 AC自动机 dp
思路:多模式串匹配问题首先想到AC自动机,需要记录单词的结尾。因为是最少改动数量所以想到dp,状态方程是dp[i][j],第一维存当前匹配到什么位置,第二维存当前ac自动机的状态。dp[i][j]=min(dp[i][j],dp[i−1][last]+是否改动)dp[i][j]=\min{(dp[i][j], dp[i-1][last]+是否改动)}dp[i][j]=min(dp[i][j],dp[i−1][last]+是否改动)#include <bits/stdc++.h>us原创 2021-06-03 08:32:56 · 138 阅读 · 0 评论 -
POJ2513 字典树 并查集 欧拉图
通过trie获得该颜色的id用并查集连接两个点,并且记录两个点的度欧拉图:奇度定点为0或2个,并且连通#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int maxm=1e7+500;int tot,col,trie[maxm][30],mark[maxm];int deg[maxm],fa[maxm],res;char c1[30.原创 2021-05-31 22:55:55 · 76 阅读 · 1 评论 -
POJ2001 字典树模板题
按题意模拟#include<stdio.h>#include<iostream>#include<string.h>#include<sstream>using namespace std;const int maxn = 1e7+500;char poul[1025][25], ans[25];int tot,cnt,trie[maxn][30],sum[maxn];inline void insert(char* str){ in原创 2021-05-31 19:34:19 · 85 阅读 · 0 评论 -
HDU2072 IO 字典树
先将一行读入,然后再分割。判断节点:看尾结点是否被标记。#include<stdio.h>#include<iostream>#include<string.h>#include<sstream>using namespace std;const int maxn =2e6+5;int tree[maxn][30];int tot,res;string str1,str2;bool mark[maxn];void insert(){原创 2021-05-31 19:02:34 · 81 阅读 · 0 评论 -
Gym 102788D 38 parrots
思路:左右可以开动态节点的线段树#include<bits/stdc++.h>using namespace std;#define ls rt<<1#define rs rt<<1|1const int maxn = 6e5+500;int l,r,op,tree[maxn<<2];inline void pushup(int rt){ if(tree[ls]==-1&&tree[rs]==-1) tree[rt]原创 2021-05-14 19:39:07 · 265 阅读 · 0 评论 -
POJ 1151扫描线 线段树维护
思路:将矩形拆成上界和下界,每次循环执行一条扫描线(矩形的一条边,不是同一y坐标的边的总和)通过线段树维护当前矩形的长度。#include <iostream>#include <algorithm>using namespace std;#define ls rt<<1#define rs rt<<1|1const int maxn = 1e5+500;struct seg{ double l,r,h; int f;原创 2021-05-13 19:28:41 · 135 阅读 · 0 评论 -
HDU 2874 ST表求树上距离 并查集
思路:先通过并查集判断两个点是否在同一棵树上如果在同一棵树上,通过ST表查询树上两点距离AC代码:#include <bits/stdc++.h>using namespace std;const int maxn = 1e4+500;int n,m,q,tot,beg[maxn],par[maxn],fa[maxn],dep[maxn],dis[maxn];struct node{int to,nex,val;}edge[maxn*2];int st[maxn][21原创 2021-05-13 09:56:53 · 127 阅读 · 0 评论 -
HDU 2586 ST表求LCA 树上距离
ST表递推公式:st[i][j]=st[st[i][j−1]][j−1]st[i][j] = st[st[i][j-1]][j-1]st[i][j]=st[st[i][j−1]][j−1]表示iii向上跳深度为2j2^j2j为iii向上跳深度为2j−12^{j-1}2j−1再向上跳深度为2j−12^{j-1}2j−1树上距离公式:dis[a,b]=dis[a]+dis[b]−2dis[lca(a,b)]dis[a,b] = dis[a]+dis[b]-2dis[lca(a,b)]dis[a,b]=d原创 2021-05-12 20:58:57 · 102 阅读 · 0 评论 -
POJ 2559 Largest Rectangle in a Histogram 单调栈
单调栈内维护的信息是当前高度和以当前高度能够绘制矩形的长度。思路:基于贪心的原理,我们希望以当前的高度能够画出更大的矩形。我们只要维护单调栈,即可获得当前高度向右边延展的最大长度。同时,向左边延展的长度保存在栈内,所以每次出栈的时候,我们都能更新答案。代码:#include <iostream>using namespace std;#define ll long longconst int maxn = 1e5+500;ll height,n,sz,res,length;pa原创 2021-05-12 14:52:29 · 68 阅读 · 0 评论 -
洛谷P1020 导弹拦截 树状数组区间求最值
题目描述某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。思路:求最多能拦截多少导弹是求最长不升子序列求配备多少套这种系统是求最长原创 2021-05-12 10:41:53 · 132 阅读 · 0 评论 -
ICPC昆明 M-Stone Game 可持久化权值线段树维护区间和
题目大意:给定[l,r]区间,区间内的数字任意组合。求最小不能被表示出来的数字。思路:如果没有元素1,则答案就是1我们设当前能表示出来的最大整数是x,那么在小于等于x的元素中,任意选出一个元素b。x+b中的元素都可以表示出来。所以我们只需要从1开始,枚举当前答案的前缀和。如果前缀和小于当前答案。那么该答案就是正确答案。举例:1 20 12 2 5 2,查询[1,6]能表出的最小整数。ans = 1 , sum = 1ans = 2 , sum = 5 , 观察1,2,2序列,可以原创 2021-05-09 21:10:35 · 123 阅读 · 0 评论 -
HDU 2665 可持久化权值线段树区间求第k大
主席树区间求第k大的思路类似权值线段树树求[1,n]第k大。代码:#include <bits/stdc++.h>using namespace std;const int maxn = 1e5+100;int n,m,tot,rt[maxn];int a[maxn],b[maxn],len; //离散化struct node{int ls,rs,sum;}t[maxn<<5];//主席树int getid(int val){return lower_bound原创 2021-05-09 09:34:43 · 121 阅读 · 0 评论 -
HDU 4348主席树区间修改
如何区间修改:首先,我们不能进行线段树上的pushdown操作。因为这样做会让公共节点的值被修改。导致其他版本的线段树在查询时出现错误。对于每一次区间修改操作,我们让落在L<l&&r<=R区间上的新开的节点的儿子为历史版本的节点,我们可以把这样的节点理解为分界点。因为修改区间将这段区间覆盖之后,它的孩子节点必然需要新开节点。对新开的节点,除了孩子为旧节点的新开节点不需要pushup之外,其他的节点都需要pushup。既然不能pushdown,那我们就在query函数中多原创 2021-05-08 20:44:38 · 892 阅读 · 0 评论 -
HDU 4417 可持久化权值线段树区间求Rank
题目大意:给定T组数据,n个数,m次询问。每次询问[L,R]区间内,比k小于等于k的数的个数。解题思路:权值线段树可以在[1,n]区间内做Rank操作,但是题目要求在[L,R]内做Rank操作。我们可以想到主席树这种数据结构。解决这道题需要三个函数。build函数在一开始的时候要建立一棵空的主席树,即所有叶子节点信息都是0的主席树。叶子节点的值一定要有,但是它的ls,rs可以不给出。因为我们查询到叶子节点的时候,就会进入if(l==r)的条件判断中。update函数在本题中,我们每次只需要单原创 2021-05-08 19:32:35 · 117 阅读 · 0 评论