---数据结构---
cyl纤云弄巧
To Be
展开
-
I - Ugly Problem HDU-5920
I - Ugly ProblemHDU - 5920 题意: 有一个大数,长度不超过1000,现在需要分解它,并且分解出来的数字都是回文数字,求出每一个分解 的个数和每一个分解的的数字。要求个数不能超过50.题意: 此类题需要思维发散,向回文串的思路走的话会想到先找出一半,然后复制另一半,得到的数字必然是回文串,并且尽可能的大,当然会遇到此回文串比原串 大,即应该将左边的一半减一再还原,原创 2017-10-16 21:46:50 · 289 阅读 · 0 评论 -
HDU 6060 minimal Steiner Tree 求贡献值
minimal Steiner Tree 求贡献值题意: 给出一个minimal Steiner Tree的树,其实就是一个最小生成树,现在要把2-n的节点分为k部分,每一部部分都是一个点的集合,每隔集合加上节点1都有把所有点链接起来的总cost,求其和,输出最大的和即可。思路: 我们无法把除了1 的节点的其它节点分成k中情况,因为情况太多。但是边的数量和权值都知道,如果能求出每一条边在分原创 2017-08-02 15:48:58 · 268 阅读 · 0 评论 -
HDU 4747 线段树 区间更新
线段树 区间更新题意: 给出一个数列,现在定义一个function,数列的某一个区间[i,j][i,j]里从0开始没有出现的最小值就是f(i,j) 的值。 现在请求出该数列所有子区间的函数值。思路: 首先太菜,看题,看数据、看意思、分析函数,但是也没有看出这是一个可以用线段树解决的问题。比较菜。分析数据200000的数据量,其子区间会很多,暴力解决必定超时,而在分析函数,每次如果原创 2017-07-31 09:22:05 · 314 阅读 · 0 评论 -
POJ 1442 (treap 求出名次入门)
题意: 给出一列数字,有m个问题,分别是数列前ai个数字中第i小的数字是多少。 思路: 正常的算法是每次都遍历一边找到第i小的数字,但是在数字范围大的时候会超时,所 不赞同用这样的方法。而名次树treap恰好能很方便的求出名次。treap是由平衡二叉 树和堆结合而成的。平衡树中一个节点的左儿子值都小于该节点,右儿子的值都大于该 节点。而堆得存在使得二叉树的深度能够保原创 2017-07-20 19:58:22 · 456 阅读 · 0 评论 -
POJ 3264 (ST表的简单使用)
题意: 给一个数列,有Q个查询,每次查询L,R区间的最大值和最小值,输出他们的差。思路: st表对于区间查询来说是特别方便的,维护两个二维数组,分别是代表某一个区间的最>大值和最小值,st[i][j] 表示第i个数字和其之后的2^j 个数字的最值。那么二重循环进 行比较。值得一说的是:st用到的是二进制的运算,其快速是一个特点。具体函数看代码。 #include <iostr原创 2017-07-20 11:29:29 · 593 阅读 · 0 评论 -
POJ2082(简单堆栈)
poj2082堆栈是一种先进后出的数据结构。他有一个栈顶指针,通过对对战的入栈和出栈的控制,可以改变一个序列的顺序。这道题很不易发现的是在输入的n组矩形数据之中要找出组成的最大面积可以把长度大切割。代码之中注意ans的重大作用。#include#include#includeusing namespace std;struct rec{ int w;原创 2016-07-31 11:20:48 · 494 阅读 · 0 评论 -
POJ 1363 (简单栈)UVA 514
UVA 514POJ 1363太苦逼的一道题,关于输入,关于栈的初始定义。不过这道题应该学会的是分部模拟。车厢进栈有两种情况,一种是进直接出。另一种是进了不出。接着就是判断A,B就行。#include#includeusing namespace std;const int MAXN = 1010;int n,target[MAXN];int main()原创 2016-08-11 17:26:32 · 414 阅读 · 0 评论 -
POJ 3250 Bad Hair Day (栈的简单应用)
http://poj.org/problem?id=3250题意:一排全都向右看齐的牛,第 i 头牛可以看到在它右边且比它低的不被比它高的牛所遮挡的牛。问1~n头能看见的和。刚开始我用最基础的方法写,但是超时了,当然poj也不会出这样简单的水题.太天真了。超时代码。#include__int64 a[80005],ans;int main(){ int原创 2016-08-28 09:47:05 · 528 阅读 · 0 评论 -
Codeforces#420 C. Okabe and Boxes
C. Okabe and BoxesOkabe and Super Hacker Daru are stacking and removing boxes. There are n boxes numbered from 1 to n. Initially there are no boxes on the stack.Okabe, being a control freak, gives Daru原创 2017-06-27 22:17:28 · 615 阅读 · 1 评论 -
HDU 6121 满k叉树 + 思维
满k叉树 + 思维题意: 给出n个节点,按照 公式给的方式建树,每一个节点儿子节点的个数加上自己本身就是它的size,求出n个节点的size的^值。思路: 首先需要知道这个树是什么样子的,通过在本子上画图很容易发现这就是一个k叉树。对于一个满的k叉树,其所有size的异或值就是size本身通过这个性质发现,难点是在于怎么找到所有的子满k叉树,问题变成找到不满的k叉树的子树,然后知道其原创 2017-08-16 21:53:24 · 586 阅读 · 0 评论 -
HDU 6070 二分查找 + 线段树 + 枚举
二分查找 + 线段树 + 枚举题意: ACM-ICPC比赛中提交题目会有很多不同的情况,现在给出一个队伍的全部提交情况,只有AC和WA,以序列的形式给出,相同的数字最后出现的一次便是AC,定义一个区间的DirtRatio=cnt(AC)/sum(submit)Dirt Ratio = cnt(AC)/sum(submit) 也就是整个区间的AC 的数量除以总的提交次数,求出最小的比值是原创 2017-08-04 17:11:37 · 330 阅读 · 0 评论 -
POJ 3107 dfs 树的重心
树的重心题意: 给出一棵树,现在让拿去一个节点,问拿去那个节点使得剩下的森林中最大的节点个数最小?思路: 当拿去一个节点的时候,不知道拿去那个,但是可以通过深度搜索把每一个节点都遍历,对于一个节点u: 当拿去时答案就在它的父亲节点有多少个和儿子节点中最大的那个之中,所以一个深搜即可。 问题是如果建图用vector会超时,可见STL之中虽然便捷但是很慢,选择用邻接表来建立原创 2017-08-06 13:21:36 · 312 阅读 · 0 评论 -
Codeforces Round #411 (Div. 2) E - Ice cream coloring
E - Ice cream coloring题意: 有一棵树T,节点为1~n,现在有m种ice cream,每一个节点都有si种ice cream,现在新建一棵树G,节点为ice cream 的种类数,标号为1~m,边是否相连有如下规则: if and only if there exists a vertex in T that has both the v-th and the u原创 2017-10-11 22:19:10 · 295 阅读 · 0 评论 -
知道前序序列和后序序列求二叉树的个数+大数
知道前序序列和后序序列求二叉树的个数+大数题意: 给出一个二叉树的前序遍历和后序遍历,问有多少个满足这样结构的二叉树?思路: 直接画一个最简单的二叉树,比如根节点恰好只有一个儿子,那么写出前序遍历和后序遍历会发现,根据两个遍历结构无法判断二叉树根节点的儿子是左儿子还是右儿子,那么其实只要找出这样的结构有多少个就行了,那么答案就是2的多少次方。#include <iostream>#in原创 2017-09-09 09:16:28 · 1445 阅读 · 0 评论 -
HDU 5475 线段树 + 乘法+取模
线段树 + 乘法+取模题意: 有一个数字最开始是1,现在有两种操作,1. 乘以一个数字y,取模输出答案2. 除以一个之前乘以的数字,取模输出答案。思路: 操作次数有1e5个,直接乘法也有可能,但是问题是一些数字乘了又除了,直接写很容易由于精度的问题爆了。而线段树竟然可以这样解决!!!线段树维护所有操作,核心操作是乘法,当除以一个数字时,就把那个数字改为1,然后轻轻松松根据回溯就可以不超精原创 2017-08-29 17:41:21 · 355 阅读 · 0 评论 -
51Nod 1304 字符串的相似度
1304 字符串的相似度题目来源:基准时间限制:1 秒 空间限制:131072 KB 分值: 320 给出一个字符串S,计算S同他所有后缀的相似度之和。例如:S = “ababaa”,所有后缀为:ababaa 6babaa 0abaa 3baa 0aa 1a 1S同所有后缀的相似度的和 = 6 + 0 + 3 + 0 + 1 + 1 = 11Input输入一个字符串S(1 <= L <= 10000原创 2017-09-13 22:29:56 · 335 阅读 · 0 评论 -
HDU 6121 K叉树的异或值和
K叉树的异或值和题意: 给出n个节点,节点按照(i−1)/2(i-1)/2 为i的父亲进行建树。问这棵树每一个节点的size异或值的和是多少。思路: 画完图发现这就是一个k叉树,对于k叉树有两个性质: http://blog.csdn.net/jaihk662/article/details/77203877#reply 性质:对于一颗满k叉树而言,如果k是偶数,那么它的异原创 2017-08-23 14:25:42 · 354 阅读 · 0 评论 -
POJ 2406 kmp + 循环节
kmp + 循环节题意: 给出一个字符串求出它是由几个循环节组成的。思路: 若一个字符串有循环节,那么整个字符串前缀与后缀相同的最长长度就是循环节的个数-1,并且总的字符串长度可以除尽循环节长度。根据这两条性质利用Next取判断即可。#include <iostream>#include <cstdio>#include <cstring>using namespace std;co原创 2017-08-23 08:15:00 · 286 阅读 · 0 评论 -
POJ 2406 kmp + 循环节
kmp + 循环节题意: 给出一个字符串求出它是由几个循环节组成的。思路: 若一个字符串有循环节,那么整个字符串前缀与后缀相同的最长长度就是循环节的个数-1,并且总的字符串长度可以除尽循环节长度。根据这两条性质利用Next取判断即可。#include <iostream>#include <cstdio>#include <cstring>using namespace std;co原创 2017-08-23 08:14:33 · 300 阅读 · 0 评论 -
HDU 2752 kmp next的应用
kmp next的应用题意: 给出一个字符串,这个字符串有很多前缀额和后缀,现在问有多少前缀与后缀相同,输出其长度即可。思路: 这道题利用到了next数组的含义:Next[i] 在子串0~i-1长度为i的子串中最长的前缀与后缀相同的长度。那么通过Next[len-1] 找到一个最长的,然后在最长的子串中接着找出次长的,以此类推。#include <iostream>#include <原创 2017-08-21 10:08:19 · 332 阅读 · 0 评论 -
POJ 1611 (并查集)
题意: 有n个学生,编号0~n-1,现在有m个由学生组成的群体,群体里面有一个感染病的话 都感染,0是最初的感染源。思路: 最开始以为直接Find()就行了,把每一个群体的第一个人当作father,但是发现这 样会重合,使得被0感染的并且在其它群体的人找不到,后来发现直接按照群体来合并 这样最后直接找0在哪一个群体就行了。/*#include <iostream>#原创 2017-04-24 20:08:09 · 270 阅读 · 0 评论 -
F. Palindrome
题意: 有n个字符,里面有?,可以表示任何字母,在满足m个约束条件的情况下, 求出有多少种可能,记得mod一个大数。思路: 重要的是要分情况,一个?在计算的时候,只能是1或者26种可能,所以 用并查集去区分它们。#include <iostream>#include <cstdio>#include <cstring>using namespace std;const i原创 2017-04-21 20:28:49 · 341 阅读 · 0 评论 -
HDU 4282 (比较厉害的 二分)
题意: 有一个式子: X^Z + Y^Z + XYZ = K,现在给出K,问有多少XYZ的组成方式, 注意条件:X < Y, Z > 1,0 < K < 2^31; 思路: 若想直接暴力解决,需要三重循环,铁超。。。所以现在能不能加速?二分可以, 需要提前准备,如果提前把X^Z和Y^Z的所有情况算出来,那么事半功倍,枚举 X^Z然后查找Y既可。天才般的想法。#in原创 2017-04-20 14:42:07 · 797 阅读 · 0 评论 -
POJ 3320 (尺取法)
题意: 为了复习课本准备考试,J想用最少的时间看书,当然书很厚,但是有些知识点是重复的,为了能复习全部,并且还能看的页数最少,问最少看几页?方法:尺取法:在找到满足条件的情况下,继续向下移动知道结束。#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>using namesp原创 2016-12-25 21:25:57 · 1097 阅读 · 0 评论 -
POJ 3061 (尺取法,二分法的应用)
题意: n 个数,求出最小的相邻的数之和不小于s。思路: 这里使用尺取法,也就是直接找到一段数,其值和必然大于s,这里应该体会sum的妙用。#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;int sum[100005];int a[100005];原创 2016-12-25 19:31:05 · 333 阅读 · 0 评论 -
POJ 1182(食物链)
题意:汉语题。思路:挑战上边的题,看了很多遍,还是需要理解,暂时可以把每个动物有三种性质,分别判断得出结果。#include#include#includeusing namespace std;const int MAX = 50005;int F[MAX*3];int n,m;int Find(int x){ if(x == F[x]原创 2016-11-23 19:07:19 · 320 阅读 · 0 评论 -
HDU 1558 (并查集+判断线段相交)
题意: 输入每一条边,如果两个边相交则同为一个集合,问题是求某一条边所在集合的边的数目。 很明显的并查集,但是怎么判断边与边的相交呢?这里用到了模板。知道了边相交,那么find 和 merge 便不难了。注意: 1. 用num存储集合边的数目 2. 类的简单使用,edge存储边的起始点 3. Find里面用到了优化#include<cstdio>#include原创 2016-09-16 11:50:55 · 392 阅读 · 0 评论 -
HDU 1829 (性别关系)
题意:给定一系列数对,表示不是是同一种性别,然后不断的给出这样的数对,问有没有性别不对的情况(同性恋)。问题: 1. 怎么用并查集解决问题? 2. 并查集在这道题的作用是什么? 3. 异或运算是做什么?思路: 1. 在这道题中并查集是为异或运算铺路。 2. 在由节点组成的树中根节点发挥作用,它们之间的关系可以由根节点表示。 3. 异原创 2016-09-14 17:06:08 · 351 阅读 · 0 评论 -
HDU 1232 (简单并查集)
很直接的并查集,只需要找到有多少根,就是需要修的路。#include<cstdio>#define Max 1010int root[Max];int union_find(int x){ return x == root[x] ? x : (root[x] = union_find(root[x]));}int main(){// freopen("in.txt","r",s原创 2016-09-14 15:02:33 · 326 阅读 · 0 评论 -
HDU 1272 (并查集)
这道题要求的是每两个点能到达且只有一条路。思考 1. 怎么判断任意两点可以到达? 2. 怎么判断任意两点只有一条路?解决方法: 1. 如果所有路连通,那么所有路只有一个父亲。 2. 任意两点在最开始的时候是不同根,在当前它们有在搜索属于哪个根的时候,如果根相同那么有环。说明从这两个点出发有 两种方式到达其它同根的点。注意: 1. 由于不知道有几个节点,要原创 2016-09-14 14:23:04 · 230 阅读 · 0 评论 -
POJ 2236(简单并查集)
POJ2236 题目大意:有n台电脑,因为某些原因只能在d距离内进行交流,输入n台电脑的坐标判断能否连接。 思路:建立并查集两个基本函数“查找”“合并”,用use数组存储能电脑是否修好。合并的条件是电脑之间距离是否为 #include#include#define M 1010bool use[M];int distance;struct Node{ i原创 2016-07-28 21:25:02 · 491 阅读 · 0 评论 -
POJ 3276 (变形尺取法)
题意: n头牛,现在要求排列整齐并且方向一致F为前,B为向后,现在有一列牛,求出最少 的次数能把牛方向排列一致。每次只能去固定的牛一起转向。思路: 如果是直接暴力,那么太麻烦的有至少O(N^3)的时间复杂度。 最好的思路是由之前的状态确定下一个状态,例如是从左向右遍历,如果是向后那么 这头牛必须要反转.因为反转的个数是固定的所以要记录之前的反转状态,记住这一点,便不难理原创 2016-12-26 22:01:50 · 436 阅读 · 0 评论 -
POJ 3274 (翻转||关灯)
题意: 有M*N的0、1数列,求出怎么反转才能使其全部为零,反转的方式是上下左右受中间 的牵连也会翻转。思路: 题的模型常常被称为关灯问题,也有点和POJ3276的思想雷同,这里是确定第一行的 排列方式就知道了后边的排列方式。知道这种思想,并且知道位运算是关键。#include <iostream>#include <cstdio>#include <cstring>us原创 2016-12-26 22:36:15 · 378 阅读 · 0 评论 -
POJ1064(二分查找)
题意: 给出n个木板,求出能割k个木板的最大长度。思路: 挑战编程有个使用二分查找的方式,能很好的实现 不过要注意的是精度,需要向下取整,又学到一个新的函数,开心。#include<iostream>#include<cstdio>#include<cmath>using namespace std;const int inf = 0x3f3f3f3f;int n,k;dou原创 2016-12-19 20:05:18 · 377 阅读 · 0 评论 -
poj 3111 (最大化平均值)
题意: 给出n个珠宝,现在让选出m个,使得v(和)/m(和)相除得到的数字最大。 输出选择的m个珠宝。**思路: 枚举v/m的最大值,用结构体保存珠宝的编号。输出答案既可。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int原创 2017-04-16 19:00:34 · 465 阅读 · 0 评论 -
POJ 2976 (最大化平均值)
题意: 给出n个题的分数,给定n个二元组(a,b),删除k个二元组, 使得剩下的a元素之和与b元素之和的比率最大(比率最后乘100输出)though: a/b = max(m),可以化简为a-m*b ,当a/b最大的时候a-m*b <= 0,所以 二分m。找到精度足够小的解。#include <iostream>#include <cstdio>#include <cst原创 2017-04-16 18:49:12 · 520 阅读 · 0 评论 -
Hrbust 1530 (二分)
题意: 我现在要举办一个聚会,食物是很多派,有F个人,问题是怎么把现有的派能完整的分 F+1个体积一样的小块。思路: 直接二分体积,不过要判断是否能分成F+1 注意点在于精度,L、R范围的确定,以及eps的精度是否足够。最开始就因为这些 细节而W两次。#include <iostream>#include <cstdio>#include <algorithm>us原创 2017-04-19 15:01:14 · 429 阅读 · 0 评论 -
POJ 3258 (固定划分的最大距离)
题意: 有一条河,两边各看作有一块石头,河中有n块石头,总计n+2块石头,现在要去除 m块石头,怎么去除才能使得剩下的石头最近的距离最大。思路: 二分最小的距离,那么在判断条件的时候如果距离大于mid 时候就当作一个组。 难点在于,当num == m的时候还要继续去寻找。#include <iostream>#include <cstdio>#include <cstri原创 2017-04-13 14:32:17 · 338 阅读 · 0 评论 -
POJ 3273 (最大组最小值)
题意: 有n个花费,现在要分成m组,要求分好后的最大的一组的和尽可能的小。思路: 看到所求的问题肯定都会转不过来弯,其实想一想也很容易想到,m组是一定 要分的,分完之后肯定有一个组的和是最大值,现在我们就二分这个值。两个注意点上下界的问题,可以再输入的过程之中直接得到。判断mid是否可行的思路是找到当前的a[i]是否属于这个组,有个小于的条件,值得学习。 #include <原创 2017-04-13 13:32:16 · 388 阅读 · 0 评论 -
尺取+二分查找
尺取法: 这是一种比较有趣的方法,想吃子一样去解决问题。 现在我只是知道了可以用数组来模拟“尺子”。加油学习!方法是:数组模拟+二分查找说一 下数据的意思,10个数,从中找出和为15的最短子串。105 1 3 5 10 7 4 9 2 815#include <bits/stdc++.h>using namespace std;int main(){ freopen("原创 2017-03-13 20:36:52 · 667 阅读 · 0 评论