摘要:
题意:给定一个数字串,求最小的分段数m(每段个数按数字窜顺序切割,余数丢弃)求各个段中的最大值之和超过k的最小m是多少分析:先求出m的上界和下界,二分枚举m 之后就是一个区间求最值的问题了,还不会RMQ,只能用线段树求了线段树版#include<iostream>#include<algorithm>#include<queue>#define MAXN 200000+10using namespace std;struct node{ int l,r,maxn;}p[MAXN<<2];int a[MAXN],n;void bulid(int s 阅读全文
摘要:
裸裸的哈弗曼编码,求出哈弗曼编码的路径长度,注意整个字符串为一种字符的情况View Code #include<iostream>#include<queue>#include<algorithm>#include<vector>using namespace std;struct node{ int u,w; node(int a=0,int b=0):u(a),w(b){} bool friend operator <(const node a,const node b)//重载操作符 { return a.w>b.w; }};i 阅读全文
摘要:
题意:给你1~n个城市每个城市有一个球编号与城市编号相同,现在又两种操作1.T X Y 把x球所在城市的所有球转移到y球所在的城市。2.Q X 求出X球所在的城市编号 城市中球的总数 X球移动的次数思路:这题明显的并查集,很好的一道题,其关键在于如何记录球移动次数。当一个球从一个城市移到另一个城市之后,那么“之后”被转移的次数就等于他的直接父节点的转移次数,而经过一次路径压缩之后,实际上他已经被接到根节点后面了,值得注意的一点是,当前,如果一个点是根节点,那么他的转移次数一定是0。View Code #include<iostream>#include<algorithm&g 阅读全文
摘要:
题意:n*m的格子上有一些方块放在某些格子上,一个格子可能有几个方块,用'a'-'z'来表示方块数量。初始的时候可以选择任意空地作为Pusher初始点,Pusher选择一个方向,然后向这个方向前进直到遇到有方块的格子,Pusher把这个格子的方块清除一个,并把它向前推一格(向前不能出界),如果前面一格有方块,那么这些方合起来放在这个格子中。Pusher和有方块的格子之间至少要有一个空地才能推动分析:直接dfs,因为是special judge 找到一组解即可。View Code #include<iostream>#define N 30using 阅读全文
摘要:
题意:对每一个提问,求出第K条线段所在集合的线段数。所以相交的线段属于同一个集合分析:几何+并查集View Code #include<iostream>#include<algorithm>#include<string>#include<math.h>#define MAXN 1000+10 using namespace std;struct Point{ double x,y;};struct seg{ Point a,b;}se[MAXN];int n,m,f[MAXN],r[MAXN];void init(){ for(int i=0 阅读全文
摘要:
题意:在一棵苹果树上,有n个节点,第一天,只有叶节点才有苹果,苹果的数目等于该节点的编号。第二天开始,其他节点开始长苹果,对于非叶节点,只有当所有直接子节点都长了苹果之后才开始长,设它的直接子节点数目为K,则该节点的苹果数等于所有直接字节点苹果数目中的第(K + 1) / 2大。问最后根节点的苹果数目。分析:一开始感觉这题意太朦胧了,研究了半天都没明白。明白题意之后就好办很多了,类似与DP的过程,从根节点开始算,往下搜,再递推回来。用vector实现方便很多View Code #include<iostream>#include<algorithm>#include&l 阅读全文
摘要:
题意:给定n个点,刚进行两种操作,将两个点合并,以及将一个点孤立,问最后点有几堆分析:删除一个点,只是将该点独立起来,或者说将该点从所在集合中脱离,而所在集合的结构不变,若真的将该点从集合中删去,会带来很多不必要的麻烦,所以,可以反而添加一个虚拟的点代替独立出来的点,这样,用一个数组将每一个点都映射到一个虚拟的点上,之后在虚拟的点上面操作即可。当要独立一个点时,只需将该点映射到另一个原先不存在的点即可。之后,统计集合个数有俩种方法,一个是根据集合含有的元素的个数,另一个则是统计根节点的个数。其一#include<iostream>#include<algorithm># 阅读全文
摘要:
题意:题中给的图填上1~8 八个数字,相连的点不能填上连续的数字分析:各种限制条件,直接dfs了View Code #include<iostream>#include<algorithm>#include<math.h>using namespace std;bool g[10][10],fil[10];//g[10][10]记录点与点之间是否相连,fil[10]记录该数字是否已经选过int a[10],ans[10],num;//ans[]保存路径void dfs(int deep,int move[]){ if(deep==8)//选完了 { if(! 阅读全文
摘要:
题意:这题意真的十分费解,看了好久才明白。给定N个数字,产生p个子序列,序列满足:先按长度排列,而且子序列本身是递增的;之后,按子序列中各个数字所在位置排序。最主要的就是判重还有“子序列必须满足递增”具体的解释看代码吧View Code #include<iostream>#include<algorithm>using namespace std;struct node{ int v,pos;}ans[1001];int a[1001],n,p,nnum,total;bool check(int s,int e)//判重,我觉得是这道题目的关键{ for(int i= 阅读全文
摘要:
中文题,题意就不说了不过想不到并查集这样用对于题目中的路,按速度进行排序,这样,如果从第 i 条路到第 j 条路之间的所有路能够让 i 和 j 连通,那么,这就存在一条路,且这条路的舒适度就是 两者的差值。 这样,只要枚举从每一条路开始,向前找到可以使得 起点和终点连通的路的舒适度,就可以找到答案了View Code #include<iostream>#include<algorithm>using namespace std;struct edge{ int u,v,w;}e[1001];int f[201],n,m;bool cmp(edge a,edge b){ 阅读全文