摘要:
//用中国剩余定理解决韩信点兵问题#include <stdio.h>long long max,x,m[8],b[8],M[8],n,N;int p[8];int main(){ int i,j,k; for(n=1,i=0; i<8; i++) {scanf("%lld",&m[i]); n=n*m[i];} //读入除数数组,注意n,为所以除数的乘积 /***************检验n和m[]数组***************/ //printf("%lld\n",n); //for(i=0; i<8; i++) 阅读全文
摘要:
并查集一.并查集的两个功能1.查询一个集合中的一个元素(或者说查询某个元素在哪个集合中)2.合并两个集合二.优化1.按集合的思想来看,并查集其实不是一个树形结构,就是一个普通的集合,查询是O(1),合并是O(n),必须扫描所有元素; 树形结构是优化出来的,下面的内容都是树形结构的,集合的那种就不说了,因为我们平时看到的并查集都是树形结构的2.优化主要是两个,一个是查询的优化——压缩路径,一边查询一边修改,这个优化足够强大了。 压缩路径:原本的树形可能是无规则的,最坏的条件是一条链状的,查询时就是O(n),压缩路径的原理很简单,当某一次查询一个元素x的时候,从x回到祖先的路径中所有元素都做 修改 阅读全文
摘要:
并查集裸题,可以用来学习并查集的性质1.并查集判断是否成环,如果一条边的两个点的祖先相同,那么成环2.整个祖先数组中p[i]=i个个数就是连通分量的个数题目要求:1.若没哟普任何边直接输入0 0 要输出Yes2.若成环,No3.不管是否成环,图不连通,No4.注意输入中的点是任意的,编号并不连续,所以要标记哪些点出现在输入中,没有出现在输入中的点不要管#include <cstdio>#include <cstring>#define N 100010int p[N],use[N];int find(int x){ while(x!=p[x]) x=p[x]; ret. 阅读全文
摘要:
纯粹考察并查集,算是一个经典问题;统计一个集合中有多少个元素,然后找到元素个数最多的集合就普通的并查集,就能过了然后另外写了压缩路径,没想到时间没有改变然后再写一个,时间还是没有改变,好吧……………………只要懂基本的并查集的话,代码都不成问题,很裸的并查集而已代码一:纯粹#include <cstdio>#include <cstring>#define N 30000int p[N],c[N];int n,m;int find(int x){ return p[x]==x ? x : p[x]=find(p[x]); }int main(){ int T; scanf 阅读全文