数据结构
文章平均质量分 60
幼儿园大哥~
笑口常开,好彩自然来
展开
-
Codeforces 134 B
传送门题目大意假设我们有一对数字(a,b)(a,b)(a,b)。我们可以在一步中从给定的对中得到一个新的对(a+b,b)(a+b,b)(a+b,b)或(a,a+b)(a,a+b)(a,a+b)。让最初的一对数字是(1,1)(1,1)(1,1)。你的任务是找到数字kkk,也就是说,将(1,1)(1,1)(1,1)转换成至少一个数字等于nnn的一对所需的最少步数。思路dfsdfsdfs反向遍历,当KaTeX parse error: Expected 'EOF', got '&' at po原创 2021-03-12 21:24:16 · 245 阅读 · 1 评论 -
POJ 1988 Cube Stacking(并查集)
传送门题目大意两个人在玩叠箱子游戏,这个游戏有两个操作。1.M x y1.M\ x\ y1.M x y代表把xxx所在的一列整体放倒yyy所在一列之上2.C x2.C\ x2.C x代表数一下xxx下方有几个箱子思路并查集fa[i]fa[i]fa[i]代表i的父亲结点num[i]num[i]num[i]代表包括iii结点在内的其子树结点的个数dis[i]dis[i]dis[i]表示iii点到根结点的距离在合并函数过程中不断进行路原创 2021-01-22 23:49:25 · 133 阅读 · 0 评论 -
LOJ 10077 最短路计数(dij)
传送门题目大意给出一个 NNN 个顶点 MMM 条边的无向无权图,顶点编号为 1∼N1\sim N1∼N。问从顶点 111 开始,到其他每个点的最短路有几条。思路dijdijdij求最短路增加ansansans数组记录答案如果刚计算出最短路,ans[v]=ans[u]ans[v]=ans[u]ans[v]=ans[u]如果最短路相同,ans[v]+=ans[u]ans[v]+=ans[u]ans[v]+=ans[u]代码int n,m,q=0;;struct Edge{ int u;原创 2021-01-22 21:16:29 · 219 阅读 · 1 评论 -
购物券(DFS+哈希)
题目大意【题目描述】小Y得到了两张价值不菲的SHOP购物券,所以他决定去买N件礼物送给朋友们。小Y选好了n件礼物,并且它们的价格之和恰好为两张购物券的面值之和。当小Y被自己的聪明所折服,高兴地去结账时,他突然发现SHOP对购物券的使用有非常奸诈的规定:一次只允许使用一张、不找零、不与现金混用。小Y身上根本没有现金,并且他不愿意放弃挑选好的礼物。这就意味着,他只能通过这两张购物券结账,而且每一张购物券所购买的物品的总价格必须精确地等于这张购物券的面额。怎样才能顺利地买回这n件礼物呢?你的任务就是帮助小Y确原创 2021-01-22 21:45:13 · 219 阅读 · 1 评论 -
POJ 1733 Parity game(种类并查集)
传送门题目大意输入n表示有一个长度为n的0,1字符串, m表示接下来有m行输入, 接下来的m行输入中x, y, even表示第x到第y个字符中间1的个数为偶数个, x, y, odd表示第x到第y个字符中间1的个数为奇数个, 若m句话中第k+1是第一次与前面的话矛盾, 输出k;思路若x, y之间1的个数为偶数个, 那么1~x 与1~y中1的个数同奇偶性, 反之则异奇偶性, 我们可以将其理解为若输入x, y, even, 即x, y属于同种, 反之则属于不同种。输入的数据中x, y是闭区间, 不好处理原创 2021-01-22 01:04:23 · 118 阅读 · 0 评论 -
POJ 1984 Navigation Nightmare(带权并查集)
传送门题目大意有多个点,在平面上位于坐标点上,给出一些关系,表示某个点在某个点的正东/西/南/北方向多少距离,然后给出一系列询问,表示在第几个关系给出后询问某两点的曼哈顿距离,或者未知则输出-1。思路op用来表示方向,东南为正方向如果是南北,改的是x轴,东西改的是y轴代码int fa[maxn];int disx[maxn],disy[maxn];int n,m;struct node{ int x; int y; int v; char dic[10];//方向 }str[原创 2021-01-19 20:35:57 · 84 阅读 · 0 评论 -
POJ 1456(贪心+思维并查集)
传送门题目大意给出一些商品的价值与截止时间,问最多能卖多少钱思路贪心先卖出价值最大的商品,先用按照价值从大到小sort排序。假如能卖出,那么和他截止日期在同一天的就必须比他早卖出,就需要一直往前找,若是为0,就证明不能卖出了。代码struct node{ int p; int d;}str[10009];int cmp(node a,node b){ return a.p>b.p;}int fa[maxn];int find(int x){ if(fa[x]==-1)原创 2021-01-17 22:41:00 · 122 阅读 · 0 评论 -
POJ 1182 食物链(带权并查集||种类并查集)
传送门题目大意动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这N个动物所构成的食物链关系进行描述:第一种说法是"1 X Y",表示X和Y是同类。第二种说法是"2 X Y",表示X吃Y。此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。1) 当前原创 2021-01-14 20:38:12 · 92 阅读 · 0 评论 -
LDU---2021年初寒假训练第8场 B.MOO游戏
Description众所不知的,奶牛们很喜欢玩智力游戏。John农夫最近发明了一个有趣的“找单词”游戏。 这个游戏的例子如下:USOPENOOMABOMOOMXOPQMROM作为奶牛,他们只对单词“MOO”有兴趣,这个可能会出现在找单词游戏中的任何地方,可能是水平的,可能是垂直的,也有可能是对角线的出现,也就是找相邻四个位置和对角线位置。上面的例子出现了6个MOO。John农夫也是单词游戏的粉丝。 由于奶牛们不想在他们有机会试一下之前,John就把解开了,他们把游戏的内容用一个代替密码给加密原创 2021-01-14 19:08:46 · 593 阅读 · 1 评论 -
POJ 1577 Falling Leaves(二叉搜索树)
传送门题目大意构造一棵树,输出其先序遍历。根据字母表顺序,左子树上的任意结点字母都在根结点前面,而右子树上的任意结点字母都在根结点后面。其中输入数据很独特,首行把二叉树的所有叶子结点列出来组成一个字符串,然后从去掉叶子结点后所形成的新二叉树中再找叶子结点,再组成一个字符串,依次进行下去,直到剩下一个根结点为止。思路可以把输入数据保存在一个二维字符数组里面,然后建立一个结构体储存二叉树的结点与左右孩子信息。代码struct node{ char val; int l; int r;}tr原创 2020-12-01 15:50:08 · 187 阅读 · 1 评论 -
POJ 2418 Hardwood Species(字典树||map)
字典树传送门题目大意给你很多个单词,要你统计单词出现的次数,最后按字典升序输出思路因为字典序的先序遍历是排序的,所以只需建好树后先序遍历一下树就可以满足题目要求的输出方式了。裸的Trie树,输出按字符串的字典序输出,所以插入的时候,把第一次出现的字符串暂时保存起来。以后排完序在查询输出即可字典树代码struct node{ int val; int child[130]; node(){ val=0; memset(child,0,sizeof child); }}tire[原创 2020-12-01 13:18:57 · 161 阅读 · 0 评论 -
LDU 2020下半年十三周训练 D 单词(拓扑排序)
【问题描述】在一种未知语言中,很多单词被发现了,但是他们的字母的字典序我们是不知道的。我们知道的是,这些单词是按照字典序从小到大排列的。或者找出这种语言唯一的字母的字典序,或者得出这种方案是不存在的,或者得出有很多种这样的方案。【输入格式】第一行包括一个正整数n(1 <= n <= 100),表明单词的数量。接下来n行,每行一个单词,每个单词最多包含10个小写的英文字母。保证单词以未知语言的字典序给出。【输出格式】有且仅有一行,输出包含所有字母的字典序。如果没有这种字典序,则输出“原创 2020-11-30 19:52:44 · 213 阅读 · 1 评论 -
HDU 5444Elven Postman(二叉树)
传送门题目大意给你一个序列,第一个数为二叉树根节点,之后每个数往上加节点,且保证左节点小于根节点,且保证右节点大于根节点。且每个节点最多有2个子节点。然后再查询位置,每往左找输出一个E,右找输出W。思路按照给定的序列建树查找即可代码int n;struct node{ int l; int r; int val;}tree[maxn];int tot;void init(int tot){ tree[tot].l=tree[tot].r=-1;}void build(in原创 2020-11-29 17:04:10 · 121 阅读 · 0 评论 -
HDU 1710 Binary Tree Traversals(二叉树遍历)
传送门题目大意根据给出的二叉树的前序遍历和中序遍历,求出后序遍历思路根据先序找到根,根据中序找到左右孩子代码int t1[1001],t2[1001];void find(int a,int b,int n,int flag){ if(n==1){ printf("%d ",t1[a]); return ; } else if(n<=0){ return ; } int i; for(i=0;t1[a]!=t2[b+i];i++) ;//找到根节点 find原创 2020-11-27 18:33:05 · 137 阅读 · 0 评论 -
HDU 3791 二叉搜索树
传送门题目大意判断两序列是否为同一二叉搜索树序列思路直接暴力找,如果这个数大于他就是左孩子,否则就是右孩子代码int main(){ char s[20]; int tree[550],tree1[550]; int n; while(cin>>n){ if(n==0)break; scanf("%s",s); memset(tree,-1,sizeof tree); for(int i=0;s[i];i++){ int c=s[i]-'0'; i原创 2020-11-27 13:54:25 · 86 阅读 · 0 评论 -
Codeforces 986 A
传送门标签是数论,结果是个最短路,有点点小懵逼。BFS题目大意n个城市,每个城市分别产生一种商品,商品种类一共有k中,问从第i个城市出发至少得到s件商品的最短路径。思路对于每一个小镇i,求出到每件物品j的最短距离即可。代码int n,m,s,k;int a[maxn];vector <int> e[maxn];int vis[maxn];int step[maxn][120];int main(){ cin>>n>>m>>k&g原创 2020-11-23 11:10:14 · 105 阅读 · 0 评论 -
最大子序和(优先队列+前缀和)
传送门题意输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大。思路先用sum[]存一下序列的前缀和我们需要找到一个最大的sum[r]-sum[l](r-l<=m)拿双端队列维护最优解的情况就是下标递增,sum[]也递增才可以代码int a[maxn],sum[maxn];deque<int>q;int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++){原创 2020-11-22 16:39:46 · 297 阅读 · 1 评论 -
UPC 问题 K: 最勇敢的机器人(分组背包+并查集)
题目描述机器人们都想知道谁是最勇敢的,于是它们比赛搬运一些物品。它们到了一个仓库,里面有n个物品,每个物品都有一个价值Pi和重量Wi,但是有些物品放在一起会爆炸,并且爆炸具有传递性。(a和b会爆炸、b和c会爆炸则a和c会爆炸)机器人们可不想因此损失自己好不容易从Wind那里敲诈来的装备,于是它们想知道在能力范围内,它们最多可以拿多少价值的物品。你能帮助它们吗?输入每组测试数据第1行为n,Wmax,k(0<=n,Wmax,k<=1000)接下来n行,为每个物品的Pi,Wi(0<原创 2020-11-22 13:38:52 · 284 阅读 · 0 评论 -
POJ 2227 The Wedding Juicer(优先队列+BFS)
传送门题目大意一个矩形区域,高低起伏,求最多储水量。(边界不能储水)思路先将边界加入优先队列,每次取高度最小的点,找与其相邻且未访问过的点,若邻点高度大于等于它,直接加入优先队列更新边界,否则更新答案,并将邻点的高度置为该点高度,然后加入优先队列更新边界。代码struct node{ int x; int y; ll h; bool operator<(const node X) const{ return h > X.h; } node(in原创 2020-11-20 17:24:01 · 219 阅读 · 0 评论 -
POJ 2259 Team Queue(队列)
传送门题目大意现在有t组队伍,每个队伍有一些人,每当有人来的时候,只要前面有他认识的(即在一个队的),他就可以插进去,否则就要从后面排队,问每次输出是谁思路维护两个队列一个qt用来存当前已经有人的队伍的标号,即只要这个队伍里其他人来了,就可以插进来一个qd用来存队伍内部的先来后到代码queue<int> qd[maxn];//各个team内部排序 queue<int> qt;//team排序int vist[maxn];int main(){ int t;原创 2020-11-20 13:25:01 · 169 阅读 · 0 评论 -
POJ 1442 Black Box(优先队列+对顶堆)
传送门题目大意有一些ADD和GET操作。n次ADD操作,每次往序列中加入一个数,由ADD操作可知序列长度为1-n时序列的组成。GET操作输入一个序列长度,输出当前长度序列第i大的元素的值。i初始为0,每次GET操作i先加1。给出的GET操作输入非降。思路对顶堆大根堆维护小于当前需询问的节点的值小根堆维护大于当前需询问的节点的值那么大根堆的size等于当前询问的节点时,大根堆的堆顶就是答案。代码ll u[maxn],a[maxn];//小根堆维护大于等于当前节点的数//大根堆维护小于当前原创 2020-11-19 21:43:33 · 183 阅读 · 0 评论 -
HDU 1702 ACboy needs your help again!(栈+队列裸题)
传送门题目大意FIFO代表先进先出FILO代表先进后出问输出顺序思路构造一个栈,一个队列栈是先进后出,队列先进先出代码stack<int>s;queue<int> q;int main(){ int t; cin>>t; while(t--){ int n; scanf("%d",&n); while(!s.empty()){ s.pop(); } while(!q.empty()){ q.pop();原创 2020-11-19 20:48:35 · 255 阅读 · 1 评论 -
HDU 3282 Running Median( 对顶堆+优先队列)
传送门题目大意给你n个数,当数的数量是奇数的时候就输出它们的中位数思路对顶堆板子题。维护一个大根堆一个小根堆原创 2020-11-18 13:43:43 · 178 阅读 · 1 评论 -
HDU 4041 Eliminate Witches! (栈+队列)
传送门题目大意给你一个串,构成一棵树。然后对数进行先序遍历输出。其中,整个串由节点名字( ). 组成,遇到一个括号时,当前左括号是当前括号内节点的父节点,括号内用’,'隔开的是兄弟节点,整体就是一颗树;思路...原创 2020-11-18 12:25:19 · 86 阅读 · 0 评论 -
HDU 4857 逃生 (拓扑排序+队列)
传送门拓扑排序题意m组约束,必须保证a在b前面,(数据保证无环),输出顺序。思路拓扑排序模板题。从拓扑这个角度看,排序唯一性的本质就是所有的待排项满足全序关系思想:1.拓扑排序要储存每个点的序号以及他的入度和邻边,为节省空间,使用vectoredge[maxn]来储存相应序号的邻边2.邻边的清空,每选出一个点,要消除所有和他相邻的边,即让他的入度减一即可,若入度为零,则入队列。代码int n,m;int num[maxn];vector<int>edge[maxn];原创 2020-11-18 09:59:21 · 172 阅读 · 0 评论 -
POJ 3278 Catch That Cow (BFS+队列)
传送门题意给定n和k,通过n+1.n-1.n*2三种操作,使得n==k,问最小操作数思路1.设置一个队列Q,从顶点出发,遍历该顶点后让其进队;2.出队一个顶点元素,求该顶点的所有邻接点(对应于此题即FJ的三种走法), 对于没有遍历过的邻接点遍历之,并让其进队;3.若队空停止,队不空时继续第2步。即若n=5,则将4,6,10入队列。代码int vis[maxn],step[maxn];queue<int>q;int bfs(int n,int k){ int now,n原创 2020-11-16 12:21:33 · 136 阅读 · 0 评论